forked from dhilip89/njs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnjs-integrate-libuv.h
More file actions
101 lines (79 loc) · 2.76 KB
/
njs-integrate-libuv.h
File metadata and controls
101 lines (79 loc) · 2.76 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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// [NJS-API]
// Native JavaScript API for Bindings.
//
// [License]
// Public Domain <http://unlicense.org>
#ifndef NJS_INTEGRATE_LIBUV_H
#define NJS_INTEGRATE_LIBUV_H
#include "./njs-api.h"
#include <uv.h>
namespace njs {
// ============================================================================
// [njs::Internal]
// ============================================================================
namespace Internal {
static NJS_NOINLINE void uvWorkCallback(uv_work_t* uvWork) noexcept;
static NJS_NOINLINE void uvAfterWorkCallback(uv_work_t* uvWork, int status) noexcept;
} // {Internal}
// ============================================================================
// [NJS_ASYNC]
// ============================================================================
class Task {
public:
enum {
kIndexCallback = 0,
kIndexExports = 1,
kIndexParams = 2,
kIndexCustom = 3
};
NJS_NOINLINE Task(Context& ctx, Value data) noexcept
: _runtime(ctx._runtime) {
// Initialize the storage.
ctx.makePersistent(data, _data);
// Initialize UV data.
_uvWork.data = this;
_uvStatus = 0;
}
virtual ~Task() noexcept {}
// --------------------------------------------------------------------------
// [Interface]
// --------------------------------------------------------------------------
virtual void onWork() noexcept = 0;
virtual void onDone(Context& ctx, Value data) noexcept = 0;
virtual void onDestroy(Context& ctx) noexcept { delete this; }
// --------------------------------------------------------------------------
// [Members]
// --------------------------------------------------------------------------
//! Basic runtime, needed to setup the `Context` for `OnComplete()`.
Runtime _runtime;
//! Object used as a storage of indexed values. Only accessible when the task
//! is created and/or completed, it's not possible to access it inside `onWork`
//! from a different thread.
Persistent _data;
//! UV work data.
uv_work_t _uvWork;
//! UV status - initially zero, changed by `uvAfterWorkCallback`.
int _uvStatus;
};
static NJS_NOINLINE void PostTask(Task* task) {
uv_queue_work(
uv_default_loop(),
&task->_uvWork,
Internal::uvWorkCallback,
Internal::uvAfterWorkCallback);
}
namespace Internal {
static NJS_NOINLINE void uvWorkCallback(uv_work_t* uvWork) noexcept {
Task* task = static_cast<Task*>(uvWork->data);
task->onWork();
}
static NJS_NOINLINE void uvAfterWorkCallback(uv_work_t* uvWork, int status) noexcept {
Task* task = static_cast<Task*>(uvWork->data);
njs::ScopedContext ctx(task->_runtime);
njs::Value data = ctx.makeLocal(task->_data);
task->onDone(ctx, data);
task->onDestroy(ctx);
}
} // {Internal}
} // {njs}
#endif // NJS_INTEGRATE_LIBUV_H