]> git.saurik.com Git - apple/javascriptcore.git/blob - heap/HeapTimer.cpp
JavaScriptCore-7600.1.4.16.1.tar.gz
[apple/javascriptcore.git] / heap / HeapTimer.cpp
1 /*
2 * Copyright (C) 2012 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
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.
12 *
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.
24 */
25
26 #include "config.h"
27 #include "HeapTimer.h"
28
29 #include "IncrementalSweeper.h"
30 #include "JSObject.h"
31 #include "JSString.h"
32 #include "JSCInlines.h"
33 #include <wtf/MainThread.h>
34 #include <wtf/Threading.h>
35
36 #if PLATFORM(EFL)
37 #include <Ecore.h>
38 #endif
39
40 namespace JSC {
41
42 #if USE(CF)
43
44 const CFTimeInterval HeapTimer::s_decade = 60 * 60 * 24 * 365 * 10;
45
46 static const void* retainAPILock(const void* info)
47 {
48 static_cast<JSLock*>(const_cast<void*>(info))->ref();
49 return info;
50 }
51
52 static void releaseAPILock(const void* info)
53 {
54 static_cast<JSLock*>(const_cast<void*>(info))->deref();
55 }
56
57 HeapTimer::HeapTimer(VM* vm, CFRunLoopRef runLoop)
58 : m_vm(vm)
59 , m_runLoop(runLoop)
60 {
61 memset(&m_context, 0, sizeof(CFRunLoopTimerContext));
62 m_context.info = &vm->apiLock();
63 m_context.retain = retainAPILock;
64 m_context.release = releaseAPILock;
65 m_timer = adoptCF(CFRunLoopTimerCreate(0, s_decade, s_decade, 0, 0, HeapTimer::timerDidFire, &m_context));
66 CFRunLoopAddTimer(m_runLoop.get(), m_timer.get(), kCFRunLoopCommonModes);
67 }
68
69 HeapTimer::~HeapTimer()
70 {
71 CFRunLoopRemoveTimer(m_runLoop.get(), m_timer.get(), kCFRunLoopCommonModes);
72 CFRunLoopTimerInvalidate(m_timer.get());
73 }
74
75 void HeapTimer::timerDidFire(CFRunLoopTimerRef timer, void* context)
76 {
77 JSLock* apiLock = static_cast<JSLock*>(context);
78 apiLock->lock();
79
80 VM* vm = apiLock->vm();
81 // The VM has been destroyed, so we should just give up.
82 if (!vm) {
83 apiLock->unlock();
84 return;
85 }
86
87 HeapTimer* heapTimer = 0;
88 if (vm->heap.fullActivityCallback() && vm->heap.fullActivityCallback()->m_timer.get() == timer)
89 heapTimer = vm->heap.fullActivityCallback();
90 else if (vm->heap.edenActivityCallback() && vm->heap.edenActivityCallback()->m_timer.get() == timer)
91 heapTimer = vm->heap.edenActivityCallback();
92 else if (vm->heap.sweeper()->m_timer.get() == timer)
93 heapTimer = vm->heap.sweeper();
94 else
95 RELEASE_ASSERT_NOT_REACHED();
96
97 {
98 JSLockHolder locker(vm);
99 heapTimer->doWork();
100 }
101
102 apiLock->unlock();
103 }
104
105 #elif PLATFORM(EFL)
106
107 HeapTimer::HeapTimer(VM* vm)
108 : m_vm(vm)
109 , m_timer(0)
110 {
111 }
112
113 HeapTimer::~HeapTimer()
114 {
115 stop();
116 }
117
118 Ecore_Timer* HeapTimer::add(double delay, void* agent)
119 {
120 return ecore_timer_add(delay, reinterpret_cast<Ecore_Task_Cb>(timerEvent), agent);
121 }
122
123 void HeapTimer::stop()
124 {
125 if (!m_timer)
126 return;
127
128 ecore_timer_del(m_timer);
129 m_timer = 0;
130 }
131
132 bool HeapTimer::timerEvent(void* info)
133 {
134 HeapTimer* agent = static_cast<HeapTimer*>(info);
135
136 JSLockHolder locker(agent->m_vm);
137 agent->doWork();
138 agent->m_timer = 0;
139
140 return ECORE_CALLBACK_CANCEL;
141 }
142 #else
143 HeapTimer::HeapTimer(VM* vm)
144 : m_vm(vm)
145 {
146 }
147
148 HeapTimer::~HeapTimer()
149 {
150 }
151
152 void HeapTimer::invalidate()
153 {
154 }
155
156 #endif
157
158
159 } // namespace JSC