-
Notifications
You must be signed in to change notification settings - Fork 52
Expand file tree
/
Copy pathworker.h
More file actions
79 lines (63 loc) · 2.13 KB
/
worker.h
File metadata and controls
79 lines (63 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <functional>
#include "nlv_async_worker.h"
namespace NLV {
class Worker : public NLVAsyncWorkerBase
{
public:
typedef std::function<void(Worker*)> OnFinishedHandler;
typedef std::function<virErrorPtr(OnFinishedHandler)> SetOnFinishedHandler;
typedef std::function<virErrorPtr(SetOnFinishedHandler)> ExecuteHandler;
ExecuteHandler execute_handler;
OnFinishedHandler on_finished_handler;
explicit Worker(Nan::Callback *callback, ExecuteHandler handler)
: NLVAsyncWorkerBase(callback), execute_handler(handler)
{ };
void HandleOKCallback() {
on_finished_handler(this);
}
template <class... T>
void Call(T... t) {
callback->Call(t...);
}
virtual void Execute() {
auto error = execute_handler([=] (OnFinishedHandler handler) {
on_finished_handler = handler;
return nullptr;
});
if (error) {
SetVirError(error);
}
}
static void RunAsync(const Nan::FunctionCallbackInfo<v8::Value>& info, ExecuteHandler handler);
};
template<class T>
Worker::OnFinishedHandler PrimitiveReturnHandler(T val) {
return [=](Worker* worker) {
Nan::HandleScope scope;
v8::Local<v8::Value> argv[] = { Nan::Null(), Nan::New(val) };
worker->Call(2, argv);
};
}
template<class T, class Y>
Worker::OnFinishedHandler InstanceReturnHandler(Y val) {
return [=](Worker* worker) {
Nan::HandleScope scope;
Nan::TryCatch try_catch;
Local<Object> childObject = T::NewInstance(val);
Local<Value> parentObject = worker->GetFromPersistent("parent");
T* child = T::Unwrap(childObject);
if (parentObject->IsObject()) {
childObject->Set(Nan::New("_parent").ToLocalChecked(), parentObject);
auto parent = Nan::ObjectWrap::Unwrap<NLVObjectBase>(parentObject->ToObject());
child->AddToParent(parent);
}
if (try_catch.HasCaught()) {
v8::Local<v8::Value> argv[] = { try_catch.Exception() };
worker->Call(1, argv);
return;
}
v8::Local<v8::Value> argv[] = { Nan::Null(), childObject };
worker->Call(2, argv);
};
}
};