1 /* 2 * Copyright (C) 2009 Maxime Simon <simon.maxime (at) 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 39 namespace WebCore { 40 41 class SharedTimerHaiku: public BMessageFilter { 42 friend void setSharedTimerFiredFunction(void (*f)()); 43 public: 44 static SharedTimerHaiku* instance(); 45 46 void start(double); 47 void stop(); 48 49 protected: 50 virtual filter_result Filter(BMessage*, BHandler**); 51 52 private: 53 SharedTimerHaiku(); 54 ~SharedTimerHaiku(); 55 56 void (*m_timerFunction)(); 57 bool m_shouldRun; 58 }; 59 60 SharedTimerHaiku::SharedTimerHaiku() 61 : BMessageFilter(FIRE_MESSAGE) 62 , m_timerFunction(0) 63 , m_shouldRun(false) 64 { 65 } 66 67 SharedTimerHaiku::~SharedTimerHaiku() 68 { 69 } 70 71 SharedTimerHaiku* 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 85 void 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 95 void SharedTimerHaiku::stop() 96 { 97 m_shouldRun = false; 98 } 99 100 filter_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 109 void setSharedTimerFiredFunction(void (*f)()) 110 { 111 SharedTimerHaiku::instance()->m_timerFunction = f; 112 } 113 114 void setSharedTimerFireTime(double fireTime) 115 { 116 SharedTimerHaiku::instance()->start(fireTime); 117 } 118 119 void stopSharedTimer() 120 { 121 SharedTimerHaiku::instance()->stop(); 122 } 123 124 } // namespace WebCore 125