flock-worker.js 1.1 KB

12345678910111213141516171819202122232425262728293031
  1. /** Hold work before or inside its callback while the parent terminates this environment. */
  2. import assert from 'node:assert/strict';
  3. import { createHook } from 'node:async_hooks';
  4. import { parentPort, workerData } from 'node:worker_threads';
  5. import { tryLockExclusive } from '../../packages/entry/lib/flock.js';
  6. import { loadFlockBinding } from './flock-binding.js';
  7. let nativeWork = 0;
  8. const hook = createHook({
  9. init(_id, type) {
  10. if (type === 'flock') nativeWork++;
  11. },
  12. });
  13. hook.enable();
  14. try {
  15. if (workerData.phase === 'callback') {
  16. loadFlockBinding().tryLock(workerData.fd, () => {
  17. parentPort.postMessage({ type: 'callback', nativeWork });
  18. Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0);
  19. });
  20. } else {
  21. const pending = tryLockExclusive(workerData.fd);
  22. assert.equal(nativeWork, 1);
  23. parentPort.postMessage({ type: 'queued', nativeWork });
  24. // No JS yield precedes this wait, so the native completion cannot run first.
  25. Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0);
  26. await pending;
  27. }
  28. } finally {
  29. hook.disable();
  30. }