void resumeOthers(bool barrierLocked = false) { ThreadState::AttachedThreadStateSet& threads = ThreadState::attachedThreads(); atomicSubtract(&m_unparkedThreadCount, threads.size()); releaseStore(&m_canResume, 1); // FIXME: Resumed threads will all contend for m_mutex just to unlock it // later which is a waste of resources. if (UNLIKELY(barrierLocked)) { m_resume.broadcast(); } else { // FIXME: Resumed threads will all contend for // m_mutex just to unlock it later which is a waste of // resources. MutexLocker locker(m_mutex); m_resume.broadcast(); } ThreadState* current = ThreadState::current(); for (ThreadState* state : threads) { if (state == current) continue; for (ThreadState::Interruptor* interruptor : state->interruptors()) interruptor->clearInterrupt(); } threadAttachMutex().unlock(); ASSERT(ThreadState::current()->isAtSafePoint()); }
void ThreadHeapStats::decreaseAllocatedSpace(size_t delta) { atomicSubtract(&m_allocatedSpace, static_cast<long>(delta)); ProcessHeap::decreaseTotalAllocatedSpace(delta); }