mirror of
https://github.com/Ylianst/MeshAgent
synced 2025-12-18 09:13:14 +00:00
Fixed cleanup logic for sighandler
This commit is contained in:
@@ -646,6 +646,49 @@ duk_ret_t ILibDuktape_ScriptContainer_Process_Finalizer(duk_context *ctx)
|
|||||||
duk_push_int(ctx, exitCode); // [emit][this]['exit'][exitCode]
|
duk_push_int(ctx, exitCode); // [emit][this]['exit'][exitCode]
|
||||||
duk_call_method(ctx, 2);
|
duk_call_method(ctx, 2);
|
||||||
|
|
||||||
|
#ifdef _POSIX
|
||||||
|
struct sigaction action;
|
||||||
|
|
||||||
|
// Unhook SIGCHLD
|
||||||
|
memset(&action, 0, sizeof(action));
|
||||||
|
sigemptyset(&action.sa_mask);
|
||||||
|
action.sa_flags = 0;
|
||||||
|
action.sa_handler = SIG_DFL;
|
||||||
|
if (sigaction(SIGCHLD, NULL, &action) == 0 && action.sa_handler != SIG_DFL)
|
||||||
|
{
|
||||||
|
memset(&action, 0, sizeof(action));
|
||||||
|
sigemptyset(&action.sa_mask);
|
||||||
|
action.sa_flags = 0;
|
||||||
|
action.sa_handler = SIG_DFL;
|
||||||
|
ignore_result(sigaction(SIGCHLD, &action, NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unhook SIGTERM
|
||||||
|
memset(&action, 0, sizeof(action));
|
||||||
|
sigemptyset(&action.sa_mask);
|
||||||
|
action.sa_flags = 0;
|
||||||
|
action.sa_handler = SIG_DFL;
|
||||||
|
if (sigaction(SIGTERM, NULL, &action) == 0 && action.sa_handler != SIG_DFL)
|
||||||
|
{
|
||||||
|
memset(&action, 0, sizeof(action));
|
||||||
|
sigemptyset(&action.sa_mask);
|
||||||
|
action.sa_flags = 0;
|
||||||
|
action.sa_handler = SIG_DFL;
|
||||||
|
ignore_result(sigaction(SIGTERM, &action, NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the Pipes if they exist
|
||||||
|
if (SignalDescriptors[0] != 0)
|
||||||
|
{
|
||||||
|
close(SignalDescriptors[0]);
|
||||||
|
}
|
||||||
|
if (SignalDescriptors[1] != 0)
|
||||||
|
{
|
||||||
|
close(SignalDescriptors[1]);
|
||||||
|
}
|
||||||
|
SignalDescriptors[0] = SignalDescriptors[1] = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (link != NULL)
|
if (link != NULL)
|
||||||
{
|
{
|
||||||
((void**)link->ExtraMemoryPtr)[0] = NULL;
|
((void**)link->ExtraMemoryPtr)[0] = NULL;
|
||||||
@@ -948,18 +991,6 @@ void ILibDuktape_ScriptContainer_Process_SignalListener(int signum)
|
|||||||
ignore_result(write(SignalDescriptors[1], &signum, sizeof(signum)));
|
ignore_result(write(SignalDescriptors[1], &signum, sizeof(signum)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void ILibDuktape_ScriptContainer_Process_SignalListener_Destroy(void *object)
|
|
||||||
{
|
|
||||||
if (SignalDescriptors[0] != 0)
|
|
||||||
{
|
|
||||||
close(SignalDescriptors[0]);
|
|
||||||
}
|
|
||||||
if (SignalDescriptors[1] != 0)
|
|
||||||
{
|
|
||||||
close(SignalDescriptors[1]);
|
|
||||||
}
|
|
||||||
SignalDescriptors[0] = SignalDescriptors[1] = 0;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ILibDuktape_ScriptContainer_Process_SIGTERM_Hook(ILibDuktape_EventEmitter *sender, char *eventName, void *hookedCallback)
|
void ILibDuktape_ScriptContainer_Process_SIGTERM_Hook(ILibDuktape_EventEmitter *sender, char *eventName, void *hookedCallback)
|
||||||
@@ -969,7 +1000,12 @@ void ILibDuktape_ScriptContainer_Process_SIGTERM_Hook(ILibDuktape_EventEmitter *
|
|||||||
{
|
{
|
||||||
// We are the first
|
// We are the first
|
||||||
#ifdef _POSIX
|
#ifdef _POSIX
|
||||||
signal(SIGTERM, ILibDuktape_ScriptContainer_Process_SignalListener);
|
struct sigaction action;
|
||||||
|
memset(&action, 0, sizeof(action));
|
||||||
|
action.sa_handler = ILibDuktape_ScriptContainer_Process_SignalListener;
|
||||||
|
sigemptyset(&action.sa_mask);
|
||||||
|
action.sa_flags = 0;
|
||||||
|
if (sigaction(SIGTERM, &action, NULL) == 0) {}
|
||||||
#else
|
#else
|
||||||
UNREFERENCED_PARAMETER(eventName);
|
UNREFERENCED_PARAMETER(eventName);
|
||||||
UNREFERENCED_PARAMETER(hookedCallback);
|
UNREFERENCED_PARAMETER(hookedCallback);
|
||||||
@@ -983,7 +1019,12 @@ void ILibDuktape_ScriptContainer_Process_SIGCHLD_Hook(ILibDuktape_EventEmitter *
|
|||||||
{
|
{
|
||||||
// We are the first
|
// We are the first
|
||||||
#ifdef _POSIX
|
#ifdef _POSIX
|
||||||
signal(SIGCHLD, ILibDuktape_ScriptContainer_Process_SignalListener);
|
struct sigaction action;
|
||||||
|
memset(&action, 0, sizeof(action));
|
||||||
|
action.sa_handler = ILibDuktape_ScriptContainer_Process_SignalListener;
|
||||||
|
sigemptyset(&action.sa_mask);
|
||||||
|
action.sa_flags = 0;
|
||||||
|
if (sigaction(SIGCHLD, &action, NULL) == 0) {}
|
||||||
#else
|
#else
|
||||||
UNREFERENCED_PARAMETER(eventName);
|
UNREFERENCED_PARAMETER(eventName);
|
||||||
UNREFERENCED_PARAMETER(hookedCallback);
|
UNREFERENCED_PARAMETER(hookedCallback);
|
||||||
@@ -1089,6 +1130,34 @@ duk_ret_t ILibDuktape_ScriptContainer_Process_rlimit_getter(duk_context *ctx)
|
|||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
duk_ret_t ILibDuktape_ScriptContainer_removeListenerSink(duk_context *ctx)
|
||||||
|
{
|
||||||
|
#ifdef _POSIX
|
||||||
|
struct sigaction action;
|
||||||
|
char *name = duk_require_string(ctx, 0);
|
||||||
|
duk_push_this(ctx); // [process]
|
||||||
|
|
||||||
|
if (strcmp(name, "SIGCHLD") == 0 && ILibDuktape_EventEmitter_HasListenersEx(ctx, -1, "SIGCHLD")==0)
|
||||||
|
{
|
||||||
|
// No more listeners, so we can unhook the sighandler
|
||||||
|
memset(&action, 0, sizeof(action));
|
||||||
|
sigemptyset(&action.sa_mask);
|
||||||
|
action.sa_flags = 0;
|
||||||
|
action.sa_handler = SIG_DFL;
|
||||||
|
if (sigaction(SIGCHLD, &action, NULL) == 0) {}
|
||||||
|
}
|
||||||
|
if (strcmp(name, "SIGTERM") == 0 && ILibDuktape_EventEmitter_HasListenersEx(ctx, -1, "SIGTERM") == 0)
|
||||||
|
{
|
||||||
|
// No more listeners, so we can unhook the sighandler
|
||||||
|
memset(&action, 0, sizeof(action));
|
||||||
|
sigemptyset(&action.sa_mask);
|
||||||
|
action.sa_flags = 0;
|
||||||
|
action.sa_handler = SIG_DFL;
|
||||||
|
if (sigaction(SIGTERM, &action, NULL) == 0) {}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList)
|
void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList)
|
||||||
{
|
{
|
||||||
@@ -1262,6 +1331,7 @@ void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList)
|
|||||||
ILibDuktape_EventEmitter_CreateEventEx(emitter, "SIGCHLD");
|
ILibDuktape_EventEmitter_CreateEventEx(emitter, "SIGCHLD");
|
||||||
ILibDuktape_EventEmitter_AddHook(emitter, "SIGTERM", ILibDuktape_ScriptContainer_Process_SIGTERM_Hook);
|
ILibDuktape_EventEmitter_AddHook(emitter, "SIGTERM", ILibDuktape_ScriptContainer_Process_SIGTERM_Hook);
|
||||||
ILibDuktape_EventEmitter_AddHook(emitter, "SIGCHLD", ILibDuktape_ScriptContainer_Process_SIGCHLD_Hook);
|
ILibDuktape_EventEmitter_AddHook(emitter, "SIGCHLD", ILibDuktape_ScriptContainer_Process_SIGCHLD_Hook);
|
||||||
|
ILibDuktape_EventEmitter_AddOnEx(ctx, -1, "removeListener", ILibDuktape_ScriptContainer_removeListenerSink);
|
||||||
|
|
||||||
ILibDuktape_CreateEventWithGetter(ctx, "argv0", ILibDuktape_ScriptContainer_Process_Argv0);
|
ILibDuktape_CreateEventWithGetter(ctx, "argv0", ILibDuktape_ScriptContainer_Process_Argv0);
|
||||||
duk_push_int(ctx, 1);
|
duk_push_int(ctx, 1);
|
||||||
@@ -1302,7 +1372,6 @@ void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList)
|
|||||||
k->MetaData = "Signal_Listener";
|
k->MetaData = "Signal_Listener";
|
||||||
k->PreSelectHandler = ILibDuktape_ScriptContainer_Process_SignalListener_PreSelect;
|
k->PreSelectHandler = ILibDuktape_ScriptContainer_Process_SignalListener_PreSelect;
|
||||||
k->PostSelectHandler = ILibDuktape_ScriptContainer_Process_SignalListener_PostSelect;
|
k->PostSelectHandler = ILibDuktape_ScriptContainer_Process_SignalListener_PostSelect;
|
||||||
k->DestroyHandler = ILibDuktape_ScriptContainer_Process_SignalListener_Destroy;
|
|
||||||
ILibAddToChain(chain, k);
|
ILibAddToChain(chain, k);
|
||||||
|
|
||||||
duk_push_heapptr(ctx, emitter->object); // [process]
|
duk_push_heapptr(ctx, emitter->object); // [process]
|
||||||
|
|||||||
Reference in New Issue
Block a user