On OSX, we use boost::process::spawn() to launch new instances of PrusaSlicer from another PrusaSlicer.
boost::process::spawn() sets SIGCHLD to SIGIGN for the child process, thus if a child PrusaSlicer spawns another subprocess and the subrocess dies, the child PrusaSlicer will not receive information on end of subprocess (posix waitpid() call will always fail). https://jmmv.dev/2008/10/boostprocess-and-sigchld.html The child instance of PrusaSlicer has to reset SIGCHLD to its default, so that posix waitpid() and similar continue to work. Fixes #5507
This commit is contained in:
parent
71808dc006
commit
2b02747ec5
2 changed files with 21 additions and 6 deletions
|
@ -16,11 +16,26 @@
|
|||
#include <boost/nowide/iostream.hpp>
|
||||
#include <boost/nowide/convert.hpp>
|
||||
|
||||
#if __APPLE__
|
||||
#include <signal.h>
|
||||
#endif // __APPLE__
|
||||
|
||||
namespace Slic3r {
|
||||
namespace GUI {
|
||||
|
||||
int GUI_Run(GUI_InitParams ¶ms)
|
||||
{
|
||||
#if __APPLE__
|
||||
// On OSX, we use boost::process::spawn() to launch new instances of PrusaSlicer from another PrusaSlicer.
|
||||
// boost::process::spawn() sets SIGCHLD to SIGIGN for the child process, thus if a child PrusaSlicer spawns another
|
||||
// subprocess and the subrocess dies, the child PrusaSlicer will not receive information on end of subprocess
|
||||
// (posix waitpid() call will always fail).
|
||||
// https://jmmv.dev/2008/10/boostprocess-and-sigchld.html
|
||||
// The child instance of PrusaSlicer has to reset SIGCHLD to its default, so that posix waitpid() and similar continue to work.
|
||||
// See GH issue #5507
|
||||
signal(SIGCHLD, SIG_DFL);
|
||||
#endif // __APPLE__
|
||||
|
||||
try {
|
||||
GUI::GUI_App* gui = new GUI::GUI_App(params.start_as_gcodeviewer ? GUI::GUI_App::EAppMode::GCodeViewer : GUI::GUI_App::EAppMode::Editor);
|
||||
if (gui->get_app_mode() != GUI::GUI_App::EAppMode::GCodeViewer) {
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
// For starting another PrusaSlicer instance on OSX.
|
||||
// Fails to compile on Windows on the build server.
|
||||
#ifdef __APPLE__
|
||||
#include <signal.h>
|
||||
#include <boost/process/spawn.hpp>
|
||||
#include <boost/process/args.hpp>
|
||||
#endif
|
||||
|
@ -79,11 +78,12 @@ static void start_new_slicer_or_gcodeviewer(const NewSlicerInstanceType instance
|
|||
if (instance_type == NewSlicerInstanceType::Slicer && single_instance)
|
||||
args.emplace_back("--single-instance");
|
||||
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);
|
||||
// boost::process::spawn() sets SIGCHLD to SIGIGN for the child process, thus if a child PrusaSlicer spawns another
|
||||
// subprocess and the subrocess dies, the child PrusaSlicer will not receive information on end of subprocess
|
||||
// (posix waitpid() call will always fail).
|
||||
// https://jmmv.dev/2008/10/boostprocess-and-sigchld.html
|
||||
// The child instance of PrusaSlicer has to reset SIGCHLD to its default, so that posix waitpid() and similar continue to work.
|
||||
// See GH issue #5507
|
||||
}
|
||||
catch (const std::exception& ex) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Failed to spawn a new slicer \"" << bin_path.string() << "\": " << ex.what();
|
||||
|
|
Loading…
Reference in a new issue