1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-15 07:43:50 +00:00

1. updated process.kill() to support optional signals

2. added 'SIGCHLD'
This commit is contained in:
Bryan Roe
2019-10-18 17:37:48 -07:00
parent 1bd4cb3131
commit 8eb3bd76e4

View File

@@ -830,8 +830,27 @@ duk_ret_t ILibDuktape_ScriptContainer_Process_Kill(duk_context *ctx)
duk_eval_string(ctx, ILibScratchPad); // [child_process]
}
#else
kill((pid_t)pid, SIGKILL);
int s = SIGTERM;
if (duk_is_string(ctx, 1))
{
duk_push_this(ctx); // [process]
duk_get_prop_string(ctx, -1, "SIGTABLE"); // [process][table]
duk_dup(ctx, 1); // [process][table][key]
if (duk_get_prop(ctx, -2) != 0) // [process][table][value]
{
s = duk_get_int(ctx, -1);
}
}
else if (duk_is_number(ctx, 1))
{
s = duk_require_int(ctx, 1);
}
kill((pid_t)pid, s);
#endif
return(0);
}
duk_ret_t ILibDuktape_Process_cwd(duk_context *ctx)
@@ -876,6 +895,11 @@ void ILibDuktape_ScriptContainer_Process_SignalListener_PostSelect(void* object,
if (duk_pcall_method(ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "Error Emitting SIGTERM: "); }
duk_pop(ctx);
break;
case SIGCHLD:
ILibDuktape_EventEmitter_SetupEmit(ctx, h, "SIGCHLD");
if (duk_pcall_method(ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "Error Emitting SIGCHLD: "); }
duk_pop(ctx);
break;
default:
break;
}
@@ -926,7 +950,20 @@ void ILibDuktape_ScriptContainer_Process_SIGTERM_Hook(ILibDuktape_EventEmitter *
UNREFERENCED_PARAMETER(hookedCallback);
#endif
}
}
void ILibDuktape_ScriptContainer_Process_SIGCHLD_Hook(ILibDuktape_EventEmitter *sender, char *eventName, void *hookedCallback)
{
int listenerCount = ILibDuktape_EventEmitter_HasListeners2(sender, "SIGCHLD", 0);
if (listenerCount == 0)
{
// We are the first
#ifdef _POSIX
signal(SIGCHLD, ILibDuktape_ScriptContainer_Process_SignalListener);
#else
UNREFERENCED_PARAMETER(eventName);
UNREFERENCED_PARAMETER(hookedCallback);
#endif
}
}
duk_ret_t ILibDuktape_Process_setenv(duk_context *ctx)
{
@@ -1046,6 +1083,42 @@ void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList)
(int[]) {9, 4, 0, 2, 1, 10, 8, 12, 13, 7, 6, 5, 14, 11, 3}, 15);
duk_put_prop_string(ctx, -2, "RLIMITS");
#endif
duk_push_object(ctx);
duk_push_int(ctx, 0); duk_put_prop_string(ctx, -2, "UNKNOWN" );
duk_push_int(ctx, 1); duk_put_prop_string(ctx, -2, "SIGHUP" );
duk_push_int(ctx, 2); duk_put_prop_string(ctx, -2, "SIGINT" );
duk_push_int(ctx, 3); duk_put_prop_string(ctx, -2, "SIGQUIT" );
duk_push_int(ctx, 4); duk_put_prop_string(ctx, -2, "SIGILL" );
duk_push_int(ctx, 5); duk_put_prop_string(ctx, -2, "SIGTRAP" );
duk_push_int(ctx, 6); duk_put_prop_string(ctx, -2, "SIGABRT" );
duk_push_int(ctx, 7); duk_put_prop_string(ctx, -2, "SIGBUS" );
duk_push_int(ctx, 8); duk_put_prop_string(ctx, -2, "SIGFPE" );
duk_push_int(ctx, 9); duk_put_prop_string(ctx, -2, "SIGKILL" );
duk_push_int(ctx, 10); duk_put_prop_string(ctx, -2, "SIGUSR1" );
duk_push_int(ctx, 11); duk_put_prop_string(ctx, -2, "SIGEGV" );
duk_push_int(ctx, 12); duk_put_prop_string(ctx, -2, "SIGUSR2" );
duk_push_int(ctx, 13); duk_put_prop_string(ctx, -2, "SIGPIPE" );
duk_push_int(ctx, 14); duk_put_prop_string(ctx, -2, "SIGALRM" );
duk_push_int(ctx, 15); duk_put_prop_string(ctx, -2, "SIGTERM" );
duk_push_int(ctx, 16); duk_put_prop_string(ctx, -2, "SIGSTKFLT");
duk_push_int(ctx, 17); duk_put_prop_string(ctx, -2, "SIGCHLD" );
duk_push_int(ctx, 18); duk_put_prop_string(ctx, -2, "SIGCONT" );
duk_push_int(ctx, 19); duk_put_prop_string(ctx, -2, "SIGSTOP" );
duk_push_int(ctx, 20); duk_put_prop_string(ctx, -2, "SIGTSTP" );
duk_push_int(ctx, 21); duk_put_prop_string(ctx, -2, "SIGTTIN" );
duk_push_int(ctx, 22); duk_put_prop_string(ctx, -2, "SIGTTOU" );
duk_push_int(ctx, 23); duk_put_prop_string(ctx, -2, "SIGURG" );
duk_push_int(ctx, 24); duk_put_prop_string(ctx, -2, "SIGXCPU" );
duk_push_int(ctx, 25); duk_put_prop_string(ctx, -2, "SIGXFSZ" );
duk_push_int(ctx, 26); duk_put_prop_string(ctx, -2, "SIGVTALRM");
duk_push_int(ctx, 27); duk_put_prop_string(ctx, -2, "SIGPROF" );
duk_push_int(ctx, 28); duk_put_prop_string(ctx, -2, "SIGWINCH" );
duk_push_int(ctx, 29); duk_put_prop_string(ctx, -2, "SIGIO" );
duk_push_int(ctx, 29); duk_put_prop_string(ctx, -2, "SIGPOLL" );
duk_push_int(ctx, 30); duk_put_prop_string(ctx, -2, "SIGPWR" );
duk_push_int(ctx, 31); duk_put_prop_string(ctx, -2, "SIGSYS" );
duk_put_prop_string(ctx, -2, "SIGTABLE");
duk_push_object(ctx);
if (sslvS != ((char*)NULL + 1))
{
@@ -1152,7 +1225,9 @@ void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList)
ILibDuktape_CreateProperty_InstanceMethod(ctx, "exit", ILibDuktape_ScriptContainer_Process_Exit, DUK_VARARGS);
ILibDuktape_EventEmitter_CreateEventEx(emitter, "uncaughtException");
ILibDuktape_EventEmitter_CreateEventEx(emitter, "SIGTERM");
ILibDuktape_EventEmitter_CreateEventEx(emitter, "SIGCHLD");
ILibDuktape_EventEmitter_AddHook(emitter, "SIGTERM", ILibDuktape_ScriptContainer_Process_SIGTERM_Hook);
ILibDuktape_EventEmitter_AddHook(emitter, "SIGCHLD", ILibDuktape_ScriptContainer_Process_SIGCHLD_Hook);
ILibDuktape_CreateEventWithGetter(ctx, "argv0", ILibDuktape_ScriptContainer_Process_Argv0);
duk_push_int(ctx, 1);