-
-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathnode_api_async.cc
More file actions
69 lines (59 loc) · 2.02 KB
/
node_api_async.cc
File metadata and controls
69 lines (59 loc) · 2.02 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
#include "node_api_async.h"
#include "uv.h"
typedef struct napi_work_impl__ {
uv_work_t* work;
void* data;
void (*execute)(void* data);
void (*complete)(void* data);
void (*destroy)(void* data);
} napi_work_impl;
napi_work napi_create_async_work() {
napi_work_impl* worker =
reinterpret_cast<napi_work_impl*>(malloc(sizeof(napi_work_impl)));
uv_work_t* req = reinterpret_cast<uv_work_t*>(malloc(sizeof(uv_work_t)));
req->data = worker;
worker->work = req;
return reinterpret_cast<napi_work>(worker);
}
void napi_delete_async_work(napi_work w) {
napi_work_impl* worker = reinterpret_cast<napi_work_impl*>(w);
if (worker != NULL) {
if (worker->work != NULL) {
delete reinterpret_cast<uv_work_t*>(worker->work);
}
delete worker;
worker = NULL;
}
}
void napi_async_set_data(napi_work w, void* data) {
napi_work_impl* worker = reinterpret_cast<napi_work_impl*>(w);
worker->data = data;
}
void napi_async_set_execute(napi_work w, void (*execute)(void* data)) {
napi_work_impl* worker = reinterpret_cast<napi_work_impl*>(w);
worker->execute = execute;
}
void napi_async_set_complete(napi_work w, void (*complete)(void* data)) {
napi_work_impl* worker = reinterpret_cast<napi_work_impl*>(w);
worker->complete = complete;
}
void napi_async_set_destroy(napi_work w, void (*destroy)(void* data)) {
napi_work_impl* worker = reinterpret_cast<napi_work_impl*>(w);
worker->destroy = destroy;
}
void napi_async_execute(uv_work_t* req) {
napi_work_impl* worker = static_cast<napi_work_impl*>(req->data);
worker->execute(worker->data);
}
void napi_async_complete(uv_work_t* req) {
napi_work_impl* worker = static_cast<napi_work_impl*>(req->data);
worker->complete(worker->data);
worker->destroy(worker->data);
}
void napi_async_queue_worker(napi_work w) {
napi_work_impl* worker = reinterpret_cast<napi_work_impl*>(w);
uv_queue_work(uv_default_loop(),
worker->work,
napi_async_execute,
reinterpret_cast<uv_after_work_cb>(napi_async_complete));
}