Print this page
XXX rework to avoid changing api
XXX well, it works now...

*** 7,16 **** --- 7,18 ---- #include <sys/ccompile.h> #include <stdarg.h> #include <libnvpair.h> #include <v8.h> + #include <uv.h> + #include <queue> #include <unordered_map> #include "v8plus_glue.h" /* * STOP!
*** 27,56 **** --- 29,82 ---- #if NODE_MINOR_VERSION > 7 || NODE_MAJOR_VERSION > 0 #define NODE_MAKECALLBACK_RETURN #endif + typedef struct v8plus_async_call { + void *ac_cop; + const char *ac_name; + const nvlist_t *ac_lp; + + pthread_cond_t ac_cv; + pthread_mutex_t ac_mtx; + + boolean_t ac_run; + nvlist_t *ac_return; + } v8plus_async_call_t; + + extern "C" void v8plus_async_callback(uv_async_t *, int); + namespace v8plus { + class ObjectWrap; class ObjectWrap : public node::ObjectWrap { public: static void init(v8::Handle<v8::Object>); static v8::Handle<v8::Value> cons(const v8::Arguments &); static ObjectWrap *objlookup(const void *); v8::Handle<v8::Value> call(const char *, int, v8::Handle<v8::Value>[]); void public_Ref(void); void public_Unref(void); + static v8plus_async_call_t *next_async_call(void); + static void post_async_call(v8plus_async_call_t *); + static boolean_t in_event_thread(void); private: static v8::Persistent<v8::Function> _constructor; static v8plus_method_descr_t *_mtbl; static v8plus_static_descr_t *_stbl; static std::unordered_map<void *, ObjectWrap *> _objhash; void *_c_impl; + static uv_async_t _uv_async; + static pthread_mutex_t _callq_mutex; + static std::queue<v8plus_async_call_t *> _callq; + static boolean_t _crossthread_init_done; + static unsigned long _uv_event_thread; + ObjectWrap() : _c_impl(NULL) {}; ~ObjectWrap(); static v8::Handle<v8::Value> _new(const v8::Arguments &); static v8::Handle<v8::Value> _entry(const v8::Arguments &);