Print this page
XXX keith II

*** 561,571 **** * v8plus_obj_hold() * v8plus_obj_rele() * v8plus_jsfunc_hold() * v8plus_jsfunc_rele() * v8plus_call() ! * v8plus_method_call() * v8plus_defer() * * If you touch anything inside op, you may need locking to * protect against functions called in the main thread. */ --- 561,571 ---- * v8plus_obj_hold() * v8plus_obj_rele() * v8plus_jsfunc_hold() * v8plus_jsfunc_rele() * v8plus_call() ! * v8plus_method_call_direct() * v8plus_defer() * * If you touch anything inside op, you may need locking to * protect against functions called in the main thread. */
*** 649,664 **** }; } util.inherits(MyObjectWrapper, events.EventEmitter); Then, in C code, you must arrange for libuv to call a C function in the ! context of the main event loop. How to do this depends on what type of ! asynchronous event you are waiting for; for example, the `uv_poll` mechanism ! will call you back in the appropriate context when a file descriptor becomes ! readable or writable. Because libuv is a C library, you can easily use ! these interfaces directly in your v8+ addon. Your libuv callback might then ! contain code looking something like this: nvlist_t *eap; nvlist_t *erp; my_object_t *op = ...; ... --- 649,663 ---- }; } util.inherits(MyObjectWrapper, events.EventEmitter); Then, in C code, you must arrange for libuv to call a C function in the ! context of the main event loop. The function `v8plus_method_call()` is safe ! to call from any thread: depending on the context in which it is invoked, it ! will either make the call directly or queue the call in the main event loop ! and block on a reply. Simply arrange to call back into your JavaScript ! object when you wish to post an event: nvlist_t *eap; nvlist_t *erp; my_object_t *op = ...; ...
*** 726,735 **** --- 725,741 ---- argument list `ap`. The method must exist and must be a JavaScript function. Such functions may be attached by JavaScript code as in the event emitter example above. The effects of using this function to call a native method are undefined. + As JavaScript functions must be called from the event loop thread, + `v8plus_method_call()` contains logic to determine whether we are in the + correct context or not. If we are running on some other thread we will + queue the request and sleep, waiting for the event loop thread to make the + call. In the simple case, where we are already in the correct thread, we + make the call directly. + ## FAQ - Why? Because C++ is garbage. Writing good software is challenging enough without