diff --git a/src/node_jsvmapi.cc b/src/node_jsvmapi.cc index 1fd8f16233..5c94049478 100644 --- a/src/node_jsvmapi.cc +++ b/src/node_jsvmapi.cc @@ -863,6 +863,43 @@ size_t napi_buffer_length(napi_env e, napi_value v) { return node::Buffer::Length(v8impl::V8LocalValueFromJsValue(v)); } +uv_work_t* napi_create_uv_work_t() { + uv_work_t* req = (uv_work_t*) malloc(sizeof(uv_work_t)); + return req; +} + +void napi_delete_uv_work_t(uv_work_t* w) { + if (w != NULL) { + delete w; + w = NULL; + } +} + + +/////////////////////////////////////////// +// AsyncWorker Methods +/////////////////////////////////////////// +namespace Napi { +void AsyncExecute(uv_work_t* req) { + AsyncWorker *worker = static_cast(req->data); + worker->Execute(); +} + +void AsyncExecuteComplete(uv_work_t* req) { + AsyncWorker* worker = static_cast(req->data); + worker->WorkComplete(); + worker->Destroy(); +} + +void AsyncQueueWorker(AsyncWorker* worker) { + uv_queue_work( + uv_default_loop(), + worker->request, + AsyncExecute, + reinterpret_cast(AsyncExecuteComplete)); +} +} // namespace Napi + /////////////////////////////////////////// // WILL GO AWAY diff --git a/src/node_jsvmapi.h b/src/node_jsvmapi.h index 4486c3e94c..e85d5878a9 100644 --- a/src/node_jsvmapi.h +++ b/src/node_jsvmapi.h @@ -213,7 +213,14 @@ NODE_EXTERN napi_value napi_buffer_copy(napi_env e, NODE_EXTERN bool napi_buffer_has_instance(napi_env e, napi_value v); NODE_EXTERN char* napi_buffer_data(napi_env e, napi_value v); NODE_EXTERN size_t napi_buffer_length(napi_env e, napi_value v); +} // extern "C" + +#include + +extern "C" { +NODE_EXTERN uv_work_t* napi_create_uv_work_t(); +NODE_EXTERN void napi_delete_uv_work_t(uv_work_t* w); } // extern "C" //////////////////////////////////////////////////////////////////////////////// @@ -227,7 +234,6 @@ NODE_EXTERN size_t napi_buffer_length(napi_env e, napi_value v); //////////////////////////////////////////////////////////////////////////////// #include #include -#include #define NAPI_METHOD(name) \ void name(napi_env env, napi_func_cb_info info) @@ -461,7 +467,8 @@ namespace Napi { public: explicit AsyncWorker(Callback *callback_) : callback(callback_), errmsg_(nullptr) { - request.data = this; + request = napi_create_uv_work_t(); + request->data = this; napi_env env = napi_get_current_env(); HandleScope scope; @@ -479,6 +486,8 @@ namespace Napi { } delete callback; delete[] errmsg_; + + napi_delete_uv_work_t(request); } virtual void WorkComplete() { @@ -545,7 +554,7 @@ namespace Napi { virtual void Execute() = 0; - uv_work_t request; + uv_work_t* request; virtual void Destroy() { delete this; @@ -586,25 +595,11 @@ namespace Napi { char *errmsg_; }; - inline void AsyncExecute(uv_work_t* req) { - AsyncWorker *worker = static_cast(req->data); - worker->Execute(); - } - - inline void AsyncExecuteComplete(uv_work_t* req) { - AsyncWorker* worker = static_cast(req->data); - worker->WorkComplete(); - worker->Destroy(); - } - - inline void AsyncQueueWorker(AsyncWorker* worker) { - uv_queue_work( - uv_default_loop(), - &worker->request, - AsyncExecute, - reinterpret_cast(AsyncExecuteComplete)); - } -} // namespace Napi + void AsyncExecute(uv_work_t* req); + void AsyncExecuteComplete(uv_work_t* req); + void AsyncQueueWorker(AsyncWorker* worker); +} // namespace Napi + //////////////////////////////////////////////////////////////////////////////// // WILL GO AWAY (these can't be extern "C" because they work with C++ types)