diff --git a/microscript/ILibDuktape_ChildProcess.c b/microscript/ILibDuktape_ChildProcess.c index 167abc2..a118aea 100644 --- a/microscript/ILibDuktape_ChildProcess.c +++ b/microscript/ILibDuktape_ChildProcess.c @@ -162,6 +162,7 @@ duk_ret_t ILibDuktape_ChildProcess_Kill(duk_context *ctx) } duk_ret_t ILibDuktape_ChildProcess_waitExit(duk_context *ctx) { + int timeout = duk_is_number(ctx, 0) ? duk_require_int(ctx, 0) : -1; void *chain = Duktape_GetChain(ctx); if (ILibIsChainBeingDestroyed(chain)) { @@ -178,7 +179,7 @@ duk_ret_t ILibDuktape_ChildProcess_waitExit(duk_context *ctx) duk_put_prop_string(ctx, -2, "\xFF_WaitExit"); // [spawnedProcess] void *mods[] = { ILibGetBaseTimer(Duktape_GetChain(ctx)), Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ChildProcess_Manager) }; - ILibChain_Continue(chain, (ILibChain_Link**)mods, 2, -1); + ILibChain_Continue(chain, (ILibChain_Link**)mods, 2, timeout); return(0); } diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index ab08ca9..59bfaff 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -2187,6 +2187,7 @@ ILibExportMethod void ILibChain_Continue(void *Chain, ILibChain_Link **modules, ILibChain_Link *module; int slct = 0, vX = 0, mX = 0; struct timeval tv; + struct timeval startTime; fd_set readset; fd_set errorset; fd_set writeset; @@ -2198,16 +2199,25 @@ ILibExportMethod void ILibChain_Continue(void *Chain, ILibChain_Link **modules, root->continuationState = ILibChain_ContinuationState_CONTINUE; currentNode = root->node; - gettimeofday(&tv, NULL); + gettimeofday(&startTime, NULL); ILibRemoteLogging_printf(ILibChainGetLogger(chain), ILibRemoteLogging_Modules_Microstack_Generic, ILibRemoteLogging_Flags_VerbosityLevel_1, "ContinueChain..."); while (root->TerminateFlag == 0 && root->continuationState == ILibChain_ContinuationState_CONTINUE) { + if (maxTimeout > 0) + { + gettimeofday(&tv, NULL); + if (tv.tv_sec < (startTime.tv_sec + maxTimeout / 1000)) + { + root->continuationState = ILibChain_ContinuationState_END_CONTINUE; + break; + } + } slct = 0; FD_ZERO(&readset); FD_ZERO(&errorset); FD_ZERO(&writeset); - tv.tv_sec = UPNP_MAX_WAIT; + tv.tv_sec = maxTimeout < 0 ? UPNP_MAX_WAIT : maxTimeout/1000; tv.tv_usec = 0; //