2 * Copyright (C) 2012 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "HeapTimer.h"
32 #include "ScopeChain.h"
33 #include <wtf/Threading.h>
43 const CFTimeInterval HeapTimer::s_decade = 60 * 60 * 24 * 365 * 10;
45 HeapTimer::HeapTimer(JSGlobalData* globalData, CFRunLoopRef runLoop)
46 : m_globalData(globalData)
49 memset(&m_context, 0, sizeof(CFRunLoopTimerContext));
50 m_context.info = this;
51 m_timer.adoptCF(CFRunLoopTimerCreate(0, s_decade, s_decade, 0, 0, HeapTimer::timerDidFire, &m_context));
52 CFRunLoopAddTimer(m_runLoop.get(), m_timer.get(), kCFRunLoopCommonModes);
55 HeapTimer::~HeapTimer()
57 CFRunLoopRemoveTimer(m_runLoop.get(), m_timer.get(), kCFRunLoopCommonModes);
58 CFRunLoopTimerInvalidate(m_timer.get());
61 void HeapTimer::synchronize()
63 if (CFRunLoopGetCurrent() == m_runLoop.get())
65 CFRunLoopRemoveTimer(m_runLoop.get(), m_timer.get(), kCFRunLoopCommonModes);
66 m_runLoop = CFRunLoopGetCurrent();
67 CFRunLoopAddTimer(m_runLoop.get(), m_timer.get(), kCFRunLoopCommonModes);
70 void HeapTimer::invalidate()
73 CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() - s_decade);
76 void HeapTimer::didStartVMShutdown()
78 if (CFRunLoopGetCurrent() == m_runLoop.get()) {
83 ASSERT(!m_globalData->apiLock().currentThreadIsHoldingLock());
84 MutexLocker locker(m_shutdownMutex);
88 void HeapTimer::timerDidFire(CFRunLoopTimerRef, void* info)
90 HeapTimer* agent = static_cast<HeapTimer*>(info);
91 agent->m_shutdownMutex.lock();
92 if (!agent->m_globalData) {
93 agent->m_shutdownMutex.unlock();
98 // We don't ref here to prevent us from resurrecting the ref count of a "dead" JSGlobalData.
99 APIEntryShim shim(agent->m_globalData, APIEntryShimWithoutLock::DontRefGlobalData);
102 agent->m_shutdownMutex.unlock();
105 #elif PLATFORM(BLACKBERRY)
107 HeapTimer::HeapTimer(JSGlobalData* globalData)
108 : m_globalData(globalData)
109 , m_timer(this, &HeapTimer::timerDidFire)
113 HeapTimer::~HeapTimer()
117 void HeapTimer::timerDidFire()
122 void HeapTimer::synchronize()
126 void HeapTimer::invalidate()
130 void HeapTimer::didStartVMShutdown()
137 HeapTimer::HeapTimer(JSGlobalData* globalData)
138 : m_globalData(globalData)
144 HeapTimer::~HeapTimer()
150 void HeapTimer::didStartVMShutdown()
155 void HeapTimer::synchronize()
159 void HeapTimer::invalidate()
163 Ecore_Timer* HeapTimer::add(double delay, void* agent)
165 return ecore_timer_add(delay, reinterpret_cast<Ecore_Task_Cb>(timerEvent), agent);
168 void HeapTimer::stop()
173 ecore_timer_del(m_timer);
177 bool HeapTimer::timerEvent(void* info)
179 HeapTimer* agent = static_cast<HeapTimer*>(info);
181 APIEntryShim shim(agent->m_globalData);
185 return ECORE_CALLBACK_CANCEL;
190 HeapTimer::HeapTimer(JSGlobalData* globalData)
191 : m_globalData(globalData)
195 HeapTimer::~HeapTimer()
199 void HeapTimer::didStartVMShutdown()
204 void HeapTimer::synchronize()
208 void HeapTimer::invalidate()