1/* 2 * Copyright (C) 2009 Maxime Simon <simon.maxime@gmail.com> 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 COMPUTER, 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 COMPUTER, 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 "SharedTimer.h" 28 29#include <MessageFilter.h> 30#include <MessageRunner.h> 31#include <Looper.h> 32#include <support/Locker.h> 33#include <support/Autolock.h> 34#include <wtf/CurrentTime.h> 35 36#define FIRE_MESSAGE 'fire' 37 38 39namespace WebCore { 40 41class SharedTimerHaiku: public BMessageFilter { 42 friend void setSharedTimerFiredFunction(void (*f)()); 43public: 44 static SharedTimerHaiku* instance(); 45 46 void start(double); 47 void stop(); 48 49protected: 50 virtual filter_result Filter(BMessage*, BHandler**); 51 52private: 53 SharedTimerHaiku(); 54 ~SharedTimerHaiku(); 55 56 void (*m_timerFunction)(); 57 bool m_shouldRun; 58}; 59 60SharedTimerHaiku::SharedTimerHaiku() 61 : BMessageFilter(FIRE_MESSAGE) 62 , m_timerFunction(0) 63 , m_shouldRun(false) 64{ 65} 66 67SharedTimerHaiku::~SharedTimerHaiku() 68{ 69} 70 71SharedTimerHaiku* SharedTimerHaiku::instance() 72{ 73 BLooper* looper = BLooper::LooperForThread(find_thread(0)); 74 static SharedTimerHaiku* timer; 75 76 if (!timer) { 77 BAutolock lock(looper); 78 timer = new SharedTimerHaiku(); 79 looper->AddCommonFilter(timer); 80 } 81 82 return timer; 83} 84 85void SharedTimerHaiku::start(double fireTime) 86{ 87 m_shouldRun = true; 88 89 double intervalInSeconds = fireTime - currentTime(); 90 bigtime_t intervalInMicroSeconds = intervalInSeconds < 0 ? 0 : intervalInSeconds * 1000000; 91 92 BMessageRunner::StartSending(Looper(), new BMessage(FIRE_MESSAGE), intervalInMicroSeconds, 1); 93} 94 95void SharedTimerHaiku::stop() 96{ 97 m_shouldRun = false; 98} 99 100filter_result SharedTimerHaiku::Filter(BMessage*, BHandler**) 101{ 102 if (m_shouldRun && m_timerFunction) 103 m_timerFunction(); 104 105 return B_SKIP_MESSAGE; 106} 107 108// WebCore functions 109void setSharedTimerFiredFunction(void (*f)()) 110{ 111 SharedTimerHaiku::instance()->m_timerFunction = f; 112} 113 114void setSharedTimerFireTime(double fireTime) 115{ 116 SharedTimerHaiku::instance()->start(fireTime); 117} 118 119void stopSharedTimer() 120{ 121 SharedTimerHaiku::instance()->stop(); 122} 123 124} // namespace WebCore 125