void worker_proc() { Runtime rt(NULL); AsyncEvent *p; m_idleWorkers.dec(); while (true) { if (m_idleWorkers.inc() > MAX_IDLE_WORKERS) { if (m_idleWorkers.dec() > 0) break; m_idleWorkers.inc(); } p = m_pool.get(); if (m_idleWorkers.dec() == 0) if (m_idleWorkers.CompareAndSwap(0, 1) == 0) new_worker(); p->invoke(); } }