diff --git a/microscript/ILibDuktape_ChildProcess.c b/microscript/ILibDuktape_ChildProcess.c index 6e10543..6777821 100644 --- a/microscript/ILibDuktape_ChildProcess.c +++ b/microscript/ILibDuktape_ChildProcess.c @@ -169,7 +169,21 @@ duk_ret_t ILibDuktape_ChildProcess_Kill(duk_context *ctx) duk_push_this(ctx); ILibDuktape_ChildProcess_SubProcess *p = (ILibDuktape_ChildProcess_SubProcess*)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_ChildProcess_MemBuf); - if (p != NULL) { ILibProcessPipe_Process_SoftKill(p->childProcess); } + if (p != NULL) + { + //printf("CTX shutting down: %d [%p]\n", duk_ctx_shutting_down(ctx), p->childProcess); + if (p->childProcess != NULL) + { + if (duk_ctx_shutting_down(ctx) == 0) + { + ILibProcessPipe_Process_SoftKill(p->childProcess); + } + else + { + ILibProcessPipe_Process_HardKill(p->childProcess); + } + } + } return(0); } duk_ret_t ILibDuktape_ChildProcess_waitExit(duk_context *ctx) diff --git a/microstack/ILibProcessPipe.c b/microstack/ILibProcessPipe.c index d958b62..c4dd46e 100644 --- a/microstack/ILibProcessPipe.c +++ b/microstack/ILibProcessPipe.c @@ -495,6 +495,16 @@ void ILibProcessPipe_Process_SoftKill(ILibProcessPipe_Process p) #endif } +void ILibProcessPipe_Process_HardKill(ILibProcessPipe_Process p) +{ + if (!ILibMemory_CanaryOK(p)) { return; } + + ILibProcessPipe_Process_SoftKill(p); + ILibProcessPipe_Process_Destroy(p); +} + + + ILibProcessPipe_Process ILibProcessPipe_Manager_SpawnProcessEx4(ILibProcessPipe_Manager pipeManager, char* target, char* const* parameters, ILibProcessPipe_SpawnTypes spawnType, void *sid, void *envvars, int extraMemorySize) { ILibProcessPipe_Process_Object* retVal = NULL; diff --git a/microstack/ILibProcessPipe.h b/microstack/ILibProcessPipe.h index 87982d5..5a62da3 100644 --- a/microstack/ILibProcessPipe.h +++ b/microstack/ILibProcessPipe.h @@ -79,6 +79,7 @@ ILibProcessPipe_Process ILibProcessPipe_Manager_SpawnProcessEx4(ILibProcessPipe_ #define ILibProcessPipe_Manager_SpawnProcessEx3(pipeManager, target, parameters, spawnType, sessionId, extraMemorySize) ILibProcessPipe_Manager_SpawnProcessEx4(pipeManager, target, parameters, spawnType, sessionId, NULL, extraMemorySize) #define ILibProcessPipe_Manager_SpawnProcessWithExtraPipeMemory(pipeManager, target, parameters, memorySize) ILibProcessPipe_Manager_SpawnProcessEx2(pipeManager, target, parameters, ILibProcessPipe_SpawnTypes_DEFAULT, memorySize) void ILibProcessPipe_Process_SoftKill(ILibProcessPipe_Process p); +void ILibProcessPipe_Process_HardKill(ILibProcessPipe_Process p); void ILibProcessPipe_Process_AddHandlers(ILibProcessPipe_Process module, int bufferSize, ILibProcessPipe_Process_ExitHandler exitHandler, ILibProcessPipe_Process_OutputHandler stdOut, ILibProcessPipe_Process_OutputHandler stdErr, ILibProcessPipe_Process_SendOKHandler sendOk, void *user); #ifdef WIN32 void ILibProcessPipe_Process_RemoveHandlers(ILibProcessPipe_Process module);