mirror of
https://github.com/Ylianst/MeshAgent
synced 2025-12-17 08:43:21 +00:00
1. updated process.kill() to support optional signals
2. added 'SIGCHLD'
This commit is contained in:
@@ -830,8 +830,27 @@ duk_ret_t ILibDuktape_ScriptContainer_Process_Kill(duk_context *ctx)
|
|||||||
duk_eval_string(ctx, ILibScratchPad); // [child_process]
|
duk_eval_string(ctx, ILibScratchPad); // [child_process]
|
||||||
}
|
}
|
||||||
#else
|
#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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
duk_ret_t ILibDuktape_Process_cwd(duk_context *ctx)
|
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: "); }
|
if (duk_pcall_method(ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "Error Emitting SIGTERM: "); }
|
||||||
duk_pop(ctx);
|
duk_pop(ctx);
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -926,7 +950,20 @@ void ILibDuktape_ScriptContainer_Process_SIGTERM_Hook(ILibDuktape_EventEmitter *
|
|||||||
UNREFERENCED_PARAMETER(hookedCallback);
|
UNREFERENCED_PARAMETER(hookedCallback);
|
||||||
#endif
|
#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)
|
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);
|
(int[]) {9, 4, 0, 2, 1, 10, 8, 12, 13, 7, 6, 5, 14, 11, 3}, 15);
|
||||||
duk_put_prop_string(ctx, -2, "RLIMITS");
|
duk_put_prop_string(ctx, -2, "RLIMITS");
|
||||||
#endif
|
#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);
|
duk_push_object(ctx);
|
||||||
if (sslvS != ((char*)NULL + 1))
|
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_CreateProperty_InstanceMethod(ctx, "exit", ILibDuktape_ScriptContainer_Process_Exit, DUK_VARARGS);
|
||||||
ILibDuktape_EventEmitter_CreateEventEx(emitter, "uncaughtException");
|
ILibDuktape_EventEmitter_CreateEventEx(emitter, "uncaughtException");
|
||||||
ILibDuktape_EventEmitter_CreateEventEx(emitter, "SIGTERM");
|
ILibDuktape_EventEmitter_CreateEventEx(emitter, "SIGTERM");
|
||||||
|
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_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);
|
||||||
|
|||||||
Reference in New Issue
Block a user