Skip to content

Commit

Permalink
fix deadlock condition varaible use in netfabb wrapper (#2583)
Browse files Browse the repository at this point in the history
(cherry picked from commit prusa3d/PrusaSlicer@04ac99a)

Co-authored-by: PavelMikus <[email protected]>
  • Loading branch information
Noisyfox and Godrak authored Nov 2, 2023
1 parent d574816 commit fcb2891
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions src/slic3r/Utils/FixModelByWin10.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
///|/ Copyright (c) Prusa Research 2018 - 2023 Oleksandra Iushchenko @YuSanka, Lukáš Matěna @lukasmatena, Pavel Mikuš @Godrak, Enrico Turri @enricoturri1966, Vojtěch Bubník @bubnikv
///|/
///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher
///|/
#ifdef HAS_WIN10SDK

#ifndef NOMINMAX
Expand Down Expand Up @@ -323,9 +327,8 @@ class RepairCanceledException : public std::exception {
// fix_result containes a message if fixing failed
bool fix_model_by_win10_sdk_gui(ModelObject &model_object, int volume_idx, GUI::ProgressDialog& progress_dialog, const wxString& msg_header, std::string& fix_result)
{
std::mutex mutex;
std::condition_variable condition;
std::unique_lock<std::mutex> lock(mutex);
std::mutex mtx;
std::condition_variable condition;
struct Progress {
std::string message;
int percent = 0;
Expand All @@ -344,8 +347,8 @@ bool fix_model_by_win10_sdk_gui(ModelObject &model_object, int volume_idx, GUI::
// (It seems like wxWidgets initialize the COM contex as single threaded and we need a multi-threaded context).
bool success = false;
size_t ivolume = 0;
auto on_progress = [&mutex, &condition, &ivolume, &volumes, &progress](const char *msg, unsigned prcnt) {
std::lock_guard<std::mutex> lk(mutex);
auto on_progress = [&mtx, &condition, &ivolume, &volumes, &progress](const char *msg, unsigned prcnt) {
std::unique_lock<std::mutex> lock(mtx);
progress.message = msg;
progress.percent = (int)floor((float(prcnt) + float(ivolume) * 100.f) / float(volumes.size()));
progress.updated = true;
Expand Down Expand Up @@ -422,6 +425,7 @@ bool fix_model_by_win10_sdk_gui(ModelObject &model_object, int volume_idx, GUI::
}
});
while (! finished) {
std::unique_lock<std::mutex> lock(mtx);
condition.wait_for(lock, std::chrono::milliseconds(250), [&progress]{ return progress.updated; });
// decrease progress.percent value to avoid closing of the progress dialog
if (!progress_dialog.Update(progress.percent-1, msg_header + _(progress.message)))
Expand Down

0 comments on commit fcb2891

Please sign in to comment.