1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-21 18:53:32 +00:00

1. Modified when process.exit event is emitted, so that it emits before any objects are finalized

2. Added process.exitting property that returns true if runtime is in process of exitting
This commit is contained in:
Bryan Roe
2020-07-30 11:00:02 -07:00
parent a08cdc5d27
commit 518a304bfc
2 changed files with 20 additions and 12 deletions

View File

@@ -709,9 +709,21 @@ ILibDuktape_ContextData* ILibDuktape_GetContextData(duk_context *ctx)
void Duktape_SafeDestroyHeap(duk_context *ctx)
{
void *process = ILibDuktape_GetProcessObject(ctx);
ILibDuktape_ContextData *ctxd = duk_ctx_context_data(ctx);
ctxd->flags |= duk_destroy_heap_in_progress;
if (process != NULL)
{
duk_idx_t top = duk_get_top(ctx);
duk_push_heapptr(ctx, process); // [process]
int exitCode = Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_Process_ExitCode, 0);
ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "exit"); // [emit][this]['exit']
duk_push_int(ctx, exitCode); // [emit][this]['exit'][exitCode]
duk_pcall_method(ctx, 2);
duk_set_top(ctx, top);
}
duk_destroy_heap(ctx);
if (ILibLinkedList_GetCount(ctxd->threads) > 0)

View File

@@ -599,20 +599,9 @@ duk_ret_t ILibDuktape_ScriptContainer_Process_env(duk_context *ctx)
duk_ret_t ILibDuktape_ScriptContainer_Process_Finalizer(duk_context *ctx)
{
// We need to dispatch the 'exit' event
int exitCode = 0;
duk_push_this(ctx); // [process]
ILibChain_Link *link = (ILibChain_Link*)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ScriptContainer_Signal_ListenerPtr);
if (duk_has_prop_string(ctx, -1, "\xFF_ExitCode"))
{
duk_get_prop_string(ctx, -1, "\xFF_ExitCode"); // [process][exitCode]
exitCode = duk_get_int(ctx, -1);
duk_pop(ctx); // [process]
}
ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "exit"); // [emit][this]['exit']
duk_push_int(ctx, exitCode); // [emit][this]['exit'][exitCode]
duk_call_method(ctx, 2);
#ifdef _POSIX
struct sigaction action;
@@ -1165,6 +1154,12 @@ duk_ret_t ILibDuktape_ScriptContainer_removeListenerSink(duk_context *ctx)
return(0);
}
duk_ret_t ILibDuktape_Process_Exitting(duk_context *ctx)
{
duk_push_boolean(ctx, (duk_bool_t)duk_ctx_shutting_down(ctx));
return(1);
}
void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList)
{
int i = 0;
@@ -1338,6 +1333,7 @@ void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList)
ILibDuktape_EventEmitter_AddHook(emitter, "SIGTERM", ILibDuktape_ScriptContainer_Process_SIGTERM_Hook);
ILibDuktape_EventEmitter_AddHook(emitter, "SIGCHLD", ILibDuktape_ScriptContainer_Process_SIGCHLD_Hook);
ILibDuktape_EventEmitter_AddOnEx(ctx, -1, "removeListener", ILibDuktape_ScriptContainer_removeListenerSink);
ILibDuktape_CreateEventWithGetter(ctx, "exitting", ILibDuktape_Process_Exitting);
ILibDuktape_CreateEventWithGetter(ctx, "argv0", ILibDuktape_ScriptContainer_Process_Argv0);
duk_push_int(ctx, 1);