emnapi 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CMakeLists.txt +13 -3
- package/dist/library_napi.js +54 -33
- package/emnapi.gyp +3 -0
- package/include/node/emnapi.h +1 -1
- package/include/node/js_native_api.h +30 -25
- package/include/node/js_native_api_types.h +13 -9
- package/include/node/node_api.h +13 -13
- package/include/node/uv/threadpool.h +1 -1
- package/include/node/uv/unix.h +4 -0
- package/include/node/uv.h +49 -6
- package/lib/wasm32/libemnapi.a +0 -0
- package/lib/wasm32-emscripten/libemnapi-mt.a +0 -0
- package/lib/wasm32-emscripten/libemnapi.a +0 -0
- package/lib/wasm32-wasi/libemnapi.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi-basic-mt.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi-basic.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi-mt.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi.a +0 -0
- package/lib/wasm32-wasip1/libemnapi.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi-basic-mt.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi-basic.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi-mt.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi.a +0 -0
- package/lib/wasm64-emscripten/libemnapi-mt.a +0 -0
- package/lib/wasm64-emscripten/libemnapi.a +0 -0
- package/package.json +1 -1
- package/src/async_cleanup_hook.c +1 -1
- package/src/async_work.c +2 -2
- package/src/emnapi_internal.h +2 -2
- package/src/js_native_api.c +2 -1
- package/src/node_api.c +5 -5
- package/src/threadsafe_function.c +20 -21
- package/src/uv/queue.h +68 -86
- package/src/uv/threadpool.c +58 -40
- package/src/uv/unix/async.c +67 -64
- package/src/uv/unix/core.c +36 -1
- package/src/uv/unix/internal.h +54 -0
- package/src/uv/unix/loop.c +40 -4
- package/src/uv/unix/posix-hrtime.c +40 -0
- package/src/uv/uv-common.c +123 -7
- package/src/uv/uv-common.h +137 -9
package/src/uv/uv-common.c
CHANGED
|
@@ -1,9 +1,101 @@
|
|
|
1
1
|
#if defined(__EMSCRIPTEN_PTHREADS__) || defined(_REENTRANT)
|
|
2
2
|
|
|
3
3
|
#include <errno.h>
|
|
4
|
+
#include <stddef.h>
|
|
5
|
+
#include <stdlib.h>
|
|
4
6
|
#include <string.h>
|
|
5
7
|
#include "uv-common.h"
|
|
6
8
|
|
|
9
|
+
typedef struct {
|
|
10
|
+
uv_malloc_func local_malloc;
|
|
11
|
+
uv_realloc_func local_realloc;
|
|
12
|
+
uv_calloc_func local_calloc;
|
|
13
|
+
uv_free_func local_free;
|
|
14
|
+
} uv__allocator_t;
|
|
15
|
+
|
|
16
|
+
static uv__allocator_t uv__allocator = {
|
|
17
|
+
malloc,
|
|
18
|
+
realloc,
|
|
19
|
+
calloc,
|
|
20
|
+
free,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
char* uv__strdup(const char* s) {
|
|
24
|
+
size_t len = strlen(s) + 1;
|
|
25
|
+
char* m = uv__malloc(len);
|
|
26
|
+
if (m == NULL)
|
|
27
|
+
return NULL;
|
|
28
|
+
return memcpy(m, s, len);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
char* uv__strndup(const char* s, size_t n) {
|
|
32
|
+
char* m;
|
|
33
|
+
size_t len = strlen(s);
|
|
34
|
+
if (n < len)
|
|
35
|
+
len = n;
|
|
36
|
+
m = uv__malloc(len + 1);
|
|
37
|
+
if (m == NULL)
|
|
38
|
+
return NULL;
|
|
39
|
+
m[len] = '\0';
|
|
40
|
+
return memcpy(m, s, len);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void* uv__malloc(size_t size) {
|
|
44
|
+
if (size > 0)
|
|
45
|
+
return uv__allocator.local_malloc(size);
|
|
46
|
+
return NULL;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
void uv__free(void* ptr) {
|
|
50
|
+
int saved_errno;
|
|
51
|
+
|
|
52
|
+
/* Libuv expects that free() does not clobber errno. The system allocator
|
|
53
|
+
* honors that assumption but custom allocators may not be so careful.
|
|
54
|
+
*/
|
|
55
|
+
saved_errno = errno;
|
|
56
|
+
uv__allocator.local_free(ptr);
|
|
57
|
+
errno = saved_errno;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
void* uv__calloc(size_t count, size_t size) {
|
|
61
|
+
return uv__allocator.local_calloc(count, size);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
void* uv__realloc(void* ptr, size_t size) {
|
|
65
|
+
if (size > 0)
|
|
66
|
+
return uv__allocator.local_realloc(ptr, size);
|
|
67
|
+
uv__free(ptr);
|
|
68
|
+
return NULL;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
void* uv__reallocf(void* ptr, size_t size) {
|
|
72
|
+
void* newptr;
|
|
73
|
+
|
|
74
|
+
newptr = uv__realloc(ptr, size);
|
|
75
|
+
if (newptr == NULL)
|
|
76
|
+
if (size > 0)
|
|
77
|
+
uv__free(ptr);
|
|
78
|
+
|
|
79
|
+
return newptr;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
int uv_replace_allocator(uv_malloc_func malloc_func,
|
|
83
|
+
uv_realloc_func realloc_func,
|
|
84
|
+
uv_calloc_func calloc_func,
|
|
85
|
+
uv_free_func free_func) {
|
|
86
|
+
if (malloc_func == NULL || realloc_func == NULL ||
|
|
87
|
+
calloc_func == NULL || free_func == NULL) {
|
|
88
|
+
return EINVAL;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
uv__allocator.local_malloc = malloc_func;
|
|
92
|
+
uv__allocator.local_realloc = realloc_func;
|
|
93
|
+
uv__allocator.local_calloc = calloc_func;
|
|
94
|
+
uv__allocator.local_free = free_func;
|
|
95
|
+
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
|
|
7
99
|
static uv_loop_t default_loop_struct;
|
|
8
100
|
static uv_loop_t* default_loop_ptr;
|
|
9
101
|
|
|
@@ -20,8 +112,8 @@ uv_loop_t* uv_default_loop(void) {
|
|
|
20
112
|
}
|
|
21
113
|
|
|
22
114
|
int uv_loop_close(uv_loop_t* loop) {
|
|
23
|
-
|
|
24
|
-
|
|
115
|
+
struct uv__queue* q;
|
|
116
|
+
uv_handle_t* h;
|
|
25
117
|
#ifndef NDEBUG
|
|
26
118
|
void* saved_data;
|
|
27
119
|
#endif
|
|
@@ -29,11 +121,11 @@ int uv_loop_close(uv_loop_t* loop) {
|
|
|
29
121
|
if (uv__has_active_reqs(loop))
|
|
30
122
|
return EBUSY;
|
|
31
123
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
124
|
+
uv__queue_foreach(q, &loop->handle_queue) {
|
|
125
|
+
h = uv__queue_data(q, uv_handle_t, handle_queue);
|
|
126
|
+
if (!(h->flags & UV_HANDLE_INTERNAL))
|
|
127
|
+
return EBUSY;
|
|
128
|
+
}
|
|
37
129
|
|
|
38
130
|
uv__loop_close(loop);
|
|
39
131
|
|
|
@@ -67,4 +159,28 @@ void uv_library_shutdown(void) {
|
|
|
67
159
|
// #endif
|
|
68
160
|
}
|
|
69
161
|
|
|
162
|
+
int uv_metrics_info(uv_loop_t* loop, uv_metrics_t* metrics) {
|
|
163
|
+
memcpy(metrics,
|
|
164
|
+
&uv__get_loop_metrics(loop)->metrics,
|
|
165
|
+
sizeof(*metrics));
|
|
166
|
+
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
uint64_t uv_metrics_idle_time(uv_loop_t* loop) {
|
|
171
|
+
uv__loop_metrics_t* loop_metrics;
|
|
172
|
+
uint64_t entry_time;
|
|
173
|
+
uint64_t idle_time;
|
|
174
|
+
|
|
175
|
+
loop_metrics = uv__get_loop_metrics(loop);
|
|
176
|
+
uv_mutex_lock(&loop_metrics->lock);
|
|
177
|
+
idle_time = loop_metrics->provider_idle_time;
|
|
178
|
+
entry_time = loop_metrics->provider_entry_time;
|
|
179
|
+
uv_mutex_unlock(&loop_metrics->lock);
|
|
180
|
+
|
|
181
|
+
if (entry_time > 0)
|
|
182
|
+
idle_time += uv_hrtime() - entry_time;
|
|
183
|
+
return idle_time;
|
|
184
|
+
}
|
|
185
|
+
|
|
70
186
|
#endif
|
package/src/uv/uv-common.h
CHANGED
|
@@ -27,35 +27,140 @@
|
|
|
27
27
|
#define container_of(ptr, type, member) \
|
|
28
28
|
((type *) ((char *) (ptr) - offsetof(type, member)))
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
/* Handle flags. Some flags are specific to Windows or UNIX. */
|
|
31
|
+
enum {
|
|
32
|
+
/* Used by all handles. */
|
|
33
|
+
UV_HANDLE_CLOSING = 0x00000001,
|
|
34
|
+
UV_HANDLE_CLOSED = 0x00000002,
|
|
35
|
+
UV_HANDLE_ACTIVE = 0x00000004,
|
|
36
|
+
UV_HANDLE_REF = 0x00000008,
|
|
37
|
+
UV_HANDLE_INTERNAL = 0x00000010,
|
|
38
|
+
UV_HANDLE_ENDGAME_QUEUED = 0x00000020
|
|
39
|
+
};
|
|
35
40
|
|
|
36
41
|
#define uv__has_active_reqs(loop) \
|
|
37
42
|
((loop)->active_reqs.count > 0)
|
|
38
43
|
|
|
39
|
-
#define uv__req_register(loop
|
|
44
|
+
#define uv__req_register(loop) \
|
|
40
45
|
do { \
|
|
41
46
|
(loop)->active_reqs.count++; \
|
|
42
47
|
} \
|
|
43
48
|
while (0)
|
|
44
49
|
|
|
45
|
-
#define uv__req_unregister(loop
|
|
50
|
+
#define uv__req_unregister(loop) \
|
|
46
51
|
do { \
|
|
47
52
|
assert(uv__has_active_reqs(loop)); \
|
|
48
53
|
(loop)->active_reqs.count--; \
|
|
49
54
|
} \
|
|
50
55
|
while (0)
|
|
51
56
|
|
|
57
|
+
#define uv__has_active_handles(loop) \
|
|
58
|
+
((loop)->active_handles > 0)
|
|
59
|
+
|
|
60
|
+
#define uv__active_handle_add(h) \
|
|
61
|
+
do { \
|
|
62
|
+
(h)->loop->active_handles++; \
|
|
63
|
+
} \
|
|
64
|
+
while (0)
|
|
65
|
+
|
|
66
|
+
#define uv__active_handle_rm(h) \
|
|
67
|
+
do { \
|
|
68
|
+
(h)->loop->active_handles--; \
|
|
69
|
+
} \
|
|
70
|
+
while (0)
|
|
71
|
+
|
|
72
|
+
#define uv__is_active(h) \
|
|
73
|
+
(((h)->flags & UV_HANDLE_ACTIVE) != 0)
|
|
74
|
+
|
|
75
|
+
#define uv__is_closing(h) \
|
|
76
|
+
(((h)->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED)) != 0)
|
|
77
|
+
#define uv__handle_start(h) \
|
|
78
|
+
do { \
|
|
79
|
+
if (((h)->flags & UV_HANDLE_ACTIVE) != 0) break; \
|
|
80
|
+
(h)->flags |= UV_HANDLE_ACTIVE; \
|
|
81
|
+
if (((h)->flags & UV_HANDLE_REF) != 0) uv__active_handle_add(h); \
|
|
82
|
+
} \
|
|
83
|
+
while (0)
|
|
84
|
+
|
|
85
|
+
#define uv__handle_stop(h) \
|
|
86
|
+
do { \
|
|
87
|
+
if (((h)->flags & UV_HANDLE_ACTIVE) == 0) break; \
|
|
88
|
+
(h)->flags &= ~UV_HANDLE_ACTIVE; \
|
|
89
|
+
if (((h)->flags & UV_HANDLE_REF) != 0) uv__active_handle_rm(h); \
|
|
90
|
+
} \
|
|
91
|
+
while (0)
|
|
92
|
+
|
|
93
|
+
#define uv__handle_ref(h) \
|
|
94
|
+
do { \
|
|
95
|
+
if (((h)->flags & UV_HANDLE_REF) != 0) break; \
|
|
96
|
+
(h)->flags |= UV_HANDLE_REF; \
|
|
97
|
+
if (((h)->flags & UV_HANDLE_CLOSING) != 0) break; \
|
|
98
|
+
if (((h)->flags & UV_HANDLE_ACTIVE) != 0) uv__active_handle_add(h); \
|
|
99
|
+
} \
|
|
100
|
+
while (0)
|
|
101
|
+
|
|
102
|
+
#define uv__handle_unref(h) \
|
|
103
|
+
do { \
|
|
104
|
+
if (((h)->flags & UV_HANDLE_REF) == 0) break; \
|
|
105
|
+
(h)->flags &= ~UV_HANDLE_REF; \
|
|
106
|
+
if (((h)->flags & UV_HANDLE_CLOSING) != 0) break; \
|
|
107
|
+
if (((h)->flags & UV_HANDLE_ACTIVE) != 0) uv__active_handle_rm(h); \
|
|
108
|
+
} \
|
|
109
|
+
while (0)
|
|
110
|
+
|
|
111
|
+
#define uv__has_ref(h) \
|
|
112
|
+
(((h)->flags & UV_HANDLE_REF) != 0)
|
|
113
|
+
|
|
114
|
+
#if defined(_WIN32)
|
|
115
|
+
# define uv__handle_platform_init(h) ((h)->u.fd = -1)
|
|
116
|
+
#else
|
|
117
|
+
# define uv__handle_platform_init(h) ((h)->next_closing = NULL)
|
|
118
|
+
#endif
|
|
119
|
+
|
|
120
|
+
#define uv__handle_init(loop_, h, type_) \
|
|
121
|
+
do { \
|
|
122
|
+
(h)->loop = (loop_); \
|
|
123
|
+
(h)->type = (type_); \
|
|
124
|
+
(h)->flags = UV_HANDLE_REF; /* Ref the loop when active. */ \
|
|
125
|
+
uv__queue_insert_tail(&(loop_)->handle_queue, &(h)->handle_queue); \
|
|
126
|
+
uv__handle_platform_init(h); \
|
|
127
|
+
} \
|
|
128
|
+
while (0)
|
|
129
|
+
|
|
130
|
+
#define UV_REQ_INIT(req, typ) \
|
|
131
|
+
do { \
|
|
132
|
+
(req)->type = (typ); \
|
|
133
|
+
} \
|
|
134
|
+
while (0)
|
|
135
|
+
|
|
52
136
|
#define uv__req_init(loop, req, typ) \
|
|
53
137
|
do { \
|
|
54
138
|
UV_REQ_INIT(req, typ); \
|
|
55
|
-
uv__req_register(loop
|
|
139
|
+
uv__req_register(loop); \
|
|
56
140
|
} \
|
|
57
141
|
while (0)
|
|
58
142
|
|
|
143
|
+
#define uv__get_internal_fields(loop) \
|
|
144
|
+
((uv__loop_internal_fields_t*) loop->internal_fields)
|
|
145
|
+
|
|
146
|
+
#define uv__get_loop_metrics(loop) \
|
|
147
|
+
(&uv__get_internal_fields(loop)->loop_metrics)
|
|
148
|
+
|
|
149
|
+
#define uv__metrics_inc_loop_count(loop) \
|
|
150
|
+
do { \
|
|
151
|
+
uv__get_loop_metrics(loop)->metrics.loop_count++; \
|
|
152
|
+
} while (0)
|
|
153
|
+
|
|
154
|
+
#define uv__metrics_inc_events(loop, e) \
|
|
155
|
+
do { \
|
|
156
|
+
uv__get_loop_metrics(loop)->metrics.events += (e); \
|
|
157
|
+
} while (0)
|
|
158
|
+
|
|
159
|
+
#define uv__metrics_inc_events_waiting(loop, e) \
|
|
160
|
+
do { \
|
|
161
|
+
uv__get_loop_metrics(loop)->metrics.events_waiting += (e); \
|
|
162
|
+
} while (0)
|
|
163
|
+
|
|
59
164
|
#define uv__exchange_int_relaxed(p, v) \
|
|
60
165
|
atomic_exchange_explicit((_Atomic int*)(p), v, memory_order_relaxed)
|
|
61
166
|
|
|
@@ -68,7 +173,30 @@ enum uv__work_kind {
|
|
|
68
173
|
void uv__threadpool_cleanup(void);
|
|
69
174
|
void uv__work_done(uv_async_t* handle);
|
|
70
175
|
void uv__loop_close(uv_loop_t* loop);
|
|
71
|
-
|
|
176
|
+
|
|
177
|
+
void *uv__calloc(size_t count, size_t size);
|
|
178
|
+
char *uv__strdup(const char* s);
|
|
179
|
+
char *uv__strndup(const char* s, size_t n);
|
|
180
|
+
void* uv__malloc(size_t size);
|
|
181
|
+
void uv__free(void* ptr);
|
|
182
|
+
void* uv__realloc(void* ptr, size_t size);
|
|
183
|
+
void* uv__reallocf(void* ptr, size_t size);
|
|
184
|
+
|
|
185
|
+
typedef struct uv__loop_metrics_s uv__loop_metrics_t;
|
|
186
|
+
typedef struct uv__loop_internal_fields_s uv__loop_internal_fields_t;
|
|
187
|
+
|
|
188
|
+
struct uv__loop_metrics_s {
|
|
189
|
+
uv_metrics_t metrics;
|
|
190
|
+
uint64_t provider_entry_time;
|
|
191
|
+
uint64_t provider_idle_time;
|
|
192
|
+
uv_mutex_t lock;
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
struct uv__loop_internal_fields_s {
|
|
196
|
+
unsigned int flags;
|
|
197
|
+
uv__loop_metrics_t loop_metrics;
|
|
198
|
+
int current_timeout;
|
|
199
|
+
};
|
|
72
200
|
|
|
73
201
|
#endif
|
|
74
202
|
|