void ThreadPoolWorker::run() { // This is hokey in the extreme. To compute the stack limit, // subtract the size of the stack from the address of a local // variable and give a 2k buffer. Is there a better way? uintptr_t stackLimitOffset = WORKER_THREAD_STACK_SIZE - 2*1024; uintptr_t stackLimit = (((uintptr_t)&stackLimitOffset) + stackLimitOffset * JS_STACK_GROWTH_DIRECTION); AutoLockMonitor lock(*this); JS_ASSERT(state_ == ACTIVE); for (;;) { while (!worklist_.empty()) { TaskExecutor *task = worklist_.popCopy(); { AutoUnlockMonitor unlock(*this); task->executeFromWorker(workerId_, stackLimit); } } if (state_ == TERMINATING) break; lock.wait(); } JS_ASSERT(worklist_.empty()); state_ = TERMINATED; lock.notify(); }
void ThreadPoolWorker::run() { // This is hokey in the extreme. To compute the stack limit, // subtract the size of the stack from the address of a local // variable and give a 10k buffer. Is there a better way? // (Note: 2k proved to be fine on Mac, but too little on Linux) uintptr_t stackLimitOffset = WORKER_THREAD_STACK_SIZE - 10*1024; uintptr_t stackLimit = (((uintptr_t)&stackLimitOffset) + stackLimitOffset * JS_STACK_GROWTH_DIRECTION); AutoLockMonitor lock(*this); for (;;) { while (!worklist_.empty()) { TaskExecutor *task = worklist_.popCopy(); { // Unlock so that new things can be added to the // worklist while we are processing the current item: AutoUnlockMonitor unlock(*this); task->executeFromWorker(workerId_, stackLimit); } } if (state_ == TERMINATING) break; JS_ASSERT(state_ == ACTIVE); lock.wait(); } JS_ASSERT(worklist_.empty() && state_ == TERMINATING); state_ = TERMINATED; lock.notify(); }