// New creates a new worker, which corresponds to a V8 isolate. A single threaded // standalone execution context. func New(cb ReceiveMessageCallback, syncCB ReceiveSyncMessageCallback) *Worker { id := nextWorkerId() cbWrapper := &callbacks{ cb: cb, syncCB: syncCB, } callbacksMapLocker.Lock() callbacksMap[id] = cbWrapper callbacksMapLocker.Unlock() initV8Once.Do(func() { C.v8_init() }) worker := &Worker{} worker.cWorker = C.worker_new(C.int(id)) runtime.SetFinalizer(worker, func(final_worker *Worker) { C.worker_dispose(final_worker.cWorker) callbacksMapLocker.Lock() delete(callbacksMap, id) callbacksMapLocker.Unlock() }) return worker }
// Creates a new worker, which corresponds to a V8 isolate. A single threaded // standalone execution context. func New(cb ReceiveMessageCallback, recvSync_cb ReceiveSyncMessageCallback) *Worker { worker := &Worker{ cb: cb, recvSync_cb: recvSync_cb, } initV8Once.Do(func() { C.v8_init() }) callback := C.worker_recv_cb(C.go_recv_cb) receiveSync_callback := C.worker_recvSync_cb(C.go_recvSync_cb) worker.cWorker = C.worker_new(callback, receiveSync_callback, unsafe.Pointer(worker)) runtime.SetFinalizer(worker, func(final_worker *Worker) { C.worker_dispose(final_worker.cWorker) // Delete this worker on finalize (GC) }) return worker }