emnapi 1.9.2 → 1.11.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/dist/library_napi.js +392 -82
- package/include/node/emnapi.h +27 -2
- package/include/node/js_native_api.h +10 -0
- package/include/node/js_native_api_types.h +4 -0
- package/lib/wasm32/libdlmalloc-mt.a +0 -0
- package/lib/wasm32/libdlmalloc.a +0 -0
- package/lib/wasm32/libemmalloc-mt.a +0 -0
- package/lib/wasm32/libemmalloc.a +0 -0
- package/lib/wasm32/libemnapi-basic-mt.a +0 -0
- package/lib/wasm32/libemnapi-basic.a +0 -0
- package/lib/wasm32/libemnapi.a +0 -0
- package/lib/wasm32-emscripten/libemnapi-basic.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-basic-mt.a +0 -0
- package/lib/wasm32-wasi/libemnapi-basic.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-napi-rs-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-napi-rs-mt.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi.a +0 -0
- package/lib/wasm32-wasip1/libemnapi-basic-mt.a +0 -0
- package/lib/wasm32-wasip1/libemnapi-basic.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-napi-rs-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-napi-rs-mt.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi.a +0 -0
- package/lib/wasm64-emscripten/libemnapi-basic.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/dist/library_napi.js
CHANGED
|
@@ -53,11 +53,11 @@ function emnapiInit(options) {
|
|
|
53
53
|
var scope = emnapiCtx.openScope(envObject);
|
|
54
54
|
try {
|
|
55
55
|
envObject.callIntoModule(function (_envObject) {
|
|
56
|
-
var exports
|
|
56
|
+
var exports = emnapiModule.exports;
|
|
57
57
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
58
|
-
var exportsHandle = scope.add(exports
|
|
58
|
+
var exportsHandle = scope.add(exports);
|
|
59
59
|
var napiValue = _napi_register_wasm_v1({{{ to64('_envObject.id') }}}, {{{ to64('exportsHandle.id') }}});
|
|
60
|
-
emnapiModule.exports = (!napiValue) ? exports
|
|
60
|
+
emnapiModule.exports = (!napiValue) ? exports : emnapiCtx.handleStore.get(napiValue).value;
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
catch (err) {
|
|
@@ -236,8 +236,8 @@ function __emnapi_close_handle_scope(_scope) {
|
|
|
236
236
|
/* eslint-disable @typescript-eslint/indent */
|
|
237
237
|
/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */
|
|
238
238
|
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
239
|
+
/* eslint-disable @typescript-eslint/indent */
|
|
239
240
|
/**
|
|
240
|
-
* @__deps emscripten_resize_heap
|
|
241
241
|
* @__sig ipjp
|
|
242
242
|
*/
|
|
243
243
|
function _napi_adjust_external_memory(env, low, high, adjusted_value) {
|
|
@@ -248,33 +248,24 @@ function _napi_adjust_external_memory(env, low, high, adjusted_value) {
|
|
|
248
248
|
#if WASM_BIGINT
|
|
249
249
|
if (!high)
|
|
250
250
|
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
251
|
-
change_in_bytes =
|
|
251
|
+
change_in_bytes = BigInt(low);
|
|
252
252
|
#else
|
|
253
253
|
if (!adjusted_value)
|
|
254
254
|
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
255
|
-
change_in_bytes = (low >>> 0) + (high
|
|
255
|
+
change_in_bytes = BigInt(low >>> 0) + (BigInt(high) << BigInt(32));
|
|
256
256
|
#endif
|
|
257
|
-
|
|
258
|
-
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
259
|
-
}
|
|
260
|
-
if (change_in_bytes > 0) {
|
|
261
|
-
var old_size = wasmMemory.buffer.byteLength;
|
|
262
|
-
var new_size = old_size + change_in_bytes;
|
|
263
|
-
if (!_emscripten_resize_heap(new_size)) {
|
|
264
|
-
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
257
|
+
var adjusted_memory = emnapiCtx.adjustAmountOfExternalAllocatedMemory(change_in_bytes);
|
|
267
258
|
#if WASM_BIGINT
|
|
268
259
|
{{{ from64('high') }}};
|
|
269
260
|
if (emnapiCtx.feature.supportBigInt) {
|
|
270
|
-
{{{ makeSetValue('high', 0, '
|
|
261
|
+
{{{ makeSetValue('high', 0, 'adjusted_memory', 'i64') }}};
|
|
271
262
|
}
|
|
272
263
|
else {
|
|
273
|
-
emnapiSetValueI64(high,
|
|
264
|
+
emnapiSetValueI64(high, Number(adjusted_memory));
|
|
274
265
|
}
|
|
275
266
|
#else
|
|
276
267
|
{{{ from64('adjusted_value') }}};
|
|
277
|
-
{{{ makeSetValue('adjusted_value', 0, '
|
|
268
|
+
{{{ makeSetValue('adjusted_value', 0, 'adjusted_memory', 'i64') }}};
|
|
278
269
|
#endif
|
|
279
270
|
return envObject.clearLastError();
|
|
280
271
|
}
|
|
@@ -308,7 +299,7 @@ function __emnapi_worker_unref(pid) {
|
|
|
308
299
|
* @__postset
|
|
309
300
|
* ```
|
|
310
301
|
* PThread.unusedWorkers.forEach(emnapiAddSendListener);
|
|
311
|
-
* PThread.
|
|
302
|
+
* Object.values(PThread.pthreads).forEach(emnapiAddSendListener);
|
|
312
303
|
* (function () {
|
|
313
304
|
* var __original_getNewWorker = PThread.getNewWorker;
|
|
314
305
|
* PThread.getNewWorker = function () {
|
|
@@ -1064,8 +1055,7 @@ var emnapiExternalMemory = {
|
|
|
1064
1055
|
}
|
|
1065
1056
|
return view;
|
|
1066
1057
|
}
|
|
1067
|
-
var maybeOldWasmMemory = emnapiExternalMemory.isDetachedArrayBuffer(view.buffer) ||
|
|
1068
|
-
((typeof SharedArrayBuffer === 'function') && (view.buffer instanceof SharedArrayBuffer));
|
|
1058
|
+
var maybeOldWasmMemory = emnapiExternalMemory.isDetachedArrayBuffer(view.buffer) || emnapiExternalMemory.isSharedArrayBuffer(view.buffer);
|
|
1069
1059
|
if (maybeOldWasmMemory && emnapiExternalMemory.wasmMemoryViewTable.has(view)) {
|
|
1070
1060
|
var info = emnapiExternalMemory.wasmMemoryViewTable.get(view);
|
|
1071
1061
|
var Ctor = info.Ctor;
|
|
@@ -1095,6 +1085,73 @@ var emnapiExternalMemory = {
|
|
|
1095
1085
|
return { address: address === 0 ? 0 : (address + view.byteOffset), ownership: ownership, runtimeAllocated: runtimeAllocated, view: view };
|
|
1096
1086
|
}
|
|
1097
1087
|
};
|
|
1088
|
+
/**
|
|
1089
|
+
* Metadata layout in wasm shared memory (allocated with _malloc):
|
|
1090
|
+
* offset 0: refcount (int32, 4 bytes - for Atomics)
|
|
1091
|
+
* offset POINTER_SIZE: external_data (pointer)
|
|
1092
|
+
* offset 2*POINTER_SIZE: byte_length (size_t)
|
|
1093
|
+
* offset 3*POINTER_SIZE: finalize_cb (pointer)
|
|
1094
|
+
* offset 4*POINTER_SIZE: finalize_data (pointer)
|
|
1095
|
+
* offset 5*POINTER_SIZE: finalize_hint (pointer)
|
|
1096
|
+
* Total: 6 * POINTER_SIZE bytes
|
|
1097
|
+
*/
|
|
1098
|
+
/**
|
|
1099
|
+
* @__postset
|
|
1100
|
+
* ```
|
|
1101
|
+
* emnapiExternalSAB.init();
|
|
1102
|
+
* ```
|
|
1103
|
+
*/
|
|
1104
|
+
var emnapiExternalSAB = {
|
|
1105
|
+
registry: undefined,
|
|
1106
|
+
handleTable: new WeakMap(),
|
|
1107
|
+
init: function () {
|
|
1108
|
+
emnapiExternalSAB.handleTable = new WeakMap();
|
|
1109
|
+
emnapiExternalSAB.registry = typeof FinalizationRegistry === 'function'
|
|
1110
|
+
? new FinalizationRegistry(function (metaPtr) {
|
|
1111
|
+
emnapiExternalSAB.release(metaPtr);
|
|
1112
|
+
})
|
|
1113
|
+
: undefined;
|
|
1114
|
+
},
|
|
1115
|
+
allocMeta: function (external_data, byte_length, finalize_cb, finalize_data, finalize_hint) {
|
|
1116
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1117
|
+
var size = {{{ POINTER_SIZE }}} * 6;
|
|
1118
|
+
// eslint-disable-next-line prefer-const
|
|
1119
|
+
var metaPtr = _malloc({{{ to64('size') }}});
|
|
1120
|
+
if (!metaPtr)
|
|
1121
|
+
throw new Error('Out of memory');
|
|
1122
|
+
{{{ from64('metaPtr') }}};
|
|
1123
|
+
// refcount = 1
|
|
1124
|
+
Atomics.store(new Int32Array(wasmMemory.buffer, metaPtr, 1), 0, 1);
|
|
1125
|
+
{{{ makeSetValue('metaPtr', POINTER_SIZE, 'external_data', '*') }}};
|
|
1126
|
+
{{{ makeSetValue('metaPtr', POINTER_SIZE * 2, 'byte_length', '*') }}};
|
|
1127
|
+
{{{ makeSetValue('metaPtr', POINTER_SIZE * 3, 'finalize_cb', '*') }}};
|
|
1128
|
+
{{{ makeSetValue('metaPtr', POINTER_SIZE * 4, 'finalize_data', '*') }}};
|
|
1129
|
+
{{{ makeSetValue('metaPtr', POINTER_SIZE * 5, 'finalize_hint', '*') }}};
|
|
1130
|
+
return metaPtr;
|
|
1131
|
+
},
|
|
1132
|
+
readMeta: function (metaPtr) {
|
|
1133
|
+
var external_data = {{{ makeGetValue('metaPtr', POINTER_SIZE, '*') }}};
|
|
1134
|
+
var byte_length = {{{ makeGetValue('metaPtr', POINTER_SIZE * 2, '*') }}};
|
|
1135
|
+
var finalize_cb = {{{ makeGetValue('metaPtr', POINTER_SIZE * 3, '*') }}};
|
|
1136
|
+
var finalize_data = {{{ makeGetValue('metaPtr', POINTER_SIZE * 4, '*') }}};
|
|
1137
|
+
var finalize_hint = {{{ makeGetValue('metaPtr', POINTER_SIZE * 5, '*') }}};
|
|
1138
|
+
return { external_data: external_data, byte_length: byte_length, finalize_cb: finalize_cb, finalize_data: finalize_data, finalize_hint: finalize_hint };
|
|
1139
|
+
},
|
|
1140
|
+
release: function (metaPtr) {
|
|
1141
|
+
var oldRefcount = Atomics.sub(new Int32Array(wasmMemory.buffer, metaPtr, 1), 0, 1);
|
|
1142
|
+
if (oldRefcount === 1) {
|
|
1143
|
+
// refcount reached 0, we are the last holder
|
|
1144
|
+
var info = emnapiExternalSAB.readMeta(metaPtr);
|
|
1145
|
+
var finalize_cb = info.finalize_cb;
|
|
1146
|
+
if (finalize_cb) {
|
|
1147
|
+
var finalize_data = info.finalize_data;
|
|
1148
|
+
var finalize_hint = info.finalize_hint;
|
|
1149
|
+
{{{ makeDynCall('vpp', 'finalize_cb') }}}(finalize_data, finalize_hint);
|
|
1150
|
+
}
|
|
1151
|
+
_free({{{ to64('metaPtr') }}});
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
};
|
|
1098
1155
|
/**
|
|
1099
1156
|
* @__sig ippp
|
|
1100
1157
|
*/
|
|
@@ -1296,13 +1353,12 @@ function _napi_get_typedarray_info(env, typedarray, type, length, data, arraybuf
|
|
|
1296
1353
|
}
|
|
1297
1354
|
{{{ makeSetValue('type', 0, 't', 'i32') }}};
|
|
1298
1355
|
}
|
|
1356
|
+
v = emnapiExternalMemory.getOrUpdateMemoryView(v);
|
|
1299
1357
|
if (length) {
|
|
1300
1358
|
{{{ from64('length') }}};
|
|
1301
1359
|
{{{ makeSetValue('length', 0, 'v.length', SIZE_TYPE) }}};
|
|
1302
1360
|
}
|
|
1303
|
-
var buffer;
|
|
1304
1361
|
if (data || arraybuffer) {
|
|
1305
|
-
buffer = v.buffer;
|
|
1306
1362
|
if (data) {
|
|
1307
1363
|
{{{ from64('data') }}};
|
|
1308
1364
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -1312,7 +1368,7 @@ function _napi_get_typedarray_info(env, typedarray, type, length, data, arraybuf
|
|
|
1312
1368
|
if (arraybuffer) {
|
|
1313
1369
|
{{{ from64('arraybuffer') }}};
|
|
1314
1370
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1315
|
-
var ab = envObject.ensureHandleId(buffer);
|
|
1371
|
+
var ab = envObject.ensureHandleId(v.buffer);
|
|
1316
1372
|
{{{ makeSetValue('arraybuffer', 0, 'ab', '*') }}};
|
|
1317
1373
|
}
|
|
1318
1374
|
}
|
|
@@ -1356,14 +1412,12 @@ function _napi_get_dataview_info(env, dataview, byte_length, data, arraybuffer,
|
|
|
1356
1412
|
if (!handle.isDataView()) {
|
|
1357
1413
|
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
1358
1414
|
}
|
|
1359
|
-
var v = handle.value;
|
|
1415
|
+
var v = emnapiExternalMemory.getOrUpdateMemoryView(handle.value);
|
|
1360
1416
|
if (byte_length) {
|
|
1361
1417
|
{{{ from64('byte_length') }}};
|
|
1362
1418
|
{{{ makeSetValue('byte_length', 0, 'v.byteLength', SIZE_TYPE) }}};
|
|
1363
1419
|
}
|
|
1364
|
-
var buffer;
|
|
1365
1420
|
if (data || arraybuffer) {
|
|
1366
|
-
buffer = v.buffer;
|
|
1367
1421
|
if (data) {
|
|
1368
1422
|
{{{ from64('data') }}};
|
|
1369
1423
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -1373,7 +1427,7 @@ function _napi_get_dataview_info(env, dataview, byte_length, data, arraybuffer,
|
|
|
1373
1427
|
if (arraybuffer) {
|
|
1374
1428
|
{{{ from64('arraybuffer') }}};
|
|
1375
1429
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1376
|
-
var ab = envObject.ensureHandleId(buffer);
|
|
1430
|
+
var ab = envObject.ensureHandleId(v.buffer);
|
|
1377
1431
|
{{{ makeSetValue('arraybuffer', 0, 'ab', '*') }}};
|
|
1378
1432
|
}
|
|
1379
1433
|
}
|
|
@@ -2867,7 +2921,107 @@ function _emnapi_get_runtime_version(env, version) {
|
|
|
2867
2921
|
{{{ makeSetValue('version', 8, 'versions[2]', 'u32') }}};
|
|
2868
2922
|
return envObject.clearLastError();
|
|
2869
2923
|
}
|
|
2870
|
-
|
|
2924
|
+
/**
|
|
2925
|
+
* Get the handle for an external SharedArrayBuffer.
|
|
2926
|
+
* Must be called on the emnapi main thread.
|
|
2927
|
+
* @__sig ippp
|
|
2928
|
+
*/
|
|
2929
|
+
function _emnapi_get_external_sharedarraybuffer_handle(env, sharedarraybuffer, handle) {
|
|
2930
|
+
if (!env)
|
|
2931
|
+
return 1 /* napi_status.napi_invalid_arg */;
|
|
2932
|
+
// @ts-expect-error
|
|
2933
|
+
var envObject = emnapiCtx.envStore.get(env);
|
|
2934
|
+
envObject.checkGCAccess();
|
|
2935
|
+
if (!envObject.tryCatch.isEmpty())
|
|
2936
|
+
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
2937
|
+
if (!envObject.canCallIntoJs())
|
|
2938
|
+
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
|
|
2939
|
+
envObject.clearLastError();
|
|
2940
|
+
try {
|
|
2941
|
+
if (!sharedarraybuffer)
|
|
2942
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
2943
|
+
if (!handle)
|
|
2944
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
2945
|
+
{{{ from64('handle') }}};
|
|
2946
|
+
var jsValue = emnapiCtx.handleStore.get(sharedarraybuffer).value;
|
|
2947
|
+
if (!emnapiExternalMemory.isSharedArrayBuffer(jsValue)) {
|
|
2948
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
2949
|
+
}
|
|
2950
|
+
var metaPtr = emnapiExternalSAB.handleTable.get(jsValue);
|
|
2951
|
+
if (metaPtr === undefined) {
|
|
2952
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
2953
|
+
}
|
|
2954
|
+
{{{ makeSetValue('handle', 0, 'metaPtr', '*') }}};
|
|
2955
|
+
return envObject.getReturnStatus();
|
|
2956
|
+
}
|
|
2957
|
+
catch (err) {
|
|
2958
|
+
envObject.tryCatch.setError(err);
|
|
2959
|
+
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
2960
|
+
}
|
|
2961
|
+
}
|
|
2962
|
+
/**
|
|
2963
|
+
* Acquire a reference to an external SharedArrayBuffer.
|
|
2964
|
+
* Can be called on any thread.
|
|
2965
|
+
* @__sig vp
|
|
2966
|
+
*/
|
|
2967
|
+
function _emnapi_acquire_external_sharedarraybuffer(handle) {
|
|
2968
|
+
{{{ from64('handle') }}};
|
|
2969
|
+
Atomics.add(new Int32Array(wasmMemory.buffer, handle, 1), 0, 1);
|
|
2970
|
+
}
|
|
2971
|
+
/**
|
|
2972
|
+
* Release a reference to an external SharedArrayBuffer.
|
|
2973
|
+
* Can be called on any thread.
|
|
2974
|
+
* @__sig vp
|
|
2975
|
+
*/
|
|
2976
|
+
function _emnapi_release_external_sharedarraybuffer(handle) {
|
|
2977
|
+
{{{ from64('handle') }}};
|
|
2978
|
+
emnapiExternalSAB.release(handle);
|
|
2979
|
+
}
|
|
2980
|
+
/**
|
|
2981
|
+
* Acquire a reference to an external SharedArrayBuffer on the current thread.
|
|
2982
|
+
* Can be called on any thread. Increments refcount and registers in
|
|
2983
|
+
* the current thread's FinalizationRegistry.
|
|
2984
|
+
* Exposed as Module.emnapiAcquireExternalSharedArrayBuffer (emscripten) or
|
|
2985
|
+
* napiModule.emnapi.acquireExternalSharedArrayBuffer (core).
|
|
2986
|
+
*/
|
|
2987
|
+
function emnapiAcquireExternalSharedArrayBuffer(handle, sab) {
|
|
2988
|
+
if (sab != null && !emnapiExternalMemory.isSharedArrayBuffer(sab)) {
|
|
2989
|
+
throw new TypeError('Expected a SharedArrayBuffer');
|
|
2990
|
+
}
|
|
2991
|
+
if (!emnapiExternalSAB.registry) {
|
|
2992
|
+
throw new Error('FinalizationRegistry is not supported in this environment');
|
|
2993
|
+
}
|
|
2994
|
+
{{{ from64('handle') }}};
|
|
2995
|
+
var meta = emnapiExternalSAB.readMeta(handle);
|
|
2996
|
+
// eslint-disable-next-line prefer-const
|
|
2997
|
+
var external_data = meta.external_data;
|
|
2998
|
+
{{{ from64('external_data') }}};
|
|
2999
|
+
if (sab == null) {
|
|
3000
|
+
sab = new SharedArrayBuffer(meta.byte_length);
|
|
3001
|
+
new Uint8Array(sab).set(new Uint8Array(wasmMemory.buffer, external_data, meta.byte_length));
|
|
3002
|
+
}
|
|
3003
|
+
else {
|
|
3004
|
+
if (emnapiExternalSAB.handleTable.has(sab)) {
|
|
3005
|
+
return sab;
|
|
3006
|
+
}
|
|
3007
|
+
}
|
|
3008
|
+
// Increment refcount atomically
|
|
3009
|
+
Atomics.add(new Int32Array(wasmMemory.buffer, handle, 1), 0, 1);
|
|
3010
|
+
// Register in emnapiExternalMemory.table for emnapi_sync_memory support
|
|
3011
|
+
if (!emnapiExternalMemory.table.has(sab)) {
|
|
3012
|
+
if (external_data) {
|
|
3013
|
+
emnapiExternalMemory.table.set(sab, {
|
|
3014
|
+
address: external_data,
|
|
3015
|
+
ownership: 1 /* ReferenceOwnership.kUserland */,
|
|
3016
|
+
runtimeAllocated: 0
|
|
3017
|
+
});
|
|
3018
|
+
}
|
|
3019
|
+
}
|
|
3020
|
+
// Register in handleTable and FinalizationRegistry for this thread
|
|
3021
|
+
emnapiExternalSAB.handleTable.set(sab, handle);
|
|
3022
|
+
emnapiExternalSAB.registry.register(sab, handle);
|
|
3023
|
+
return sab;
|
|
3024
|
+
}
|
|
2871
3025
|
// emnapiImplementHelper('$emnapiGetMemoryAddress', undefined, emnapiGetMemoryAddress, ['$emnapiExternalMemory'], 'getMemoryAddress')
|
|
2872
3026
|
/**
|
|
2873
3027
|
* @__sig ipp
|
|
@@ -3114,6 +3268,64 @@ function _napi_create_external_arraybuffer(env, external_data, byte_length, fina
|
|
|
3114
3268
|
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
3115
3269
|
}
|
|
3116
3270
|
}
|
|
3271
|
+
/**
|
|
3272
|
+
* @__sig ipppppp
|
|
3273
|
+
*/
|
|
3274
|
+
function _node_api_create_external_sharedarraybuffer(env, external_data, byte_length, finalize_cb, finalize_hint, result) {
|
|
3275
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
3276
|
+
var value;
|
|
3277
|
+
if (!env)
|
|
3278
|
+
return 1 /* napi_status.napi_invalid_arg */;
|
|
3279
|
+
// @ts-expect-error
|
|
3280
|
+
var envObject = emnapiCtx.envStore.get(env);
|
|
3281
|
+
envObject.checkGCAccess();
|
|
3282
|
+
if (!envObject.tryCatch.isEmpty())
|
|
3283
|
+
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
3284
|
+
if (!envObject.canCallIntoJs())
|
|
3285
|
+
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
|
|
3286
|
+
envObject.clearLastError();
|
|
3287
|
+
try {
|
|
3288
|
+
if (!result)
|
|
3289
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3290
|
+
{{{ from64('byte_length') }}};
|
|
3291
|
+
{{{ from64('external_data') }}};
|
|
3292
|
+
{{{ from64('result') }}};
|
|
3293
|
+
byte_length = byte_length >>> 0;
|
|
3294
|
+
if (!external_data) {
|
|
3295
|
+
byte_length = 0;
|
|
3296
|
+
}
|
|
3297
|
+
if ((external_data + byte_length) > wasmMemory.buffer.byteLength) {
|
|
3298
|
+
throw new RangeError('Memory out of range');
|
|
3299
|
+
}
|
|
3300
|
+
if (!emnapiExternalSAB.registry && finalize_cb) {
|
|
3301
|
+
throw emnapiCtx.createNotSupportWeakRefError('node_api_create_external_sharedarraybuffer', 'Parameter "finalize_cb" must be 0(NULL)');
|
|
3302
|
+
}
|
|
3303
|
+
var sharedArrayBuffer = new SharedArrayBuffer(byte_length);
|
|
3304
|
+
if (byte_length !== 0) {
|
|
3305
|
+
var u8arr = new Uint8Array(sharedArrayBuffer);
|
|
3306
|
+
u8arr.set(new Uint8Array(wasmMemory.buffer).subarray(external_data, external_data + byte_length));
|
|
3307
|
+
emnapiExternalMemory.table.set(sharedArrayBuffer, {
|
|
3308
|
+
address: external_data,
|
|
3309
|
+
ownership: 1 /* ReferenceOwnership.kUserland */,
|
|
3310
|
+
runtimeAllocated: 0
|
|
3311
|
+
});
|
|
3312
|
+
}
|
|
3313
|
+
value = emnapiCtx.addToCurrentScope(sharedArrayBuffer).id;
|
|
3314
|
+
if (finalize_cb) {
|
|
3315
|
+
{{{ from64('finalize_cb') }}};
|
|
3316
|
+
{{{ from64('finalize_hint') }}};
|
|
3317
|
+
var metaPtr = emnapiExternalSAB.allocMeta(external_data, byte_length, finalize_cb, external_data, finalize_hint);
|
|
3318
|
+
emnapiExternalSAB.handleTable.set(sharedArrayBuffer, metaPtr);
|
|
3319
|
+
emnapiExternalSAB.registry.register(sharedArrayBuffer, metaPtr);
|
|
3320
|
+
}
|
|
3321
|
+
{{{ makeSetValue('result', 0, 'value', '*') }}};
|
|
3322
|
+
return envObject.getReturnStatus();
|
|
3323
|
+
}
|
|
3324
|
+
catch (err) {
|
|
3325
|
+
envObject.tryCatch.setError(err);
|
|
3326
|
+
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
3327
|
+
}
|
|
3328
|
+
}
|
|
3117
3329
|
/**
|
|
3118
3330
|
* @__sig ipp
|
|
3119
3331
|
*/
|
|
@@ -3231,9 +3443,6 @@ function _napi_create_typedarray(env, type, length, arraybuffer, byte_offset, re
|
|
|
3231
3443
|
if (!result)
|
|
3232
3444
|
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3233
3445
|
var handle = emnapiCtx.handleStore.get(arraybuffer);
|
|
3234
|
-
if (!handle.isArrayBuffer()) {
|
|
3235
|
-
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3236
|
-
}
|
|
3237
3446
|
var buffer = handle.value;
|
|
3238
3447
|
{{{ from64('byte_offset') }}};
|
|
3239
3448
|
{{{ from64('length') }}};
|
|
@@ -3273,36 +3482,41 @@ function _napi_create_typedarray(env, type, length, arraybuffer, byte_offset, re
|
|
|
3273
3482
|
{{{ makeSetValue('result', 0, 'value', '*') }}};
|
|
3274
3483
|
return envObject.getReturnStatus();
|
|
3275
3484
|
};
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
3281
|
-
|
|
3282
|
-
|
|
3283
|
-
|
|
3284
|
-
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
|
|
3298
|
-
|
|
3299
|
-
|
|
3300
|
-
|
|
3485
|
+
if (buffer instanceof ArrayBuffer || emnapiExternalMemory.isSharedArrayBuffer(buffer)) {
|
|
3486
|
+
switch (type) {
|
|
3487
|
+
case 0 /* napi_typedarray_type.napi_int8_array */:
|
|
3488
|
+
return createTypedArray(envObject, Int8Array, 1, buffer, byte_offset, length);
|
|
3489
|
+
case 1 /* napi_typedarray_type.napi_uint8_array */:
|
|
3490
|
+
return createTypedArray(envObject, Uint8Array, 1, buffer, byte_offset, length);
|
|
3491
|
+
case 2 /* napi_typedarray_type.napi_uint8_clamped_array */:
|
|
3492
|
+
return createTypedArray(envObject, Uint8ClampedArray, 1, buffer, byte_offset, length);
|
|
3493
|
+
case 3 /* napi_typedarray_type.napi_int16_array */:
|
|
3494
|
+
return createTypedArray(envObject, Int16Array, 2, buffer, byte_offset, length);
|
|
3495
|
+
case 4 /* napi_typedarray_type.napi_uint16_array */:
|
|
3496
|
+
return createTypedArray(envObject, Uint16Array, 2, buffer, byte_offset, length);
|
|
3497
|
+
case 5 /* napi_typedarray_type.napi_int32_array */:
|
|
3498
|
+
return createTypedArray(envObject, Int32Array, 4, buffer, byte_offset, length);
|
|
3499
|
+
case 6 /* napi_typedarray_type.napi_uint32_array */:
|
|
3500
|
+
return createTypedArray(envObject, Uint32Array, 4, buffer, byte_offset, length);
|
|
3501
|
+
case 7 /* napi_typedarray_type.napi_float32_array */:
|
|
3502
|
+
return createTypedArray(envObject, Float32Array, 4, buffer, byte_offset, length);
|
|
3503
|
+
case 8 /* napi_typedarray_type.napi_float64_array */:
|
|
3504
|
+
return createTypedArray(envObject, Float64Array, 8, buffer, byte_offset, length);
|
|
3505
|
+
case 9 /* napi_typedarray_type.napi_bigint64_array */:
|
|
3506
|
+
return createTypedArray(envObject, BigInt64Array, 8, buffer, byte_offset, length);
|
|
3507
|
+
case 10 /* napi_typedarray_type.napi_biguint64_array */:
|
|
3508
|
+
return createTypedArray(envObject, BigUint64Array, 8, buffer, byte_offset, length);
|
|
3509
|
+
case 11 /* napi_typedarray_type.napi_float16_array */:
|
|
3510
|
+
if (typeof Float16Array !== 'function') {
|
|
3511
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3512
|
+
}
|
|
3513
|
+
return createTypedArray(envObject, Float16Array, 2, buffer, byte_offset, length);
|
|
3514
|
+
default:
|
|
3301
3515
|
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3302
|
-
|
|
3303
|
-
|
|
3304
|
-
|
|
3305
|
-
|
|
3516
|
+
}
|
|
3517
|
+
}
|
|
3518
|
+
else {
|
|
3519
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3306
3520
|
}
|
|
3307
3521
|
}
|
|
3308
3522
|
catch (err) {
|
|
@@ -5541,6 +5755,7 @@ function _napi_run_script(env, script, result) {
|
|
|
5541
5755
|
* ```
|
|
5542
5756
|
*/
|
|
5543
5757
|
var emnapiTSFN = {
|
|
5758
|
+
_liveSet: {},
|
|
5544
5759
|
offset: {
|
|
5545
5760
|
__size__: 0,
|
|
5546
5761
|
/* napi_ref */ resource: 0,
|
|
@@ -5549,6 +5764,9 @@ var emnapiTSFN = {
|
|
|
5549
5764
|
/* size_t */ queue_size: 0,
|
|
5550
5765
|
/* bool */ is_some: 0,
|
|
5551
5766
|
/* void* */ queue: 0,
|
|
5767
|
+
// Reuse uv_async_t storage as JS-side wakeup state: pending event + scheduled drain.
|
|
5768
|
+
async_pending: 0,
|
|
5769
|
+
async_u_fd: 0,
|
|
5552
5770
|
/* size_t */ thread_count: 0,
|
|
5553
5771
|
/* int32_t */ state: 0,
|
|
5554
5772
|
/* atomic_uchar */ dispatch_state: 0,
|
|
@@ -5565,6 +5783,7 @@ var emnapiTSFN = {
|
|
|
5565
5783
|
/* int32_t */ cond: 0
|
|
5566
5784
|
},
|
|
5567
5785
|
init: function () {
|
|
5786
|
+
emnapiTSFN._liveSet = new Set();
|
|
5568
5787
|
#if MEMORY64
|
|
5569
5788
|
emnapiTSFN.offset.__size__ = 320 /* NapiTSFNOffset64.__size__ */;
|
|
5570
5789
|
emnapiTSFN.offset.resource = 0 /* NapiTSFNOffset64.async_resource_resource */;
|
|
@@ -5573,6 +5792,8 @@ var emnapiTSFN = {
|
|
|
5573
5792
|
emnapiTSFN.offset.queue_size = 88 /* NapiTSFNOffset64.queue_size */;
|
|
5574
5793
|
emnapiTSFN.offset.is_some = 24 /* NapiTSFNOffset64.async_resource_is_some */;
|
|
5575
5794
|
emnapiTSFN.offset.queue = 96 /* NapiTSFNOffset64.queue */;
|
|
5795
|
+
emnapiTSFN.offset.async_pending = 232 /* NapiTSFNOffset64.async_pending */;
|
|
5796
|
+
emnapiTSFN.offset.async_u_fd = 160 /* NapiTSFNOffset64.async_u_fd */;
|
|
5576
5797
|
emnapiTSFN.offset.thread_count = 240 /* NapiTSFNOffset64.thread_count */;
|
|
5577
5798
|
emnapiTSFN.offset.state = 248 /* NapiTSFNOffset64.state */;
|
|
5578
5799
|
emnapiTSFN.offset.dispatch_state = 252 /* NapiTSFNOffset64.dispatch_state */;
|
|
@@ -5595,6 +5816,8 @@ var emnapiTSFN = {
|
|
|
5595
5816
|
emnapiTSFN.offset.queue_size = 60 /* NapiTSFNOffset32.queue_size */;
|
|
5596
5817
|
emnapiTSFN.offset.is_some = 24 /* NapiTSFNOffset32.async_resource_is_some */;
|
|
5597
5818
|
emnapiTSFN.offset.queue = 64 /* NapiTSFNOffset32.queue */;
|
|
5819
|
+
emnapiTSFN.offset.async_pending = 132 /* NapiTSFNOffset32.async_pending */;
|
|
5820
|
+
emnapiTSFN.offset.async_u_fd = 96 /* NapiTSFNOffset32.async_u_fd */;
|
|
5598
5821
|
emnapiTSFN.offset.thread_count = 136 /* NapiTSFNOffset32.thread_count */;
|
|
5599
5822
|
emnapiTSFN.offset.state = 140 /* NapiTSFNOffset32.state */;
|
|
5600
5823
|
emnapiTSFN.offset.dispatch_state = 144 /* NapiTSFNOffset32.dispatch_state */;
|
|
@@ -5613,7 +5836,7 @@ var emnapiTSFN = {
|
|
|
5613
5836
|
emnapiTSFN.offset.mutex = emnapiTSFN.offset.mutex + 4;
|
|
5614
5837
|
if (typeof PThread !== 'undefined') {
|
|
5615
5838
|
PThread.unusedWorkers.forEach(emnapiTSFN.addListener);
|
|
5616
|
-
PThread.
|
|
5839
|
+
Object.values(PThread.pthreads).forEach(emnapiTSFN.addListener);
|
|
5617
5840
|
var __original_getNewWorker_1 = PThread.getNewWorker;
|
|
5618
5841
|
PThread.getNewWorker = function () {
|
|
5619
5842
|
var r = __original_getNewWorker_1.apply(this, arguments);
|
|
@@ -5634,7 +5857,10 @@ var emnapiTSFN = {
|
|
|
5634
5857
|
var type = __emnapi__.type;
|
|
5635
5858
|
var payload = __emnapi__.payload;
|
|
5636
5859
|
if (type === 'tsfn-send') {
|
|
5637
|
-
emnapiTSFN.
|
|
5860
|
+
var pendng = payload.tsfn + emnapiTSFN.offset.async_pending;
|
|
5861
|
+
if (Atomics.load(new Int32Array(wasmMemory.buffer), pendng >>> 2) !== 0) {
|
|
5862
|
+
emnapiTSFN.enqueue(payload.tsfn);
|
|
5863
|
+
}
|
|
5638
5864
|
}
|
|
5639
5865
|
}
|
|
5640
5866
|
};
|
|
@@ -5669,6 +5895,12 @@ var emnapiTSFN = {
|
|
|
5669
5895
|
destroyQueue: function (func) {
|
|
5670
5896
|
var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false);
|
|
5671
5897
|
if (queue) {
|
|
5898
|
+
var node = emnapiTSFN.loadSizeTypeValue(queue, false);
|
|
5899
|
+
while (node !== 0) {
|
|
5900
|
+
var next = emnapiTSFN.loadSizeTypeValue(node + {{{ POINTER_SIZE }}}, false);
|
|
5901
|
+
_free({{{ to64('node') }}});
|
|
5902
|
+
node = next;
|
|
5903
|
+
}
|
|
5672
5904
|
_free({{{ to64('queue') }}});
|
|
5673
5905
|
}
|
|
5674
5906
|
},
|
|
@@ -6027,6 +6259,7 @@ var emnapiTSFN = {
|
|
|
6027
6259
|
}
|
|
6028
6260
|
},
|
|
6029
6261
|
destroy: function (func) {
|
|
6262
|
+
emnapiTSFN._liveSet.delete(func);
|
|
6030
6263
|
emnapiTSFN.destroyQueue(func);
|
|
6031
6264
|
emnapiTSFN.releaseResources(func);
|
|
6032
6265
|
_free({{{ to64('func') }}});
|
|
@@ -6121,6 +6354,7 @@ var emnapiTSFN = {
|
|
|
6121
6354
|
return;
|
|
6122
6355
|
}
|
|
6123
6356
|
emnapiTSFN.setHandlesClosing(func, 1);
|
|
6357
|
+
Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.async_pending) >>> 2, 1);
|
|
6124
6358
|
emnapiCtx.feature.setImmediate(function () {
|
|
6125
6359
|
emnapiTSFN.finalize(func);
|
|
6126
6360
|
});
|
|
@@ -6224,25 +6458,85 @@ var emnapiTSFN = {
|
|
|
6224
6458
|
emnapiTSFN.send(func);
|
|
6225
6459
|
}
|
|
6226
6460
|
},
|
|
6227
|
-
|
|
6228
|
-
|
|
6229
|
-
|
|
6461
|
+
enqueue: function (func) {
|
|
6462
|
+
// `pending` means a worker thread has requested a wakeup that has not
|
|
6463
|
+
// been drained on the main thread yet.
|
|
6464
|
+
var pending = func + emnapiTSFN.offset.async_pending;
|
|
6465
|
+
// `scheduled` prevents queueing the same main-thread drain chain more than
|
|
6466
|
+
// once while a previous wakeup is still in flight.
|
|
6467
|
+
var scheduled = func + emnapiTSFN.offset.async_u_fd;
|
|
6468
|
+
var i32a = new Int32Array(wasmMemory.buffer);
|
|
6469
|
+
if (Atomics.exchange(i32a, scheduled >>> 2, 1) !== 0) {
|
|
6230
6470
|
return;
|
|
6231
6471
|
}
|
|
6232
|
-
|
|
6233
|
-
|
|
6234
|
-
|
|
6235
|
-
|
|
6236
|
-
|
|
6237
|
-
|
|
6472
|
+
// Match uv_async_send-style coalescing in JS: the first turn represents
|
|
6473
|
+
// the wakeup reaching the main thread, and the second turn performs the
|
|
6474
|
+
// actual TSFN drain after nearby Send/Signal calls have had a chance to
|
|
6475
|
+
// collapse into the shared AsyncProgressWorker state.
|
|
6476
|
+
emnapiCtx.feature.setImmediate(function () {
|
|
6477
|
+
if (!emnapiTSFN._liveSet.has(func)) {
|
|
6478
|
+
return;
|
|
6479
|
+
}
|
|
6480
|
+
if (Atomics.load(i32a, pending >>> 2) === 0) {
|
|
6481
|
+
Atomics.store(i32a, scheduled >>> 2, 0);
|
|
6482
|
+
return;
|
|
6483
|
+
}
|
|
6484
|
+
emnapiCtx.feature.setImmediate(function () {
|
|
6485
|
+
try {
|
|
6486
|
+
// Consume the coalesced wakeup once, then let dispatch() observe any
|
|
6487
|
+
// queue mutations through dispatch_state like the C implementation.
|
|
6488
|
+
if (Atomics.exchange(i32a, pending >>> 2, 0) === 0) {
|
|
6489
|
+
return;
|
|
6490
|
+
}
|
|
6491
|
+
// After destroy(), the func address is freed. Skip dispatch
|
|
6492
|
+
// to avoid use-after-free (JS-side lifecycle check).
|
|
6493
|
+
if (!emnapiTSFN._liveSet.has(func)) {
|
|
6494
|
+
return;
|
|
6495
|
+
}
|
|
6496
|
+
emnapiTSFN.dispatch(func);
|
|
6497
|
+
}
|
|
6498
|
+
finally {
|
|
6499
|
+
// Allow a later wakeup to schedule a new drain chain. If another
|
|
6500
|
+
// worker-thread send raced with this drain, enqueue one more turn.
|
|
6501
|
+
if (emnapiTSFN._liveSet.has(func)) {
|
|
6502
|
+
Atomics.store(i32a, scheduled >>> 2, 0);
|
|
6503
|
+
if (Atomics.load(i32a, pending >>> 2) !== 0) {
|
|
6504
|
+
emnapiTSFN.enqueue(func);
|
|
6505
|
+
}
|
|
6238
6506
|
}
|
|
6239
6507
|
}
|
|
6240
6508
|
});
|
|
6509
|
+
});
|
|
6510
|
+
},
|
|
6511
|
+
send: function (func) {
|
|
6512
|
+
var current_state = Atomics.or(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >>> 2, 1 << 1);
|
|
6513
|
+
if ((current_state & 1) === 1) {
|
|
6514
|
+
return;
|
|
6241
6515
|
}
|
|
6242
|
-
|
|
6243
|
-
|
|
6244
|
-
|
|
6245
|
-
|
|
6516
|
+
var pendng = func + emnapiTSFN.offset.async_pending;
|
|
6517
|
+
// A wakeup is already pending, so this send only needs to leave the queued
|
|
6518
|
+
// work in the TSFN queue and let the existing drain pick it up.
|
|
6519
|
+
if (Atomics.load(new Int32Array(wasmMemory.buffer), pendng >>> 2) !== 0) {
|
|
6520
|
+
return;
|
|
6521
|
+
}
|
|
6522
|
+
if (Atomics.exchange(new Int32Array(wasmMemory.buffer), pendng >>> 2, 1) === 0) {
|
|
6523
|
+
if ((typeof ENVIRONMENT_IS_PTHREAD !== 'undefined') && ENVIRONMENT_IS_PTHREAD) {
|
|
6524
|
+
// Worker threads only post a wakeup token. Main-thread draining is
|
|
6525
|
+
// serialized by enqueue() once the message is received.
|
|
6526
|
+
postMessage({
|
|
6527
|
+
__emnapi__: {
|
|
6528
|
+
type: 'tsfn-send',
|
|
6529
|
+
payload: {
|
|
6530
|
+
tsfn: func
|
|
6531
|
+
}
|
|
6532
|
+
}
|
|
6533
|
+
});
|
|
6534
|
+
}
|
|
6535
|
+
else {
|
|
6536
|
+
// On the main thread we can skip the cross-thread hop and schedule the
|
|
6537
|
+
// coalesced drain chain directly.
|
|
6538
|
+
emnapiTSFN.enqueue(func);
|
|
6539
|
+
}
|
|
6246
6540
|
}
|
|
6247
6541
|
}
|
|
6248
6542
|
};
|
|
@@ -6329,6 +6623,7 @@ function _napi_create_threadsafe_function(env, func, async_resource, async_resou
|
|
|
6329
6623
|
{{{ makeSetValue('tsfn', 'emnapiTSFN.offset.finalize_cb', 'thread_finalize_cb', '*') }}};
|
|
6330
6624
|
{{{ makeSetValue('tsfn', 'emnapiTSFN.offset.call_js_cb', 'call_js_cb', '*') }}};
|
|
6331
6625
|
emnapiCtx.addCleanupHook(envObject, emnapiTSFN.cleanup, tsfn);
|
|
6626
|
+
emnapiTSFN._liveSet.add(tsfn);
|
|
6332
6627
|
envObject.ref();
|
|
6333
6628
|
__emnapi_runtime_keepalive_push();
|
|
6334
6629
|
emnapiCtx.increaseWaitingRequestCounter();
|
|
@@ -6931,14 +7226,18 @@ function _napi_get_version(env, result) {
|
|
|
6931
7226
|
return envObject.clearLastError();
|
|
6932
7227
|
}
|
|
6933
7228
|
(typeof addToLibrary === "function" ? addToLibrary : (...args) => mergeInto(LibraryManager.library, ...args))({
|
|
6934
|
-
$emnapiAddSendListener: emnapiAddSendListener,
|
|
6935
|
-
$emnapiAddSendListener__deps: ["$PThread"],
|
|
6936
|
-
$emnapiAddSendListener__postset: "PThread.unusedWorkers.forEach(emnapiAddSendListener);\nPThread.runningWorkers.forEach(emnapiAddSendListener);\n(function () {\n var __original_getNewWorker = PThread.getNewWorker;\n PThread.getNewWorker = function () {\n var r = __original_getNewWorker.apply(this, arguments);\n emnapiAddSendListener(r);\n return r;\n };\n})();",
|
|
6937
|
-
$emnapiAsyncWorkPoolSize: "0",
|
|
6938
7229
|
$emnapiCtx: "undefined",
|
|
6939
7230
|
$emnapiExternalMemory: emnapiExternalMemory,
|
|
6940
7231
|
$emnapiExternalMemory__deps: ["$emnapiCtx", "malloc", "free"],
|
|
6941
7232
|
$emnapiExternalMemory__postset: "emnapiExternalMemory.init();",
|
|
7233
|
+
$emnapiExternalSAB: emnapiExternalSAB,
|
|
7234
|
+
$emnapiExternalSAB__postset: "emnapiExternalSAB.init();",
|
|
7235
|
+
$emnapiAcquireExternalSharedArrayBuffer: emnapiAcquireExternalSharedArrayBuffer,
|
|
7236
|
+
$emnapiAcquireExternalSharedArrayBuffer__deps: ["$emnapiExternalMemory", "$emnapiExternalSAB"],
|
|
7237
|
+
$emnapiAddSendListener: emnapiAddSendListener,
|
|
7238
|
+
$emnapiAddSendListener__deps: ["$PThread"],
|
|
7239
|
+
$emnapiAddSendListener__postset: "PThread.unusedWorkers.forEach(emnapiAddSendListener);\nObject.values(PThread.pthreads).forEach(emnapiAddSendListener);\n(function () {\n var __original_getNewWorker = PThread.getNewWorker;\n PThread.getNewWorker = function () {\n var r = __original_getNewWorker.apply(this, arguments);\n emnapiAddSendListener(r);\n return r;\n };\n})();",
|
|
7240
|
+
$emnapiAsyncWorkPoolSize: "0",
|
|
6942
7241
|
$emnapiGetMemoryAddress: emnapiGetMemoryAddress,
|
|
6943
7242
|
$emnapiGetMemoryAddress__deps: ["$emnapiExternalMemory"],
|
|
6944
7243
|
$emnapiModule: emnapiModule,
|
|
@@ -7037,6 +7336,8 @@ function _napi_get_version(env, result) {
|
|
|
7037
7336
|
_emnapi_worker_unref: __emnapi_worker_unref,
|
|
7038
7337
|
_emnapi_worker_unref__deps: ["$PThread"],
|
|
7039
7338
|
_emnapi_worker_unref__sig: "vp",
|
|
7339
|
+
emnapi_acquire_external_sharedarraybuffer: _emnapi_acquire_external_sharedarraybuffer,
|
|
7340
|
+
emnapi_acquire_external_sharedarraybuffer__sig: "vp",
|
|
7040
7341
|
$emnapiGetHandle: emnapiGetHandle,
|
|
7041
7342
|
$emnapiGetHandle__deps: ["$emnapiCtx", "$emnapiExternalMemory"],
|
|
7042
7343
|
napi_add_finalizer: _napi_add_finalizer,
|
|
@@ -7045,6 +7346,9 @@ function _napi_get_version(env, result) {
|
|
|
7045
7346
|
emnapi_create_memory_view: _emnapi_create_memory_view,
|
|
7046
7347
|
emnapi_create_memory_view__deps: ["$emnapiCtx", "$emnapiExternalMemory", "napi_add_finalizer"],
|
|
7047
7348
|
emnapi_create_memory_view__sig: "ipippppp",
|
|
7349
|
+
emnapi_get_external_sharedarraybuffer_handle: _emnapi_get_external_sharedarraybuffer_handle,
|
|
7350
|
+
emnapi_get_external_sharedarraybuffer_handle__deps: ["$emnapiCtx", "$emnapiExternalMemory", "$emnapiExternalSAB"],
|
|
7351
|
+
emnapi_get_external_sharedarraybuffer_handle__sig: "ippp",
|
|
7048
7352
|
emnapi_get_memory_address: _emnapi_get_memory_address,
|
|
7049
7353
|
emnapi_get_memory_address__deps: ["$emnapiCtx", "$emnapiGetMemoryAddress"],
|
|
7050
7354
|
emnapi_get_memory_address__sig: "ipppp",
|
|
@@ -7066,6 +7370,9 @@ function _napi_get_version(env, result) {
|
|
|
7066
7370
|
emnapi_is_support_weakref: _emnapi_is_support_weakref,
|
|
7067
7371
|
emnapi_is_support_weakref__deps: ["$emnapiCtx"],
|
|
7068
7372
|
emnapi_is_support_weakref__sig: "i",
|
|
7373
|
+
emnapi_release_external_sharedarraybuffer: _emnapi_release_external_sharedarraybuffer,
|
|
7374
|
+
emnapi_release_external_sharedarraybuffer__deps: ["$emnapiExternalSAB"],
|
|
7375
|
+
emnapi_release_external_sharedarraybuffer__sig: "vp",
|
|
7069
7376
|
emnapi_sync_memory: _emnapi_sync_memory,
|
|
7070
7377
|
emnapi_sync_memory__deps: ["$emnapiCtx", "$emnapiExternalMemory", "$emnapiSyncMemory"],
|
|
7071
7378
|
emnapi_sync_memory__sig: "ipippp",
|
|
@@ -7079,7 +7386,7 @@ function _napi_get_version(env, result) {
|
|
|
7079
7386
|
napi_add_env_cleanup_hook__deps: ["$emnapiCtx"],
|
|
7080
7387
|
napi_add_env_cleanup_hook__sig: "ippp",
|
|
7081
7388
|
napi_adjust_external_memory: _napi_adjust_external_memory,
|
|
7082
|
-
napi_adjust_external_memory__deps: ["$emnapiCtx", "$emnapiSetValueI64"
|
|
7389
|
+
napi_adjust_external_memory__deps: ["$emnapiCtx", "$emnapiSetValueI64"],
|
|
7083
7390
|
napi_adjust_external_memory__sig: "ipjp",
|
|
7084
7391
|
napi_call_function: _napi_call_function,
|
|
7085
7392
|
napi_call_function__deps: ["$emnapiCtx"],
|
|
@@ -7498,6 +7805,9 @@ function _napi_get_version(env, result) {
|
|
|
7498
7805
|
node_api_create_buffer_from_arraybuffer: _node_api_create_buffer_from_arraybuffer,
|
|
7499
7806
|
node_api_create_buffer_from_arraybuffer__deps: ["$emnapiCtx", "$emnapiExternalMemory"],
|
|
7500
7807
|
node_api_create_buffer_from_arraybuffer__sig: "ippppp",
|
|
7808
|
+
node_api_create_external_sharedarraybuffer: _node_api_create_external_sharedarraybuffer,
|
|
7809
|
+
node_api_create_external_sharedarraybuffer__deps: ["$emnapiCtx", "$emnapiExternalSAB", "$emnapiExternalMemory"],
|
|
7810
|
+
node_api_create_external_sharedarraybuffer__sig: "ipppppp",
|
|
7501
7811
|
node_api_create_external_string_latin1: _node_api_create_external_string_latin1,
|
|
7502
7812
|
node_api_create_external_string_latin1__deps: ["$emnapiString", "napi_create_string_latin1"],
|
|
7503
7813
|
node_api_create_external_string_latin1__sig: "ippppppp",
|
package/include/node/emnapi.h
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
#include "emnapi_common.h"
|
|
7
7
|
|
|
8
8
|
#define EMNAPI_MAJOR_VERSION 1
|
|
9
|
-
#define EMNAPI_MINOR_VERSION
|
|
10
|
-
#define EMNAPI_PATCH_VERSION
|
|
9
|
+
#define EMNAPI_MINOR_VERSION 11
|
|
10
|
+
#define EMNAPI_PATCH_VERSION 0
|
|
11
11
|
|
|
12
12
|
typedef enum {
|
|
13
13
|
emnapi_runtime,
|
|
@@ -82,6 +82,31 @@ napi_status emnapi_get_memory_address(napi_env env,
|
|
|
82
82
|
emnapi_ownership* ownership,
|
|
83
83
|
bool* runtime_allocated);
|
|
84
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Get the handle for an external SharedArrayBuffer.
|
|
87
|
+
* This function must be called on the emnapi main thread.
|
|
88
|
+
*/
|
|
89
|
+
EMNAPI_EXTERN
|
|
90
|
+
napi_status emnapi_get_external_sharedarraybuffer_handle(
|
|
91
|
+
napi_env env,
|
|
92
|
+
napi_value sharedarraybuffer,
|
|
93
|
+
void** handle);
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Acquire a reference to an external SharedArrayBuffer handle.
|
|
97
|
+
* This function may be called from any thread.
|
|
98
|
+
*/
|
|
99
|
+
EMNAPI_EXTERN
|
|
100
|
+
void emnapi_acquire_external_sharedarraybuffer(void* handle);
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Release a reference to an external SharedArrayBuffer handle.
|
|
104
|
+
* When the refcount reaches zero, finalize_cb is invoked.
|
|
105
|
+
* This function may be called from any thread.
|
|
106
|
+
*/
|
|
107
|
+
EMNAPI_EXTERN
|
|
108
|
+
void emnapi_release_external_sharedarraybuffer(void* handle);
|
|
109
|
+
|
|
85
110
|
EXTERN_C_END
|
|
86
111
|
|
|
87
112
|
#endif
|
|
@@ -443,6 +443,16 @@ napi_create_external_arraybuffer(napi_env env,
|
|
|
443
443
|
node_api_basic_finalize finalize_cb,
|
|
444
444
|
void* finalize_hint,
|
|
445
445
|
napi_value* result);
|
|
446
|
+
#ifdef NAPI_EXPERIMENTAL
|
|
447
|
+
#define NODE_API_EXPERIMENTAL_HAS_CREATE_EXTERNAL_SHAREDARRAYBUFFER
|
|
448
|
+
NAPI_EXTERN napi_status NAPI_CDECL
|
|
449
|
+
node_api_create_external_sharedarraybuffer(napi_env env,
|
|
450
|
+
void* external_data,
|
|
451
|
+
size_t byte_length,
|
|
452
|
+
node_api_noenv_finalize finalize_cb,
|
|
453
|
+
void* finalize_hint,
|
|
454
|
+
napi_value* result);
|
|
455
|
+
#endif // NAPI_EXPERIMENTAL
|
|
446
456
|
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
447
457
|
NAPI_EXTERN napi_status NAPI_CDECL napi_get_arraybuffer_info(
|
|
448
458
|
napi_env env, napi_value arraybuffer, void** data, size_t* byte_length);
|
|
@@ -188,6 +188,10 @@ typedef void(NAPI_CDECL* node_api_nogc_finalize)(node_api_nogc_env env,
|
|
|
188
188
|
#endif
|
|
189
189
|
typedef node_api_nogc_finalize node_api_basic_finalize;
|
|
190
190
|
|
|
191
|
+
// A finalizer that can be called from any thread and at any time.
|
|
192
|
+
typedef void(NAPI_CDECL* node_api_noenv_finalize)(void* finalize_data,
|
|
193
|
+
void* finalize_hint);
|
|
194
|
+
|
|
191
195
|
typedef struct {
|
|
192
196
|
// One of utf8name or name should be NULL.
|
|
193
197
|
const char* utf8name;
|
|
Binary file
|
package/lib/wasm32/libdlmalloc.a
CHANGED
|
Binary file
|
|
Binary file
|
package/lib/wasm32/libemmalloc.a
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lib/wasm32/libemnapi.a
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|