0
0
mirror of https://github.com/phpv8/v8js.git synced 2025-03-22 03:27:02 +00:00

Always push timer on stack to allow updates

This commit is contained in:
Stefan Siegl 2014-12-07 15:49:56 +01:00
parent 2a1ae43496
commit e617662293

35
v8js.cc
View File

@ -1074,21 +1074,6 @@ static void php_v8js_timer_push(long time_limit, long memory_limit, php_v8js_ctx
V8JSG(timer_mutex).unlock(); V8JSG(timer_mutex).unlock();
} }
static void php_v8js_timer_pop(TSRMLS_D)
{
V8JSG(timer_mutex).lock();
if (V8JSG(timer_stack).size()) {
php_v8js_timer_ctx *timer_ctx = V8JSG(timer_stack).top();
// Remove the timer context from the stack
V8JSG(timer_stack).pop();
// Free the timer context memory
efree(timer_ctx);
}
V8JSG(timer_mutex).unlock();
}
static void php_v8js_terminate_execution(php_v8js_ctx *c TSRMLS_DC) static void php_v8js_terminate_execution(php_v8js_ctx *c TSRMLS_DC)
{ {
// Forcefully terminate the current thread of V8 execution in the isolate // Forcefully terminate the current thread of V8 execution in the isolate
@ -1213,10 +1198,12 @@ static void php_v8js_call_v8(php_v8js_ctx *c, zval **return_value,
// If not, start timer thread // If not, start timer thread
V8JSG(timer_thread) = new std::thread(php_v8js_timer_thread TSRMLS_CC); V8JSG(timer_thread) = new std::thread(php_v8js_timer_thread TSRMLS_CC);
} }
php_v8js_timer_push(time_limit, memory_limit, c TSRMLS_CC);
} }
/* Always pass the timer to the stack so there can be follow-up changes to
* the time & memory limit. */
php_v8js_timer_push(time_limit, memory_limit, c TSRMLS_CC);
#ifdef ENABLE_DEBUGGER_SUPPORT #ifdef ENABLE_DEBUGGER_SUPPORT
if(c == v8js_debug_context && v8js_debug_auto_break_mode != V8JS_DEBUG_AUTO_BREAK_NEVER) { if(c == v8js_debug_context && v8js_debug_auto_break_mode != V8JS_DEBUG_AUTO_BREAK_NEVER) {
v8::Debug::DebugBreak(c->isolate); v8::Debug::DebugBreak(c->isolate);
@ -1233,9 +1220,17 @@ static void php_v8js_call_v8(php_v8js_ctx *c, zval **return_value,
v8::Local<v8::Value> result = v8_call(c->isolate); v8::Local<v8::Value> result = v8_call(c->isolate);
c->in_execution--; c->in_execution--;
if (time_limit > 0 || memory_limit > 0) { /* Pop our context from the stack and read (possibly updated) limits
php_v8js_timer_pop(TSRMLS_C); * into local variables. */
} V8JSG(timer_mutex).lock();
php_v8js_timer_ctx *timer_ctx = V8JSG(timer_stack).top();
V8JSG(timer_stack).pop();
V8JSG(timer_mutex).unlock();
time_limit = timer_ctx->time_limit;
memory_limit = timer_ctx->memory_limit;
efree(timer_ctx);
/* Check for fatal error marker possibly set by php_v8js_error_handler; just /* Check for fatal error marker possibly set by php_v8js_error_handler; just
* rethrow the error since we're now out of V8. */ * rethrow the error since we're now out of V8. */