2016-10-14 1 views
0

Je tente de développer un addon async Node.js qui fonctionne avec un isolat.Utilisation d'un pointeur sur Isoler dans le thread de travail libuv

Tenir compte ce code exemple:

struct Work { 
    uv_work_t request; 
    Persistent<Function> callback; 
    Isolate * isolate; 
}; 

// called in worker thread 
static void WorkAsync(uv_work_t *req) 
{ 
    Work *work = static_cast<Work *>(req->data); 
    HeapStatistics stats; 
    work->isolate->GetHeapStatistics(&stats); 

    // ... do other stuff ... 
} 

// called by in main thread 
static void WorkAsyncComplete(uv_work_t *req, int status) 
{ 
    Isolate * isolate = Isolate::GetCurrent(); 
    v8::HandleScope handleScope(isolate); 
    Work *work = static_cast<Work *>(req->data); 

    // ... do other stuff ... 

    work->callback.Reset(); 
    delete work; 
} 

void RunAsync(const v8::FunctionCallbackInfo<v8::Value>&args) { 
    Isolate* isolate = args.GetIsolate(); 
    Work * work = new Work(); 
    work->request.data = work; 
    work->isolate = isolate; 

    Local<Function> callback = Local<Function>::Cast(args[0]); 
    work->callback.Reset(isolate, callback); 

    // kick of the worker thread 
    uv_queue_work(uv_default_loop(), &work->request, WorkAsync, WorkAsyncComplete); 
    args.GetReturnValue().Set(Undefined(isolate)); 
} 

void setup(Handle <Object> exports, Handle<Object> module) { 
    NODE_SET_METHOD(exports, "run", RunAsync); 
} 

NODE_MODULE(addon, setup) 

Ma question: est-il sûr de passer un pointeur vers Isoler actuel à un thread de travail (à des fins de lecture seule)?

Merci!

Répondre

0

Répondu par Scott Frees (l'auteur de C++ et Node.js Intégration ebook: https://scottfrees.com/ebooks/nodecpp/):

Pour être honnête, je ne l'ai jamais essayé de le faire. Il me semble que ça devrait aller - tant que vous ne faites que des appels sur l'isolat et que vous n'y modifiez rien.

Généralement, si vous essayez de faire quoi que ce soit en violation du modèle de thread V8, cela génèrera une exception - donc si ce n'est pas le cas, alors je suppose que c'est ok.

0

Oui, c'est possible. Cependant, vous êtes le responsable de la sécurité. Vous devez être sûr que Isolate est isolé du thread parent et déverrouillé. Ensuite, il peut être utilisé (Entré) dans le thread de travail.