void HeapTimer::timerDidFire(CFRunLoopTimerRef timer, void* context) { JSLock* apiLock = static_cast<JSLock*>(context); apiLock->lock(); VM* vm = apiLock->vm(); // The VM has been destroyed, so we should just give up. if (!vm) { apiLock->unlock(); return; } HeapTimer* heapTimer = 0; if (vm->heap.activityCallback()->m_timer.get() == timer) heapTimer = vm->heap.activityCallback(); else if (vm->heap.sweeper()->m_timer.get() == timer) heapTimer = vm->heap.sweeper(); else RELEASE_ASSERT_NOT_REACHED(); { APIEntryShim shim(vm); heapTimer->doWork(); } apiLock->unlock(); }
bool HeapTimer::timerEvent(void* info) { HeapTimer* agent = static_cast<HeapTimer*>(info); JSLockHolder locker(agent->m_vm); agent->doWork(); agent->m_timer = 0; return ECORE_CALLBACK_CANCEL; }
bool HeapTimer::timerEvent(void* info) { HeapTimer* agent = static_cast<HeapTimer*>(info); APIEntryShim shim(agent->m_vm); agent->doWork(); agent->m_timer = 0; return ECORE_CALLBACK_CANCEL; }
void HeapTimer::timerDidFire(CFRunLoopTimerRef, void* info) { HeapTimer* agent = static_cast<HeapTimer*>(info); agent->m_shutdownMutex.lock(); if (!agent->m_globalData) { agent->m_shutdownMutex.unlock(); delete agent; return; } { // We don't ref here to prevent us from resurrecting the ref count of a "dead" JSGlobalData. APIEntryShim shim(agent->m_globalData, APIEntryShimWithoutLock::DontRefGlobalData); agent->doWork(); } agent->m_shutdownMutex.unlock(); }