From a00474ef0e833c3d09435f080b6ff9aae9b342f8 Mon Sep 17 00:00:00 2001 From: Vladislav Botvin Date: Sat, 26 Oct 2019 01:43:34 +0300 Subject: [PATCH] #42 shared memory support --- __tests__/shared.ts | 21 +++++++++++++++++++++ src/interfaces.ts | 3 ++- src/worker-pool.ts | 2 +- src/worker.ts | 2 +- 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 __tests__/shared.ts diff --git a/__tests__/shared.ts b/__tests__/shared.ts new file mode 100644 index 0000000..67b0229 --- /dev/null +++ b/__tests__/shared.ts @@ -0,0 +1,21 @@ +import { job, stop, start } from '../src/job' + +beforeAll(async () => await start()) +afterAll(async () => await stop()) + +describe('Job Shared Testing', () => { + it('should mutate shared inside job', async () => { + const sab = new SharedArrayBuffer(Float64Array.BYTES_PER_ELEMENT) + const shared = new Float64Array(sab) + shared[0] = 1 + + await job( + () => { + shared[0] = 2 + }, + { shared } + ) + + expect(shared[0]).toEqual(2) + }) +}) diff --git a/src/interfaces.ts b/src/interfaces.ts index cefe595..50521ad 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -1,8 +1,9 @@ import { Worker } from 'worker_threads' -export interface Config { +export interface Config { ctx?: T data?: U + shared?: V } export interface Task { diff --git a/src/worker-pool.ts b/src/worker-pool.ts index c34572e..3d75cd6 100644 --- a/src/worker-pool.ts +++ b/src/worker-pool.ts @@ -124,7 +124,7 @@ class WorkerPool { this.tick() }) - worker.postMessage(workerStr) + worker.postMessage({worker: workerStr, shared: config.shared}) } catch (err) { this.free(worker) reject(err) diff --git a/src/worker.ts b/src/worker.ts index 19ecc5c..3cc20d6 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -1,7 +1,7 @@ export const workerFile = ` const { parentPort } = require('worker_threads') -parentPort.on('message', async worker => { +parentPort.on('message', async ({worker, shared}) => { const response = { error: null, data: null