From 501e73913c5a645f5e307df73d504bf4beda58d9 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 21 Jun 2023 09:58:46 +0800 Subject: [PATCH] FIX: empty layer replacement may crash When there are multiple empty layers needs to be replaced, error_msg is assigned multiple times simutaneously by tbb, which causes problem. Jira: STUDIO-3320 Change-Id: I52a48c9fe284d15aeb8e4e9e5d1db7e0c3321ad6 (cherry picked from commit fba54c063637a1bab4d835e2e5f8558b2affa4e6) --- src/libslic3r/PrintObjectSlice.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/PrintObjectSlice.cpp b/src/libslic3r/PrintObjectSlice.cpp index db4d9f33b..11b9f870d 100644 --- a/src/libslic3r/PrintObjectSlice.cpp +++ b/src/libslic3r/PrintObjectSlice.cpp @@ -675,9 +675,10 @@ std::string fix_slicing_errors(PrintObject* object, LayerPtrs &layers, const std } BOOST_LOG_TRIVIAL(debug) << "Slicing objects - fixing slicing errors in parallel - begin"; + std::atomic is_replaced = false; tbb::parallel_for( tbb::blocked_range(0, buggy_layers.size()), - [&layers, &throw_if_canceled, &buggy_layers, &error_msg](const tbb::blocked_range& range) { + [&layers, &throw_if_canceled, &buggy_layers, &is_replaced](const tbb::blocked_range& range) { for (size_t buggy_layer_idx = range.begin(); buggy_layer_idx < range.end(); ++ buggy_layer_idx) { throw_if_canceled(); size_t idx_layer = buggy_layers[buggy_layer_idx]; @@ -724,7 +725,7 @@ std::string fix_slicing_errors(PrintObject* object, LayerPtrs &layers, const std } if (!expolys.empty()) { //BBS - error_msg = L("Empty layers around bottom are replaced by nearest normal layers."); + is_replaced = true; layerm->slices.set(union_ex(expolys), stInternal); } } @@ -735,6 +736,9 @@ std::string fix_slicing_errors(PrintObject* object, LayerPtrs &layers, const std throw_if_canceled(); BOOST_LOG_TRIVIAL(debug) << "Slicing objects - fixing slicing errors in parallel - end"; + if(is_replaced) + error_msg = L("Empty layers around bottom are replaced by nearest normal layers."); + // remove empty layers from bottom while (! layers.empty() && (layers.front()->lslices.empty() || layers.front()->empty())) { delete layers.front();