aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorMax Horn2006-06-24 09:53:45 +0000
committerMax Horn2006-06-24 09:53:45 +0000
commitc9fd9c4878f95f4ae463bc136156634577e6f444 (patch)
tree8e370f6b5c188ba37d765eca5e0856503b53bed3 /common
parent75628fe9d7fa636da792d278b36396c3934ddf0e (diff)
downloadscummvm-rg350-c9fd9c4878f95f4ae463bc136156634577e6f444.tar.gz
scummvm-rg350-c9fd9c4878f95f4ae463bc136156634577e6f444.tar.bz2
scummvm-rg350-c9fd9c4878f95f4ae463bc136156634577e6f444.zip
Added 'timer' backend module, based on the existing TimerManager code (work in progress)
svn-id: r23279
Diffstat (limited to 'common')
-rw-r--r--common/module.mk1
-rw-r--r--common/timer.cpp133
-rw-r--r--common/timer.h38
3 files changed, 3 insertions, 169 deletions
diff --git a/common/module.mk b/common/module.mk
index 9b82ebd626..b47d2afda4 100644
--- a/common/module.mk
+++ b/common/module.mk
@@ -10,7 +10,6 @@ MODULE_OBJS := \
mutex.o \
str.o \
stream.o \
- timer.o \
util.o \
savefile.o \
system.o \
diff --git a/common/timer.cpp b/common/timer.cpp
deleted file mode 100644
index 8ac033cf03..0000000000
--- a/common/timer.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2002-2006 The ScummVM project
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- */
-
-#ifndef __MORPHOS__
-
-#include "common/stdafx.h"
-#include "common/scummsys.h"
-#include "common/timer.h"
-#include "common/util.h"
-#include "common/system.h"
-
-namespace Common {
-
-TimerManager *g_timer = NULL;
-
-TimerManager::TimerManager(OSystem *system) :
- _system(system),
- _timerHandler(0),
- _lastTime(0) {
-
- g_timer = this;
-
- for (int i = 0; i < MAX_TIMERS; i++) {
- _timerSlots[i].procedure = NULL;
- _timerSlots[i].interval = 0;
- _timerSlots[i].counter = 0;
- }
-
- _thisTime = _system->getMillis();
-
- // Set the timer last, after everything has been initialised
- _system->setTimerCallback(&timer_handler, 10);
-
-}
-
-TimerManager::~TimerManager() {
- // Remove the timer callback.
- // Note: backends *must* gurantee that after this method call returns,
- // the handler is not in use anymore; else race condtions could occur.
- _system->setTimerCallback(0, 0);
-
- {
- StackLock lock(_mutex);
- for (int i = 0; i < MAX_TIMERS; i++) {
- _timerSlots[i].procedure = NULL;
- _timerSlots[i].interval = 0;
- _timerSlots[i].counter = 0;
- }
- }
-}
-
-int TimerManager::timer_handler(int t) {
- if (g_timer)
- return g_timer->handler(t);
- return 0;
-}
-
-int TimerManager::handler(int t) {
- StackLock lock(_mutex);
- uint32 interval, l;
-
- _lastTime = _thisTime;
- _thisTime = _system->getMillis();
- interval = 1000 * (_thisTime - _lastTime);
-
- for (l = 0; l < MAX_TIMERS; l++) {
- if (_timerSlots[l].procedure && _timerSlots[l].interval > 0) {
- _timerSlots[l].counter -= interval;
- while (_timerSlots[l].counter <= 0) {
- // A small paranoia check which catches the case where
- // a timer removes itself (which it never should do).
- assert(_timerSlots[l].procedure && _timerSlots[l].interval > 0);
- _timerSlots[l].counter += _timerSlots[l].interval;
- _timerSlots[l].procedure(_timerSlots[l].refCon);
- }
- }
- }
-
- return t;
-}
-
-bool TimerManager::installTimerProc(TimerProc procedure, int32 interval, void *refCon) {
- assert(interval > 0);
- StackLock lock(_mutex);
-
- for (int l = 0; l < MAX_TIMERS; l++) {
- if (!_timerSlots[l].procedure) {
- _timerSlots[l].procedure = procedure;
- _timerSlots[l].interval = interval;
- _timerSlots[l].counter = interval;
- _timerSlots[l].refCon = refCon;
- return true;
- }
- }
-
- warning("Couldn't find free timer slot");
- return false;
-}
-
-void TimerManager::removeTimerProc(TimerProc procedure) {
- StackLock lock(_mutex);
-
- for (int l = 0; l < MAX_TIMERS; l++) {
- if (_timerSlots[l].procedure == procedure) {
- _timerSlots[l].procedure = 0;
- _timerSlots[l].interval = 0;
- _timerSlots[l].counter = 1; // Work around a problem when a timer proc removes itself
- _timerSlots[l].refCon = 0;
- }
- }
-}
-
-} // End of namespace Common
-
-#endif
diff --git a/common/timer.h b/common/timer.h
index e0023cd2aa..a870784bf4 100644
--- a/common/timer.h
+++ b/common/timer.h
@@ -23,16 +23,6 @@
#define COMMON_TIMER_H
#include "common/scummsys.h"
-#include "common/mutex.h"
-
-#define MAX_TIMERS 8
-
-
-#ifdef __MORPHOS__
-#include "morphos_timer.h"
-#else
-
-class OSystem;
namespace Common {
@@ -40,23 +30,7 @@ class TimerManager {
public:
typedef void (*TimerProc)(void *refCon);
-private:
- OSystem *_system;
- Mutex _mutex;
- void *_timerHandler;
- int32 _thisTime;
- int32 _lastTime;
-
- struct TimerSlots {
- TimerProc procedure;
- int32 interval;
- int32 counter;
- void *refCon;
- } _timerSlots[MAX_TIMERS];
-
-public:
- TimerManager(OSystem *system);
- ~TimerManager();
+ virtual ~TimerManager() {}
/**
* Install a new timer callback. It will from now be called every interval microseconds.
@@ -70,16 +44,12 @@ public:
* @param refCon an arbitrary void pointer; will be passed to the timer callback
* @return true if the timer was installed successfully, false otherwise
*/
- bool installTimerProc(TimerProc proc, int32 interval, void *refCon);
+ virtual bool installTimerProc(TimerProc proc, int32 interval, void *refCon) = 0;
/**
* Remove the given timer callback. It will not be invoked anymore.
*/
- void removeTimerProc(TimerProc proc);
-
-protected:
- static int timer_handler(int t);
- int handler(int t);
+ virtual void removeTimerProc(TimerProc proc) = 0;
};
extern TimerManager *g_timer;
@@ -87,5 +57,3 @@ extern TimerManager *g_timer;
} // End of namespace Common
#endif
-
-#endif