mirror of
https://github.com/denoland/deno.git
synced 2024-11-22 15:06:54 -05:00
3be5381060
Attempts to fix the thread_safe_callback flakiness. It's unclear what the flake is about, the exit code is apparently `C0000005` or `ACCESS_VIOLATION`, pointing to an issue with memory access. My only guess is that maybe dropping the `Option<extern "C" fn ()>` is somehow checking the validity of the function pointer and since the function has been dropped, the pointer is no longer valid and sometimes points to memory that should not be accessed. So now the will explicitly drop the functions before they get deallocated. If this doesn't fix the flake then something beyond my understanding is wrong.
41 lines
1,000 B
JavaScript
41 lines
1,000 B
JavaScript
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
// deno-lint-ignore-file
|
|
|
|
const targetDir = Deno.execPath().replace(/[^\/\\]+$/, "");
|
|
const [libPrefix, libSuffix] = {
|
|
darwin: ["lib", "dylib"],
|
|
linux: ["lib", "so"],
|
|
windows: ["", "dll"],
|
|
}[Deno.build.os];
|
|
const libPath = `${targetDir}/${libPrefix}test_ffi.${libSuffix}`;
|
|
|
|
const dylib = Deno.dlopen(libPath, {
|
|
store_function: {
|
|
parameters: ["function"],
|
|
result: "void",
|
|
},
|
|
call_stored_function: {
|
|
parameters: [],
|
|
result: "void",
|
|
},
|
|
});
|
|
|
|
const callback = new Deno.UnsafeCallback(
|
|
{ parameters: [], result: "void" },
|
|
() => {
|
|
console.log("Callback on worker thread");
|
|
},
|
|
);
|
|
|
|
callback.ref();
|
|
|
|
self.addEventListener("message", ({ data }) => {
|
|
if (data === "register") {
|
|
dylib.symbols.store_function(callback.pointer);
|
|
} else if (data === "call") {
|
|
dylib.symbols.call_stored_function();
|
|
} else if (data === "unref") {
|
|
callback.close();
|
|
}
|
|
self.postMessage("done");
|
|
});
|