Search code examples
c++node.jsnode-modulesnode.js-addon

Why is "Isolate::GerCurrent()" Null in asynchronous thread?


My final goal is to solve this problem, but I am getting stuck on some pretty basic stuff.

My whole C++ Module is basically as follows:

void AsyncWork(void *arg) {
    Isolate* isolate = Isolate::GetCurrent();  // isolate is NULL
    if (isolate != NULL) {
        HandleScope scope(isolate);
    }
    else {
        printf("isolate is null\n");
        return;
    }
    // ...
}


void testAsync(const FunctionCallbackInfo<Value>& args) {
    uv_thread_t id;
    int data = 10;
    uv_thread_create(&id, AsyncWork, &data);
}

void init(Handle<Object> target) {
  NODE_SET_METHOD(target, "testAsync", testAsync);
}

NODE_MODULE(MyCppModule, init);

Why is isolate NULL after I call Isolate::GetCurrent() in AsyncWork?


Solution

  • Ok, seems like I set it up the wrong way around and shouldn't call Isolate::GetCurrent() in the worker thread. And instead register a callback on the main thread.

    static uv_async_t async;
    static int i;
    
    void AsyncWork(void *arg) {
        for (i = 0; i < 5; ++i) {
            async.data = (void*)&i;
            uv_async_send(&async);
            Sleep(1000);
        }
    }
    
    void testCallback(uv_async_t *handle) {
        Isolate* isolate = Isolate::GetCurrent();
        if (isolate != NULL) {
            HandleScope scope(isolate);
            printf("Yay\n");
        }
        else {
            printf("isolate is null\n");
        }
        int data = *((int*)handle->data);
        printf("data: %d\n", data);
    }
    
    void testAsync(const FunctionCallbackInfo<Value>& args) {
        uv_thread_t id;
        int data = 10;
        uv_async_init(uv_default_loop(), &async, testCallback);
        uv_thread_create(&id, AsyncWork, &data);
    }
    
    void init(Handle<Object> target) {
      NODE_SET_METHOD(target, "testAsync", testAsync);
    }
    
    NODE_MODULE(MyCppModule, init);