// Copyright 2015 The Emscripten Authors. All rights reserved.
// Emscripten is available under two separate licenses, the MIT license and the
// University of Illinois/NCSA Open Source License. Both these licenses can be
// found in the LICENSE file.
// Pthread Web Worker startup routine:
// This is the entry point file that is loaded first by each Web Worker
// that executes pthreads on the Emscripten application.
// Thread-local:
varthreadInfoStruct=0;// Info area for this thread in Emscripten HEAP (shared). If zero, this worker is not currently hosting an executing pthread.
varselfThreadId=0;// The ID of this thread. 0 if not hosting a pthread.
varparentThreadId=0;// The ID of the parent pthread that launched this thread.
varnoExitRuntime;
// performance.now() is specced to return a wallclock time in msecs since that Web Worker/main thread launched. However for pthreads this can cause
// subtle problems in emscripten_get_now() as this essentially would measure time from pthread_create(), meaning that the clocks between each threads
// would be wildly out of sync. Therefore sync all pthreads to the clock on the main browser thread, so that different threads see a somewhat
// coherent clock across each of them (+/- 0.1msecs in testing)
var__performance_now_clock_drift=0;
// Cannot use console.log or console.error in a web worker, since that would risk a browser deadlock! https://bugzilla.mozilla.org/show_bug.cgi?id=1049091
// Therefore implement custom logging facility for threads running in a worker, which queue the messages to main thread to print.
varModule={};
// These modes need to assign to these variables because of how scoping works in them.
}elseif(e.data.cmd==='run'){// This worker was idle, and now should start executing its pthread entry point.
__performance_now_clock_drift=performance.now()-e.data.time;// Sync up to the clock of the main thread.
threadInfoStruct=e.data.threadInfoStruct;
Module['__register_pthread_ptr'](threadInfoStruct,/*isMainBrowserThread=*/0,/*isMainRuntimeThread=*/0);// Pass the thread address inside the asm.js scope to store it for fast access that avoids the need for a FFI out.
selfThreadId=e.data.selfThreadId;
parentThreadId=e.data.parentThreadId;
// Establish the stack frame for this thread in global scope
Atomics.store(HEAPU32,(threadInfoStruct+4/*C_STRUCTS.pthread.threadExitCode*/)>>2,(einstanceofModule['ExitStatus'])?e.status:-2/*A custom entry specific to Emscripten denoting that the thread crashed.*/);
Atomics.store(HEAPU32,(threadInfoStruct+0/*C_STRUCTS.pthread.threadStatus*/)>>2,1);// Mark the thread as no longer running.
Module['_emscripten_futex_wake'](threadInfoStruct+0/*C_STRUCTS.pthread.threadStatus*/,0x7FFFFFFF/*INT_MAX*/);// Wake all threads waiting on this thread to finish.
if(!(einstanceofModule['ExitStatus']))throwe;
}
}
// The thread might have finished without calling pthread_exit(). If so, then perform the exit operation ourselves.
// (This is a no-op if explicit pthread_exit() had been called prior.)
if(!noExitRuntime)PThread.threadExit(result);
}elseif(e.data.cmd==='cancel'){// Main thread is asking for a pthread_cancel() on this thread.
if(threadInfoStruct){
PThread.threadCancel();
}
}elseif(e.data.target==='setimmediate'){
// no-op
}elseif(e.data.cmd==='processThreadQueue'){
if(threadInfoStruct){// If this thread is actually running?