diff --git a/microscript/ILibDuktape_ScriptContainer.c b/microscript/ILibDuktape_ScriptContainer.c index a3a9b09..ac8a6ab 100644 --- a/microscript/ILibDuktape_ScriptContainer.c +++ b/microscript/ILibDuktape_ScriptContainer.c @@ -851,6 +851,16 @@ void ILibDuktape_ScriptContainer_Process_SignalListener_PostSelect(void* object, break; } } + else if(bytesRead == 0 || (errno != EAGAIN && errno != EWOULDBLOCK)) + { + close(SignalDescriptors[0]); + close(SignalDescriptors[1]); + if (pipe(SignalDescriptors) == 0) + { + fcntl(SignalDescriptors[0], F_SETFL, O_NONBLOCK); + fcntl(SignalDescriptors[1], F_SETFL, O_NONBLOCK); + } + } } } void ILibDuktape_ScriptContainer_Process_SignalListener(int signum) @@ -860,6 +870,18 @@ void ILibDuktape_ScriptContainer_Process_SignalListener(int 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 void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList) @@ -967,6 +989,7 @@ void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList) k->MetaData = "Signal_Listener"; k->PreSelectHandler = ILibDuktape_ScriptContainer_Process_SignalListener_PreSelect; k->PostSelectHandler = ILibDuktape_ScriptContainer_Process_SignalListener_PostSelect; + k->DestroyHandler = ILibDuktape_ScriptContainer_Process_SignalListener_Destroy; ILibAddToChain(chain, k); signal(SIGTERM, ILibDuktape_ScriptContainer_Process_SignalListener);