summaryrefslogtreecommitdiff
path: root/test_ffi/tests/thread_safe_test_worker.js
blob: 0670044698a3e50b4f92ce6a1fbdca75653e2594 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Copyright 2018-2022 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.unref();
  }
  self.postMessage("done");
});