Signed-off-by: falkTX <falktx@falktx.com>tags/v2.2.0-RC1
@@ -2295,6 +2295,7 @@ const char* carla_get_host_osc_url_udp(CarlaHostHandle handle) | |||||
#include "CarlaMacUtils.cpp" | #include "CarlaMacUtils.cpp" | ||||
#include "CarlaPatchbayUtils.cpp" | #include "CarlaPatchbayUtils.cpp" | ||||
#include "CarlaPipeUtils.cpp" | #include "CarlaPipeUtils.cpp" | ||||
#include "CarlaProcessUtils.cpp" | |||||
#include "CarlaStateUtils.cpp" | #include "CarlaStateUtils.cpp" | ||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- |
@@ -2751,6 +2751,7 @@ CARLA_BACKEND_END_NAMESPACE | |||||
#include "CarlaMacUtils.cpp" | #include "CarlaMacUtils.cpp" | ||||
#include "CarlaPatchbayUtils.cpp" | #include "CarlaPatchbayUtils.cpp" | ||||
#include "CarlaPipeUtils.cpp" | #include "CarlaPipeUtils.cpp" | ||||
#include "CarlaProcessUtils.cpp" | |||||
#include "CarlaStateUtils.cpp" | #include "CarlaStateUtils.cpp" | ||||
#endif | #endif | ||||
@@ -39,3 +39,7 @@ void carla_set_process_name(const char* name) | |||||
} | } | ||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
#include "CarlaProcessUtils.cpp" | |||||
// ------------------------------------------------------------------------------------------------------------------- |
@@ -344,5 +344,6 @@ void CarlaBridgeFormat::exec(const bool showUI) | |||||
CARLA_BRIDGE_UI_END_NAMESPACE | CARLA_BRIDGE_UI_END_NAMESPACE | ||||
#include "CarlaPipeUtils.cpp" | #include "CarlaPipeUtils.cpp" | ||||
#include "CarlaProcessUtils.cpp" | |||||
// --------------------------------------------------------------------- | // --------------------------------------------------------------------- |
@@ -1395,6 +1395,7 @@ pthread_t jack_client_thread_id(jack_client_t* client) | |||||
#include "jackbridge/JackBridge2.cpp" | #include "jackbridge/JackBridge2.cpp" | ||||
#include "CarlaBridgeUtils.cpp" | #include "CarlaBridgeUtils.cpp" | ||||
#include "CarlaProcessUtils.cpp" | |||||
// --------------------------------------------------------------------------------------------------------------------- | // --------------------------------------------------------------------------------------------------------------------- | ||||
// TODO | // TODO | ||||
@@ -0,0 +1,105 @@ | |||||
/* | |||||
* Carla process utils | |||||
* Copyright (C) 2019-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU General Public License as | |||||
* published by the Free Software Foundation; either version 2 of | |||||
* the License, or any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU General Public License for more details. | |||||
* | |||||
* For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||||
*/ | |||||
#include "CarlaProcessUtils.hpp" | |||||
#ifdef CARLA_OS_LINUX | |||||
# include <sys/prctl.h> | |||||
#endif | |||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
// process functions | |||||
void carla_setProcessName(const char* const name) noexcept | |||||
{ | |||||
CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',); | |||||
#ifdef CARLA_OS_LINUX | |||||
::prctl(PR_SET_NAME, name, 0, 0, 0); | |||||
#endif | |||||
} | |||||
void carla_terminateProcessOnParentExit(const bool kill) noexcept | |||||
{ | |||||
#ifdef CARLA_OS_LINUX | |||||
// | |||||
::prctl(PR_SET_PDEATHSIG, kill ? SIGKILL : SIGTERM); | |||||
// TODO, osx version too, see https://stackoverflow.com/questions/284325/how-to-make-child-process-die-after-parent-exits | |||||
#endif | |||||
// maybe unused | |||||
return; (void)kill; | |||||
} | |||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
// process utility classes | |||||
ScopedAbortCatcher::ScopedAbortCatcher() | |||||
{ | |||||
s_triggered = false; | |||||
#ifndef CARLA_OS_WIN | |||||
s_oldsig = ::setjmp(s_env) == 0 | |||||
? std::signal(SIGABRT, sig_handler) | |||||
: nullptr; | |||||
#endif | |||||
} | |||||
ScopedAbortCatcher::~ScopedAbortCatcher() | |||||
{ | |||||
#ifndef CARLA_OS_WIN | |||||
if (! s_triggered) | |||||
std::signal(SIGABRT, s_oldsig); | |||||
#endif | |||||
} | |||||
bool ScopedAbortCatcher::s_triggered = false; | |||||
#ifndef CARLA_OS_WIN | |||||
jmp_buf ScopedAbortCatcher::s_env; | |||||
sig_t ScopedAbortCatcher::s_oldsig; | |||||
void ScopedAbortCatcher::sig_handler(const int signum) | |||||
{ | |||||
CARLA_SAFE_ASSERT_INT2_RETURN(signum == SIGABRT, signum, SIGABRT,); | |||||
s_triggered = true; | |||||
std::signal(signum, s_oldsig); | |||||
std::longjmp(s_env, 1); | |||||
} | |||||
#endif | |||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
CarlaSignalRestorer::CarlaSignalRestorer() | |||||
{ | |||||
#ifndef CARLA_OS_WIN | |||||
carla_zeroStructs(sigs, 16); | |||||
for (int i=0; i < 16; ++i) | |||||
::sigaction(i+1, nullptr, &sigs[i]); | |||||
#endif | |||||
} | |||||
CarlaSignalRestorer::~CarlaSignalRestorer() | |||||
{ | |||||
#ifndef CARLA_OS_WIN | |||||
for (int i=0; i < 16; ++i) | |||||
::sigaction(i+1, &sigs[i], nullptr); | |||||
#endif | |||||
} | |||||
// -------------------------------------------------------------------------------------------------------------------- |
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla process utils | * Carla process utils | ||||
* Copyright (C) 2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2019-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -21,10 +21,8 @@ | |||||
#include "CarlaUtils.hpp" | #include "CarlaUtils.hpp" | ||||
#ifndef CARLA_OS_WIN | #ifndef CARLA_OS_WIN | ||||
# include <signal.h> | |||||
#endif | |||||
#ifdef CARLA_OS_LINUX | |||||
# include <sys/prctl.h> | |||||
# include <csignal> | |||||
# include <csetjmp> | |||||
#endif | #endif | ||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
@@ -33,54 +31,48 @@ | |||||
/* | /* | ||||
* Set current process name. | * Set current process name. | ||||
*/ | */ | ||||
static inline | |||||
void carla_setProcessName(const char* const name) noexcept | |||||
{ | |||||
CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',); | |||||
#ifdef CARLA_OS_LINUX | |||||
::prctl(PR_SET_NAME, name, 0, 0, 0); | |||||
#endif | |||||
} | |||||
void carla_setProcessName(const char* const name) noexcept; | |||||
/* | /* | ||||
* Set flag to automatically terminate ourselves if parent process dies. | * Set flag to automatically terminate ourselves if parent process dies. | ||||
*/ | */ | ||||
static inline | |||||
void carla_terminateProcessOnParentExit(const bool kill) noexcept | |||||
{ | |||||
#ifdef CARLA_OS_LINUX | |||||
// | |||||
::prctl(PR_SET_PDEATHSIG, kill ? SIGKILL : SIGTERM); | |||||
// TODO, osx version too, see https://stackoverflow.com/questions/284325/how-to-make-child-process-die-after-parent-exits | |||||
#endif | |||||
// maybe unused | |||||
return; (void)kill; | |||||
} | |||||
void carla_terminateProcessOnParentExit(const bool kill) noexcept; | |||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
// process functions | |||||
// process utility classes | |||||
class CarlaSignalRestorer { | |||||
/* | |||||
* Catches SIGABRT for a function scope. | |||||
*/ | |||||
class ScopedAbortCatcher { | |||||
public: | public: | ||||
CarlaSignalRestorer() | |||||
{ | |||||
#ifndef CARLA_OS_WIN | |||||
carla_zeroStructs(sigs, 16); | |||||
ScopedAbortCatcher(); | |||||
~ScopedAbortCatcher(); | |||||
for (int i=0; i < 16; ++i) | |||||
::sigaction(i+1, nullptr, &sigs[i]); | |||||
#endif | |||||
} | |||||
inline bool wasTriggered() const | |||||
{ | |||||
return s_triggered; | |||||
} | |||||
~CarlaSignalRestorer() | |||||
{ | |||||
private: | |||||
static bool s_triggered; | |||||
#ifndef CARLA_OS_WIN | #ifndef CARLA_OS_WIN | ||||
for (int i=0; i < 16; ++i) | |||||
::sigaction(i+1, &sigs[i], nullptr); | |||||
static jmp_buf s_env; | |||||
static sig_t s_oldsig; | |||||
static void sig_handler(const int signum); | |||||
#endif | #endif | ||||
} | |||||
CARLA_DECLARE_NON_COPY_CLASS(ScopedAbortCatcher) | |||||
CARLA_PREVENT_HEAP_ALLOCATION | |||||
}; | |||||
/* | |||||
* Store and restore all signal handlers for a function scope. | |||||
*/ | |||||
class CarlaSignalRestorer { | |||||
public: | |||||
CarlaSignalRestorer(); | |||||
~CarlaSignalRestorer(); | |||||
private: | private: | ||||
#ifndef CARLA_OS_WIN | #ifndef CARLA_OS_WIN | ||||