Print this page
joyent/v8plus#7 v8plus should not hold the event loop open forever

*** 521,530 **** --- 521,536 ---- pfh = v8::Persistent<v8::Function>::New(it->second.ch_hdl); it->second.ch_hdl = pfh; it->second.ch_persist = _B_TRUE; } ++it->second.ch_refs; + + /* + * If the consumer puts a hold on a callback, we should also put a hold + * on the V8 event loop to prevent it dematerialising beneath us. + */ + v8plus_eventloop_hold(); } extern "C" void v8plus_jsfunc_rele_direct(v8plus_jsfunc_t f) {
*** 542,551 **** --- 548,562 ---- v8::Persistent<v8::Function> pfh(it->second.ch_hdl); pfh.Dispose(); } cbhash.erase(it); } + + /* + * Release the event loop hold we took in v8plus_jsfunc_hold(): + */ + v8plus_eventloop_rele_direct(); } static size_t library_name(const char *base, const char *version, char *buf, size_t len) {
*** 635,647 **** --- 646,669 ---- extern "C" void v8plus_obj_hold(const void *cop) { v8plus::ObjectWrap *op = v8plus::ObjectWrap::objlookup(cop); op->public_Ref(); + + /* + * If the consumer puts a hold on an object, we should also put a hold + * on the V8 event loop to prevent it dematerialising beneath us. + */ + v8plus_eventloop_hold(); } extern "C" void v8plus_obj_rele_direct(const void *cop) { v8plus::ObjectWrap *op = v8plus::ObjectWrap::objlookup(cop); op->public_Unref(); + + /* + * Release the event loop hold we took in v8plus_obj_hold(): + */ + v8plus_eventloop_rele_direct(); }