boost::process::spawn() sets SIGINT to SIGIGN, which collides with boost::process waiting for a child to finish!

https://jmmv.dev/2008/10/boostprocess-and-sigchld.html
Thus reset the SIGINT to its default, so that posix waitpid() and similar continue to work.
Fixes Crash on Eject in Second Instance on macOS #5507
This commit is contained in:
Vojtech Bubnik 2021-01-07 17:38:56 +01:00
parent 2ad4447035
commit 71808dc006

View File

@ -17,6 +17,7 @@
// For starting another PrusaSlicer instance on OSX. // For starting another PrusaSlicer instance on OSX.
// Fails to compile on Windows on the build server. // Fails to compile on Windows on the build server.
#ifdef __APPLE__ #ifdef __APPLE__
#include <signal.h>
#include <boost/process/spawn.hpp> #include <boost/process/spawn.hpp>
#include <boost/process/args.hpp> #include <boost/process/args.hpp>
#endif #endif
@ -78,6 +79,11 @@ static void start_new_slicer_or_gcodeviewer(const NewSlicerInstanceType instance
if (instance_type == NewSlicerInstanceType::Slicer && single_instance) if (instance_type == NewSlicerInstanceType::Slicer && single_instance)
args.emplace_back("--single-instance"); args.emplace_back("--single-instance");
boost::process::spawn(bin_path, args); boost::process::spawn(bin_path, args);
// boost::process::spawn() sets SIGINT to SIGIGN, which collides with boost::process waiting for a child to finish!
// https://jmmv.dev/2008/10/boostprocess-and-sigchld.html
// Thus reset the SIGINT to its default, so that posix waitpid() and similar continue to work.
// Fixes Crash on Eject in Second Instance on macOS #5507
signal(SIGINT, SIG_DFL);
} }
catch (const std::exception& ex) { catch (const std::exception& ex) {
BOOST_LOG_TRIVIAL(error) << "Failed to spawn a new slicer \"" << bin_path.string() << "\": " << ex.what(); BOOST_LOG_TRIVIAL(error) << "Failed to spawn a new slicer \"" << bin_path.string() << "\": " << ex.what();