emnapi 1.10.0 → 1.11.1
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 +351 -88
- 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/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) {
|
|
@@ -299,7 +299,7 @@ function __emnapi_worker_unref(pid) {
|
|
|
299
299
|
* @__postset
|
|
300
300
|
* ```
|
|
301
301
|
* PThread.unusedWorkers.forEach(emnapiAddSendListener);
|
|
302
|
-
* PThread.
|
|
302
|
+
* Object.values(PThread.pthreads).forEach(emnapiAddSendListener);
|
|
303
303
|
* (function () {
|
|
304
304
|
* var __original_getNewWorker = PThread.getNewWorker;
|
|
305
305
|
* PThread.getNewWorker = function () {
|
|
@@ -1085,6 +1085,73 @@ var emnapiExternalMemory = {
|
|
|
1085
1085
|
return { address: address === 0 ? 0 : (address + view.byteOffset), ownership: ownership, runtimeAllocated: runtimeAllocated, view: view };
|
|
1086
1086
|
}
|
|
1087
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
|
+
};
|
|
1088
1155
|
/**
|
|
1089
1156
|
* @__sig ippp
|
|
1090
1157
|
*/
|
|
@@ -2854,7 +2921,107 @@ function _emnapi_get_runtime_version(env, version) {
|
|
|
2854
2921
|
{{{ makeSetValue('version', 8, 'versions[2]', 'u32') }}};
|
|
2855
2922
|
return envObject.clearLastError();
|
|
2856
2923
|
}
|
|
2857
|
-
|
|
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
|
+
}
|
|
2858
3025
|
// emnapiImplementHelper('$emnapiGetMemoryAddress', undefined, emnapiGetMemoryAddress, ['$emnapiExternalMemory'], 'getMemoryAddress')
|
|
2859
3026
|
/**
|
|
2860
3027
|
* @__sig ipp
|
|
@@ -3101,6 +3268,64 @@ function _napi_create_external_arraybuffer(env, external_data, byte_length, fina
|
|
|
3101
3268
|
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
3102
3269
|
}
|
|
3103
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
|
+
}
|
|
3104
3329
|
/**
|
|
3105
3330
|
* @__sig ipp
|
|
3106
3331
|
*/
|
|
@@ -3218,9 +3443,6 @@ function _napi_create_typedarray(env, type, length, arraybuffer, byte_offset, re
|
|
|
3218
3443
|
if (!result)
|
|
3219
3444
|
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3220
3445
|
var handle = emnapiCtx.handleStore.get(arraybuffer);
|
|
3221
|
-
if (!handle.isArrayBuffer()) {
|
|
3222
|
-
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3223
|
-
}
|
|
3224
3446
|
var buffer = handle.value;
|
|
3225
3447
|
{{{ from64('byte_offset') }}};
|
|
3226
3448
|
{{{ from64('length') }}};
|
|
@@ -3260,36 +3482,41 @@ function _napi_create_typedarray(env, type, length, arraybuffer, byte_offset, re
|
|
|
3260
3482
|
{{{ makeSetValue('result', 0, 'value', '*') }}};
|
|
3261
3483
|
return envObject.getReturnStatus();
|
|
3262
3484
|
};
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
|
|
3266
|
-
|
|
3267
|
-
|
|
3268
|
-
|
|
3269
|
-
|
|
3270
|
-
|
|
3271
|
-
|
|
3272
|
-
|
|
3273
|
-
|
|
3274
|
-
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
3281
|
-
|
|
3282
|
-
|
|
3283
|
-
|
|
3284
|
-
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
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:
|
|
3288
3515
|
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3516
|
+
}
|
|
3517
|
+
}
|
|
3518
|
+
else {
|
|
3519
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3293
3520
|
}
|
|
3294
3521
|
}
|
|
3295
3522
|
catch (err) {
|
|
@@ -5609,7 +5836,7 @@ var emnapiTSFN = {
|
|
|
5609
5836
|
emnapiTSFN.offset.mutex = emnapiTSFN.offset.mutex + 4;
|
|
5610
5837
|
if (typeof PThread !== 'undefined') {
|
|
5611
5838
|
PThread.unusedWorkers.forEach(emnapiTSFN.addListener);
|
|
5612
|
-
PThread.
|
|
5839
|
+
Object.values(PThread.pthreads).forEach(emnapiTSFN.addListener);
|
|
5613
5840
|
var __original_getNewWorker_1 = PThread.getNewWorker;
|
|
5614
5841
|
PThread.getNewWorker = function () {
|
|
5615
5842
|
var r = __original_getNewWorker_1.apply(this, arguments);
|
|
@@ -5631,7 +5858,7 @@ var emnapiTSFN = {
|
|
|
5631
5858
|
var payload = __emnapi__.payload;
|
|
5632
5859
|
if (type === 'tsfn-send') {
|
|
5633
5860
|
var pendng = payload.tsfn + emnapiTSFN.offset.async_pending;
|
|
5634
|
-
if (Atomics.load(new Int32Array(
|
|
5861
|
+
if (Atomics.load(new Int32Array(emnapiTSFN.ensureBufferFor(pendng + 4)), pendng >>> 2) !== 0) {
|
|
5635
5862
|
emnapiTSFN.enqueue(payload.tsfn);
|
|
5636
5863
|
}
|
|
5637
5864
|
}
|
|
@@ -5655,13 +5882,28 @@ var emnapiTSFN = {
|
|
|
5655
5882
|
}
|
|
5656
5883
|
return true;
|
|
5657
5884
|
},
|
|
5885
|
+
/**
|
|
5886
|
+
* When another thread grows the shared WebAssembly.Memory, this agent's
|
|
5887
|
+
* cached `wasmMemory.buffer` may still have the old shorter length
|
|
5888
|
+
* (V8 refreshes it lazily). If a pointer derived from shared memory lies
|
|
5889
|
+
* beyond the cached length, `wasmMemory.grow(0)` forces the agent to
|
|
5890
|
+
* observe the current memory size and refreshes the buffer.
|
|
5891
|
+
*/
|
|
5892
|
+
ensureBufferFor: function (end) {
|
|
5893
|
+
var buffer = wasmMemory.buffer;
|
|
5894
|
+
if (end > buffer.byteLength) {
|
|
5895
|
+
wasmMemory.grow(0);
|
|
5896
|
+
buffer = wasmMemory.buffer;
|
|
5897
|
+
}
|
|
5898
|
+
return buffer;
|
|
5899
|
+
},
|
|
5658
5900
|
initQueue: function (func) {
|
|
5659
5901
|
var size = 2 * {{{ POINTER_SIZE }}};
|
|
5660
5902
|
var queue = _malloc({{{ to64('size') }}});
|
|
5661
5903
|
if (!queue)
|
|
5662
5904
|
return false;
|
|
5663
5905
|
{{{ from64('queue') }}};
|
|
5664
|
-
new Uint8Array(
|
|
5906
|
+
new Uint8Array(emnapiTSFN.ensureBufferFor(queue + size), queue, size).fill(0);
|
|
5665
5907
|
emnapiTSFN.storeSizeTypeValue(func + emnapiTSFN.offset.queue, queue, false);
|
|
5666
5908
|
return true;
|
|
5667
5909
|
},
|
|
@@ -5768,7 +6010,7 @@ var emnapiTSFN = {
|
|
|
5768
6010
|
var mutex = {
|
|
5769
6011
|
lock: function () {
|
|
5770
6012
|
var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE;
|
|
5771
|
-
var i32a = new Int32Array(
|
|
6013
|
+
var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
|
|
5772
6014
|
if (isBrowserMain) {
|
|
5773
6015
|
while (true) {
|
|
5774
6016
|
var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);
|
|
@@ -5791,7 +6033,7 @@ var emnapiTSFN = {
|
|
|
5791
6033
|
return new Promise<void>(resolve => {
|
|
5792
6034
|
const again = (): void => { fn() }
|
|
5793
6035
|
const fn = (): void => {
|
|
5794
|
-
const i32a = new Int32Array(
|
|
6036
|
+
const i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1)
|
|
5795
6037
|
const oldValue = Atomics.compareExchange(i32a, 0, 0, 10)
|
|
5796
6038
|
if (oldValue === 0) {
|
|
5797
6039
|
resolve()
|
|
@@ -5803,7 +6045,7 @@ var emnapiTSFN = {
|
|
|
5803
6045
|
})
|
|
5804
6046
|
}, */
|
|
5805
6047
|
unlock: function () {
|
|
5806
|
-
var i32a = new Int32Array(
|
|
6048
|
+
var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
|
|
5807
6049
|
var oldValue = Atomics.compareExchange(i32a, 0, 10, 0);
|
|
5808
6050
|
if (oldValue !== 10) {
|
|
5809
6051
|
throw new Error('Tried to unlock while not holding the mutex');
|
|
@@ -5837,14 +6079,14 @@ var emnapiTSFN = {
|
|
|
5837
6079
|
var mutex = emnapiTSFN.getMutex(func);
|
|
5838
6080
|
var cond = {
|
|
5839
6081
|
wait: function () {
|
|
5840
|
-
var i32a = new Int32Array(
|
|
6082
|
+
var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
|
|
5841
6083
|
var value = Atomics.load(i32a, 0);
|
|
5842
6084
|
mutex.unlock();
|
|
5843
6085
|
Atomics.wait(i32a, 0, value);
|
|
5844
6086
|
mutex.lock();
|
|
5845
6087
|
},
|
|
5846
6088
|
/* waitAsync () {
|
|
5847
|
-
const i32a = new Int32Array(
|
|
6089
|
+
const i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1)
|
|
5848
6090
|
const value = Atomics.load(i32a, 0)
|
|
5849
6091
|
mutex.unlock()
|
|
5850
6092
|
const lock = (): Promise<void> => mutex.lockAsync()
|
|
@@ -5855,7 +6097,7 @@ var emnapiTSFN = {
|
|
|
5855
6097
|
}
|
|
5856
6098
|
}, */
|
|
5857
6099
|
signal: function () {
|
|
5858
|
-
var i32a = new Int32Array(
|
|
6100
|
+
var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
|
|
5859
6101
|
Atomics.add(i32a, 0, 1);
|
|
5860
6102
|
Atomics.notify(i32a, 0, 1);
|
|
5861
6103
|
}
|
|
@@ -5869,10 +6111,10 @@ var emnapiTSFN = {
|
|
|
5869
6111
|
var offset = emnapiTSFN.offset.queue_size;
|
|
5870
6112
|
var arr, index;
|
|
5871
6113
|
#if MEMORY64
|
|
5872
|
-
arr = new BigUint64Array(
|
|
6114
|
+
arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
|
|
5873
6115
|
index = (func + offset) >>> 3;
|
|
5874
6116
|
#else
|
|
5875
|
-
arr = new Uint32Array(
|
|
6117
|
+
arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
|
|
5876
6118
|
index = (func + offset) >>> 2;
|
|
5877
6119
|
#endif
|
|
5878
6120
|
Atomics.add(arr, index, {{{ to64('1') }}});
|
|
@@ -5881,10 +6123,10 @@ var emnapiTSFN = {
|
|
|
5881
6123
|
var offset = emnapiTSFN.offset.queue_size;
|
|
5882
6124
|
var arr, index;
|
|
5883
6125
|
#if MEMORY64
|
|
5884
|
-
arr = new BigUint64Array(
|
|
6126
|
+
arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
|
|
5885
6127
|
index = (func + offset) >>> 3;
|
|
5886
6128
|
#else
|
|
5887
|
-
arr = new Uint32Array(
|
|
6129
|
+
arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
|
|
5888
6130
|
index = (func + offset) >>> 2;
|
|
5889
6131
|
#endif
|
|
5890
6132
|
Atomics.sub(arr, index, {{{ to64('1') }}});
|
|
@@ -5896,10 +6138,10 @@ var emnapiTSFN = {
|
|
|
5896
6138
|
var offset = emnapiTSFN.offset.thread_count;
|
|
5897
6139
|
var arr, index;
|
|
5898
6140
|
#if MEMORY64
|
|
5899
|
-
arr = new BigUint64Array(
|
|
6141
|
+
arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
|
|
5900
6142
|
index = (func + offset) >>> 3;
|
|
5901
6143
|
#else
|
|
5902
|
-
arr = new Uint32Array(
|
|
6144
|
+
arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
|
|
5903
6145
|
index = (func + offset) >>> 2;
|
|
5904
6146
|
#endif
|
|
5905
6147
|
Atomics.add(arr, index, {{{ to64('1') }}});
|
|
@@ -5908,28 +6150,28 @@ var emnapiTSFN = {
|
|
|
5908
6150
|
var offset = emnapiTSFN.offset.thread_count;
|
|
5909
6151
|
var arr, index;
|
|
5910
6152
|
#if MEMORY64
|
|
5911
|
-
arr = new BigUint64Array(
|
|
6153
|
+
arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
|
|
5912
6154
|
index = (func + offset) >>> 3;
|
|
5913
6155
|
#else
|
|
5914
|
-
arr = new Uint32Array(
|
|
6156
|
+
arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
|
|
5915
6157
|
index = (func + offset) >>> 2;
|
|
5916
6158
|
#endif
|
|
5917
6159
|
Atomics.sub(arr, index, {{{ to64('1') }}});
|
|
5918
6160
|
},
|
|
5919
6161
|
getState: function (func) {
|
|
5920
|
-
return Atomics.load(new Int32Array(
|
|
6162
|
+
return Atomics.load(new Int32Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.state + 4)), (func + emnapiTSFN.offset.state) >>> 2);
|
|
5921
6163
|
},
|
|
5922
6164
|
setState: function (func, value) {
|
|
5923
|
-
Atomics.store(new Int32Array(
|
|
6165
|
+
Atomics.store(new Int32Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.state + 4)), (func + emnapiTSFN.offset.state) >>> 2, value);
|
|
5924
6166
|
},
|
|
5925
6167
|
getHandlesClosing: function (func) {
|
|
5926
|
-
return Atomics.load(new Int8Array(
|
|
6168
|
+
return Atomics.load(new Int8Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.handles_closing + 1)), (func + emnapiTSFN.offset.handles_closing));
|
|
5927
6169
|
},
|
|
5928
6170
|
setHandlesClosing: function (func, value) {
|
|
5929
|
-
Atomics.store(new Int8Array(
|
|
6171
|
+
Atomics.store(new Int8Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.handles_closing + 1)), (func + emnapiTSFN.offset.handles_closing), value);
|
|
5930
6172
|
},
|
|
5931
6173
|
getDispatchState: function (func) {
|
|
5932
|
-
return Atomics.load(new Uint32Array(
|
|
6174
|
+
return Atomics.load(new Uint32Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.dispatch_state + 4)), (func + emnapiTSFN.offset.dispatch_state) >>> 2);
|
|
5933
6175
|
},
|
|
5934
6176
|
getContext: function (func) {
|
|
5935
6177
|
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.context, false);
|
|
@@ -5960,20 +6202,20 @@ var emnapiTSFN = {
|
|
|
5960
6202
|
var arr;
|
|
5961
6203
|
if (unsigned) {
|
|
5962
6204
|
#if MEMORY64
|
|
5963
|
-
arr = new BigUint64Array(
|
|
6205
|
+
arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(offset + 8));
|
|
5964
6206
|
ret = Number(Atomics.load(arr, offset >>> 3));
|
|
5965
6207
|
#else
|
|
5966
|
-
arr = new Uint32Array(
|
|
6208
|
+
arr = new Uint32Array(emnapiTSFN.ensureBufferFor(offset + 4));
|
|
5967
6209
|
ret = Atomics.load(arr, offset >>> 2);
|
|
5968
6210
|
#endif
|
|
5969
6211
|
return ret;
|
|
5970
6212
|
}
|
|
5971
6213
|
else {
|
|
5972
6214
|
#if MEMORY64
|
|
5973
|
-
arr = new BigInt64Array(
|
|
6215
|
+
arr = new BigInt64Array(emnapiTSFN.ensureBufferFor(offset + 8));
|
|
5974
6216
|
ret = Number(Atomics.load(arr, offset >>> 3));
|
|
5975
6217
|
#else
|
|
5976
|
-
arr = new Int32Array(
|
|
6218
|
+
arr = new Int32Array(emnapiTSFN.ensureBufferFor(offset + 4));
|
|
5977
6219
|
ret = Atomics.load(arr, offset >>> 2);
|
|
5978
6220
|
#endif
|
|
5979
6221
|
return ret;
|
|
@@ -5983,20 +6225,20 @@ var emnapiTSFN = {
|
|
|
5983
6225
|
var arr;
|
|
5984
6226
|
if (unsigned) {
|
|
5985
6227
|
#if MEMORY64
|
|
5986
|
-
arr = new BigUint64Array(
|
|
6228
|
+
arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(offset + 8));
|
|
5987
6229
|
Atomics.store(arr, offset >>> 3, BigInt(value));
|
|
5988
6230
|
#else
|
|
5989
|
-
arr = new Uint32Array(
|
|
6231
|
+
arr = new Uint32Array(emnapiTSFN.ensureBufferFor(offset + 4));
|
|
5990
6232
|
Atomics.store(arr, offset >>> 2, value);
|
|
5991
6233
|
#endif
|
|
5992
6234
|
return undefined;
|
|
5993
6235
|
}
|
|
5994
6236
|
else {
|
|
5995
6237
|
#if MEMORY64
|
|
5996
|
-
arr = new BigInt64Array(
|
|
6238
|
+
arr = new BigInt64Array(emnapiTSFN.ensureBufferFor(offset + 8));
|
|
5997
6239
|
Atomics.store(arr, offset >>> 3, BigInt(value >>> 0));
|
|
5998
6240
|
#else
|
|
5999
|
-
arr = new Int32Array(
|
|
6241
|
+
arr = new Int32Array(emnapiTSFN.ensureBufferFor(offset + 4));
|
|
6000
6242
|
Atomics.store(arr, offset >>> 2, value >>> 0);
|
|
6001
6243
|
#endif
|
|
6002
6244
|
return undefined;
|
|
@@ -6013,18 +6255,20 @@ var emnapiTSFN = {
|
|
|
6013
6255
|
}
|
|
6014
6256
|
var resource = emnapiTSFN.getResource(func);
|
|
6015
6257
|
emnapiCtx.refStore.get(resource).dispose();
|
|
6258
|
+
emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.is_some + 1);
|
|
6016
6259
|
{{{ makeSetValue('func', 'emnapiTSFN.offset.is_some', '0', 'i8') }}};
|
|
6017
6260
|
emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func);
|
|
6018
6261
|
envObject.unref();
|
|
6019
|
-
var
|
|
6020
|
-
var
|
|
6262
|
+
var asyncRefAddress = func + emnapiTSFN.offset.async_ref;
|
|
6263
|
+
var asyncRefOffset = asyncRefAddress >>> 2;
|
|
6264
|
+
var arr = new Uint32Array(emnapiTSFN.ensureBufferFor(asyncRefAddress + 4));
|
|
6021
6265
|
if (Atomics.load(arr, asyncRefOffset) > 0) {
|
|
6022
6266
|
Atomics.store(arr, asyncRefOffset, 0);
|
|
6023
6267
|
__emnapi_runtime_keepalive_pop();
|
|
6024
6268
|
emnapiCtx.decreaseWaitingRequestCounter();
|
|
6025
6269
|
}
|
|
6026
6270
|
if (emnapiNodeBinding) {
|
|
6027
|
-
var view = new DataView(
|
|
6271
|
+
var view = new DataView(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.trigger_async_id + 8));
|
|
6028
6272
|
var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
|
|
6029
6273
|
var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
|
|
6030
6274
|
__emnapi_node_emit_async_destroy(asyncId, triggerAsyncId);
|
|
@@ -6089,7 +6333,7 @@ var emnapiTSFN = {
|
|
|
6089
6333
|
var resource = emnapiTSFN.getResource(func);
|
|
6090
6334
|
var resource_value = emnapiCtx.refStore.get(resource).get();
|
|
6091
6335
|
var resourceObject = emnapiCtx.handleStore.get(resource_value).value;
|
|
6092
|
-
var view = new DataView(
|
|
6336
|
+
var view = new DataView(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.trigger_async_id + 8));
|
|
6093
6337
|
var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
|
|
6094
6338
|
var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
|
|
6095
6339
|
emnapiNodeBinding.node.makeCallback(resourceObject, f, [], {
|
|
@@ -6127,7 +6371,7 @@ var emnapiTSFN = {
|
|
|
6127
6371
|
return;
|
|
6128
6372
|
}
|
|
6129
6373
|
emnapiTSFN.setHandlesClosing(func, 1);
|
|
6130
|
-
Atomics.store(new Int32Array(
|
|
6374
|
+
Atomics.store(new Int32Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.async_pending + 4)), (func + emnapiTSFN.offset.async_pending) >>> 2, 1);
|
|
6131
6375
|
emnapiCtx.feature.setImmediate(function () {
|
|
6132
6376
|
emnapiTSFN.finalize(func);
|
|
6133
6377
|
});
|
|
@@ -6199,7 +6443,7 @@ var emnapiTSFN = {
|
|
|
6199
6443
|
var resource = emnapiTSFN.getResource(func);
|
|
6200
6444
|
var resource_value = emnapiCtx.refStore.get(resource).get();
|
|
6201
6445
|
var resourceObject = emnapiCtx.handleStore.get(resource_value).value;
|
|
6202
|
-
var view = new DataView(
|
|
6446
|
+
var view = new DataView(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.trigger_async_id + 8));
|
|
6203
6447
|
emnapiNodeBinding.node.makeCallback(resourceObject, f, [], {
|
|
6204
6448
|
asyncId: view.getFloat64(func + emnapiTSFN.offset.async_id, true),
|
|
6205
6449
|
triggerAsyncId: view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true)
|
|
@@ -6218,8 +6462,9 @@ var emnapiTSFN = {
|
|
|
6218
6462
|
dispatch: function (func) {
|
|
6219
6463
|
var has_more = true;
|
|
6220
6464
|
var iterations_left = 1000;
|
|
6221
|
-
var
|
|
6222
|
-
var
|
|
6465
|
+
var dispatchStateAddress = func + emnapiTSFN.offset.dispatch_state;
|
|
6466
|
+
var ui32a = new Uint32Array(emnapiTSFN.ensureBufferFor(dispatchStateAddress + 4));
|
|
6467
|
+
var index = dispatchStateAddress >>> 2;
|
|
6223
6468
|
while (has_more && --iterations_left !== 0) {
|
|
6224
6469
|
Atomics.store(ui32a, index, 1);
|
|
6225
6470
|
has_more = emnapiTSFN.dispatchOne(func);
|
|
@@ -6238,7 +6483,7 @@ var emnapiTSFN = {
|
|
|
6238
6483
|
// `scheduled` prevents queueing the same main-thread drain chain more than
|
|
6239
6484
|
// once while a previous wakeup is still in flight.
|
|
6240
6485
|
var scheduled = func + emnapiTSFN.offset.async_u_fd;
|
|
6241
|
-
var i32a = new Int32Array(
|
|
6486
|
+
var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(Math.max(pending, scheduled) + 4));
|
|
6242
6487
|
if (Atomics.exchange(i32a, scheduled >>> 2, 1) !== 0) {
|
|
6243
6488
|
return;
|
|
6244
6489
|
}
|
|
@@ -6282,17 +6527,18 @@ var emnapiTSFN = {
|
|
|
6282
6527
|
});
|
|
6283
6528
|
},
|
|
6284
6529
|
send: function (func) {
|
|
6285
|
-
var
|
|
6530
|
+
var dispatchStateAddress = func + emnapiTSFN.offset.dispatch_state;
|
|
6531
|
+
var current_state = Atomics.or(new Uint32Array(emnapiTSFN.ensureBufferFor(dispatchStateAddress + 4)), dispatchStateAddress >>> 2, 1 << 1);
|
|
6286
6532
|
if ((current_state & 1) === 1) {
|
|
6287
6533
|
return;
|
|
6288
6534
|
}
|
|
6289
6535
|
var pendng = func + emnapiTSFN.offset.async_pending;
|
|
6290
6536
|
// A wakeup is already pending, so this send only needs to leave the queued
|
|
6291
6537
|
// work in the TSFN queue and let the existing drain pick it up.
|
|
6292
|
-
if (Atomics.load(new Int32Array(
|
|
6538
|
+
if (Atomics.load(new Int32Array(emnapiTSFN.ensureBufferFor(pendng + 4)), pendng >>> 2) !== 0) {
|
|
6293
6539
|
return;
|
|
6294
6540
|
}
|
|
6295
|
-
if (Atomics.exchange(new Int32Array(
|
|
6541
|
+
if (Atomics.exchange(new Int32Array(emnapiTSFN.ensureBufferFor(pendng + 4)), pendng >>> 2, 1) === 0) {
|
|
6296
6542
|
if ((typeof ENVIRONMENT_IS_PTHREAD !== 'undefined') && ENVIRONMENT_IS_PTHREAD) {
|
|
6297
6543
|
// Worker threads only post a wakeup token. Main-thread draining is
|
|
6298
6544
|
// serialized by enqueue() once the message is received.
|
|
@@ -6375,7 +6621,7 @@ function _napi_create_threadsafe_function(env, func, async_resource, async_resou
|
|
|
6375
6621
|
if (!tsfn)
|
|
6376
6622
|
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
|
|
6377
6623
|
{{{ from64('tsfn') }}};
|
|
6378
|
-
new Uint8Array(
|
|
6624
|
+
new Uint8Array(emnapiTSFN.ensureBufferFor(tsfn + sizeofTSFN)).subarray(tsfn, tsfn + sizeofTSFN).fill(0);
|
|
6379
6625
|
var resourceRef = emnapiCtx.createReference(envObject, resource, 1, 1 /* ReferenceOwnership.kUserland */);
|
|
6380
6626
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
6381
6627
|
var resource_ = resourceRef.id;
|
|
@@ -6488,8 +6734,9 @@ function _napi_unref_threadsafe_function(env, func) {
|
|
|
6488
6734
|
return 1 /* napi_status.napi_invalid_arg */;
|
|
6489
6735
|
}
|
|
6490
6736
|
{{{ from64('func') }}};
|
|
6491
|
-
var
|
|
6492
|
-
var
|
|
6737
|
+
var asyncRefAddress = func + emnapiTSFN.offset.async_ref;
|
|
6738
|
+
var asyncRefOffset = asyncRefAddress >>> 2;
|
|
6739
|
+
var arr = new Uint32Array(emnapiTSFN.ensureBufferFor(asyncRefAddress + 4));
|
|
6493
6740
|
var currentValue = Atomics.load(arr, asyncRefOffset);
|
|
6494
6741
|
if (currentValue > 0) {
|
|
6495
6742
|
Atomics.store(arr, asyncRefOffset, currentValue - 1);
|
|
@@ -6507,8 +6754,9 @@ function _napi_ref_threadsafe_function(env, func) {
|
|
|
6507
6754
|
return 1 /* napi_status.napi_invalid_arg */;
|
|
6508
6755
|
}
|
|
6509
6756
|
{{{ from64('func') }}};
|
|
6510
|
-
var
|
|
6511
|
-
var
|
|
6757
|
+
var asyncRefAddress = func + emnapiTSFN.offset.async_ref;
|
|
6758
|
+
var asyncRefOffset = asyncRefAddress >>> 2;
|
|
6759
|
+
var arr = new Uint32Array(emnapiTSFN.ensureBufferFor(asyncRefAddress + 4));
|
|
6512
6760
|
var currentValue = Atomics.load(arr, asyncRefOffset);
|
|
6513
6761
|
if (!currentValue) {
|
|
6514
6762
|
__emnapi_runtime_keepalive_push();
|
|
@@ -6999,14 +7247,18 @@ function _napi_get_version(env, result) {
|
|
|
6999
7247
|
return envObject.clearLastError();
|
|
7000
7248
|
}
|
|
7001
7249
|
(typeof addToLibrary === "function" ? addToLibrary : (...args) => mergeInto(LibraryManager.library, ...args))({
|
|
7002
|
-
$emnapiAddSendListener: emnapiAddSendListener,
|
|
7003
|
-
$emnapiAddSendListener__deps: ["$PThread"],
|
|
7004
|
-
$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})();",
|
|
7005
|
-
$emnapiAsyncWorkPoolSize: "0",
|
|
7006
7250
|
$emnapiCtx: "undefined",
|
|
7007
7251
|
$emnapiExternalMemory: emnapiExternalMemory,
|
|
7008
7252
|
$emnapiExternalMemory__deps: ["$emnapiCtx", "malloc", "free"],
|
|
7009
7253
|
$emnapiExternalMemory__postset: "emnapiExternalMemory.init();",
|
|
7254
|
+
$emnapiExternalSAB: emnapiExternalSAB,
|
|
7255
|
+
$emnapiExternalSAB__postset: "emnapiExternalSAB.init();",
|
|
7256
|
+
$emnapiAcquireExternalSharedArrayBuffer: emnapiAcquireExternalSharedArrayBuffer,
|
|
7257
|
+
$emnapiAcquireExternalSharedArrayBuffer__deps: ["$emnapiExternalMemory", "$emnapiExternalSAB"],
|
|
7258
|
+
$emnapiAddSendListener: emnapiAddSendListener,
|
|
7259
|
+
$emnapiAddSendListener__deps: ["$PThread"],
|
|
7260
|
+
$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})();",
|
|
7261
|
+
$emnapiAsyncWorkPoolSize: "0",
|
|
7010
7262
|
$emnapiGetMemoryAddress: emnapiGetMemoryAddress,
|
|
7011
7263
|
$emnapiGetMemoryAddress__deps: ["$emnapiExternalMemory"],
|
|
7012
7264
|
$emnapiModule: emnapiModule,
|
|
@@ -7105,6 +7357,8 @@ function _napi_get_version(env, result) {
|
|
|
7105
7357
|
_emnapi_worker_unref: __emnapi_worker_unref,
|
|
7106
7358
|
_emnapi_worker_unref__deps: ["$PThread"],
|
|
7107
7359
|
_emnapi_worker_unref__sig: "vp",
|
|
7360
|
+
emnapi_acquire_external_sharedarraybuffer: _emnapi_acquire_external_sharedarraybuffer,
|
|
7361
|
+
emnapi_acquire_external_sharedarraybuffer__sig: "vp",
|
|
7108
7362
|
$emnapiGetHandle: emnapiGetHandle,
|
|
7109
7363
|
$emnapiGetHandle__deps: ["$emnapiCtx", "$emnapiExternalMemory"],
|
|
7110
7364
|
napi_add_finalizer: _napi_add_finalizer,
|
|
@@ -7113,6 +7367,9 @@ function _napi_get_version(env, result) {
|
|
|
7113
7367
|
emnapi_create_memory_view: _emnapi_create_memory_view,
|
|
7114
7368
|
emnapi_create_memory_view__deps: ["$emnapiCtx", "$emnapiExternalMemory", "napi_add_finalizer"],
|
|
7115
7369
|
emnapi_create_memory_view__sig: "ipippppp",
|
|
7370
|
+
emnapi_get_external_sharedarraybuffer_handle: _emnapi_get_external_sharedarraybuffer_handle,
|
|
7371
|
+
emnapi_get_external_sharedarraybuffer_handle__deps: ["$emnapiCtx", "$emnapiExternalMemory", "$emnapiExternalSAB"],
|
|
7372
|
+
emnapi_get_external_sharedarraybuffer_handle__sig: "ippp",
|
|
7116
7373
|
emnapi_get_memory_address: _emnapi_get_memory_address,
|
|
7117
7374
|
emnapi_get_memory_address__deps: ["$emnapiCtx", "$emnapiGetMemoryAddress"],
|
|
7118
7375
|
emnapi_get_memory_address__sig: "ipppp",
|
|
@@ -7134,6 +7391,9 @@ function _napi_get_version(env, result) {
|
|
|
7134
7391
|
emnapi_is_support_weakref: _emnapi_is_support_weakref,
|
|
7135
7392
|
emnapi_is_support_weakref__deps: ["$emnapiCtx"],
|
|
7136
7393
|
emnapi_is_support_weakref__sig: "i",
|
|
7394
|
+
emnapi_release_external_sharedarraybuffer: _emnapi_release_external_sharedarraybuffer,
|
|
7395
|
+
emnapi_release_external_sharedarraybuffer__deps: ["$emnapiExternalSAB"],
|
|
7396
|
+
emnapi_release_external_sharedarraybuffer__sig: "vp",
|
|
7137
7397
|
emnapi_sync_memory: _emnapi_sync_memory,
|
|
7138
7398
|
emnapi_sync_memory__deps: ["$emnapiCtx", "$emnapiExternalMemory", "$emnapiSyncMemory"],
|
|
7139
7399
|
emnapi_sync_memory__sig: "ipippp",
|
|
@@ -7566,6 +7826,9 @@ function _napi_get_version(env, result) {
|
|
|
7566
7826
|
node_api_create_buffer_from_arraybuffer: _node_api_create_buffer_from_arraybuffer,
|
|
7567
7827
|
node_api_create_buffer_from_arraybuffer__deps: ["$emnapiCtx", "$emnapiExternalMemory"],
|
|
7568
7828
|
node_api_create_buffer_from_arraybuffer__sig: "ippppp",
|
|
7829
|
+
node_api_create_external_sharedarraybuffer: _node_api_create_external_sharedarraybuffer,
|
|
7830
|
+
node_api_create_external_sharedarraybuffer__deps: ["$emnapiCtx", "$emnapiExternalSAB", "$emnapiExternalMemory"],
|
|
7831
|
+
node_api_create_external_sharedarraybuffer__sig: "ipppppp",
|
|
7569
7832
|
node_api_create_external_string_latin1: _node_api_create_external_string_latin1,
|
|
7570
7833
|
node_api_create_external_string_latin1__deps: ["$emnapiString", "napi_create_string_latin1"],
|
|
7571
7834
|
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 1
|
|
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;
|