From 720ddf73daeefe40eccfbda51a4c117d2807d09c Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 27 Apr 2023 14:52:26 +0200 Subject: [PATCH] Fixed mysterious ASAN crash in conflict detection code --- src/libslic3r/GCode/ConflictChecker.cpp | 16 ++++++++-------- src/libslic3r/GCode/ConflictChecker.hpp | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/GCode/ConflictChecker.cpp b/src/libslic3r/GCode/ConflictChecker.cpp index f8fed0efa..f3d3f49fe 100644 --- a/src/libslic3r/GCode/ConflictChecker.cpp +++ b/src/libslic3r/GCode/ConflictChecker.cpp @@ -91,19 +91,18 @@ inline Grids line_rasterization(const Line &line, int64_t xdist = RasteXDistance void LinesBucketQueue::emplace_back_bucket(std::vector &&paths, const void *objPtr, Point offset) { - auto oldSize = _buckets.capacity(); if (_objsPtrToId.find(objPtr) == _objsPtrToId.end()) { _objsPtrToId.insert({objPtr, _objsPtrToId.size()}); _idToObjsPtr.insert({_objsPtrToId.size() - 1, objPtr}); } _buckets.emplace_back(std::move(paths), _objsPtrToId[objPtr], offset); - _pq.push(&_buckets.back()); - auto newSize = _buckets.capacity(); - if (oldSize != newSize) { // pointers change - decltype(_pq) newQueue; - for (LinesBucket &bucket : _buckets) { newQueue.push(&bucket); } - std::swap(_pq, newQueue); - } +} + +void LinesBucketQueue::build_queue() +{ + assert(_pq.empty); + for (LinesBucket &bucket : _buckets) + _pq.push(&bucket); } double LinesBucketQueue::removeLowests() @@ -218,6 +217,7 @@ ConflictResultOpt ConflictChecker::find_inter_of_lines_in_diff_objs(PrintObjectP conflictQueue.emplace_back_bucket(std::move(layers.first), obj, obj->instances().front().shift); conflictQueue.emplace_back_bucket(std::move(layers.second), obj, obj->instances().front().shift); } + conflictQueue.build_queue(); std::vector layersLines; std::vector heights; diff --git a/src/libslic3r/GCode/ConflictChecker.hpp b/src/libslic3r/GCode/ConflictChecker.hpp index cc21bc816..069e553b4 100644 --- a/src/libslic3r/GCode/ConflictChecker.hpp +++ b/src/libslic3r/GCode/ConflictChecker.hpp @@ -78,6 +78,7 @@ private: public: void emplace_back_bucket(std::vector &&paths, const void *objPtr, Point offset); + void build_queue(); bool valid() const { return _pq.empty() == false; } const void *idToObjsPtr(int id) {