| // Copyright 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "config.h" |
| |
| #include "CCTimer.h" |
| |
| #include "CCThread.h" |
| |
| namespace cc { |
| |
| class CCTimerTask : public CCThread::Task { |
| public: |
| explicit CCTimerTask(CCTimer* timer) |
| : CCThread::Task(0) |
| , m_timer(timer) |
| { |
| } |
| |
| ~CCTimerTask() |
| { |
| if (!m_timer) |
| return; |
| |
| ASSERT(m_timer->m_task == this); |
| m_timer->stop(); |
| } |
| |
| void performTask() |
| { |
| if (!m_timer) |
| return; |
| |
| CCTimerClient* client = m_timer->m_client; |
| |
| m_timer->stop(); |
| if (client) |
| client->onTimerFired(); |
| } |
| |
| private: |
| friend class CCTimer; |
| |
| CCTimer* m_timer; // null if cancelled |
| }; |
| |
| CCTimer::CCTimer(CCThread* thread, CCTimerClient* client) |
| : m_client(client) |
| , m_thread(thread) |
| , m_task(0) |
| { |
| } |
| |
| CCTimer::~CCTimer() |
| { |
| stop(); |
| } |
| |
| void CCTimer::startOneShot(double intervalSeconds) |
| { |
| stop(); |
| |
| m_task = new CCTimerTask(this); |
| |
| // The thread expects delays in milliseconds. |
| m_thread->postDelayedTask(adoptPtr(m_task), intervalSeconds * 1000.0); |
| } |
| |
| void CCTimer::stop() |
| { |
| if (!m_task) |
| return; |
| |
| m_task->m_timer = 0; |
| m_task = 0; |
| } |
| |
| } // namespace cc |