mirror of
https://github.com/phpv8/v8js.git
synced 2025-01-03 09:21:51 +00:00
send LowMemoryNotification before imposing memory limit, fixes #217
This commit is contained in:
parent
4faab8842c
commit
b2eb89e49e
@ -40,27 +40,42 @@ static void v8js_timer_interrupt_handler(v8::Isolate *isolate, void *data) { /*
|
||||
|
||||
v8::Locker locker(isolate);
|
||||
v8::HeapStatistics hs;
|
||||
isolate->GetHeapStatistics(&hs);
|
||||
bool send_notification, has_sent_notification;
|
||||
|
||||
V8JSG(timer_mutex).lock();
|
||||
|
||||
for (std::deque< v8js_timer_ctx* >::iterator it = V8JSG(timer_stack).begin();
|
||||
it != V8JSG(timer_stack).end(); it ++) {
|
||||
v8js_timer_ctx *timer_ctx = *it;
|
||||
v8js_ctx *c = timer_ctx->ctx;
|
||||
|
||||
if(c->isolate != isolate || timer_ctx->killed) {
|
||||
continue;
|
||||
do {
|
||||
if (send_notification) {
|
||||
isolate->LowMemoryNotification();
|
||||
has_sent_notification = true;
|
||||
}
|
||||
|
||||
if (timer_ctx->memory_limit > 0 && hs.used_heap_size() > timer_ctx->memory_limit) {
|
||||
timer_ctx->killed = true;
|
||||
v8::V8::TerminateExecution(c->isolate);
|
||||
c->memory_limit_hit = true;
|
||||
}
|
||||
}
|
||||
isolate->GetHeapStatistics(&hs);
|
||||
|
||||
V8JSG(timer_mutex).unlock();
|
||||
V8JSG(timer_mutex).lock();
|
||||
|
||||
for (std::deque< v8js_timer_ctx* >::iterator it = V8JSG(timer_stack).begin();
|
||||
it != V8JSG(timer_stack).end(); it ++) {
|
||||
v8js_timer_ctx *timer_ctx = *it;
|
||||
v8js_ctx *c = timer_ctx->ctx;
|
||||
|
||||
if(c->isolate != isolate || timer_ctx->killed) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (timer_ctx->memory_limit > 0 && hs.used_heap_size() > timer_ctx->memory_limit) {
|
||||
if (has_sent_notification) {
|
||||
timer_ctx->killed = true;
|
||||
v8::V8::TerminateExecution(c->isolate);
|
||||
c->memory_limit_hit = true;
|
||||
} else {
|
||||
// force garbage collection, then check again
|
||||
send_notification = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
V8JSG(timer_mutex).unlock();
|
||||
} while(send_notification != has_sent_notification);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -210,7 +210,12 @@ void v8js_v8_call(v8js_ctx *c, zval **return_value,
|
||||
isolate->GetHeapStatistics(&hs);
|
||||
|
||||
if (hs.used_heap_size() > memory_limit) {
|
||||
c->memory_limit_hit = true;
|
||||
isolate->LowMemoryNotification();
|
||||
isolate->GetHeapStatistics(&hs);
|
||||
|
||||
if (hs.used_heap_size() > memory_limit) {
|
||||
c->memory_limit_hit = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user