[Scummvm-cvs-logs] SF.net SVN: scummvm: [23279] scummvm/trunk/base
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Sat Jun 24 11:53:59 CEST 2006
Revision: 23279
Author: fingolfin
Date: 2006-06-24 02:53:45 -0700 (Sat, 24 Jun 2006)
ViewCVS: http://svn.sourceforge.net/scummvm/?rev=23279&view=rev
Log Message:
-----------
Added 'timer' backend module, based on the existing TimerManager code (work in progress)
Modified Paths:
--------------
scummvm/trunk/backends/module.mk
scummvm/trunk/base/main.cpp
scummvm/trunk/common/module.mk
scummvm/trunk/common/timer.h
Added Paths:
-----------
scummvm/trunk/backends/timer/
scummvm/trunk/backends/timer/default/
scummvm/trunk/backends/timer/default/default-timer.cpp
scummvm/trunk/backends/timer/default/default-timer.h
Removed Paths:
-------------
scummvm/trunk/common/timer.cpp
Modified: scummvm/trunk/backends/module.mk
===================================================================
--- scummvm/trunk/backends/module.mk 2006-06-24 09:34:49 UTC (rev 23278)
+++ scummvm/trunk/backends/module.mk 2006-06-24 09:53:45 UTC (rev 23279)
@@ -12,7 +12,8 @@
midi/morphos.o \
midi/quicktime.o \
midi/seq.o \
- midi/windows.o
+ midi/windows.o \
+ timer/default/default-timer.o
# Include common rules
include $(srcdir)/rules.mk
Copied: scummvm/trunk/backends/timer/default/default-timer.cpp (from rev 23278, scummvm/trunk/common/timer.cpp)
===================================================================
--- scummvm/trunk/backends/timer/default/default-timer.cpp (rev 0)
+++ scummvm/trunk/backends/timer/default/default-timer.cpp 2006-06-24 09:53:45 UTC (rev 23279)
@@ -0,0 +1,130 @@
+/* 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$
+ */
+
+#include "common/stdafx.h"
+#include "common/scummsys.h"
+#include "backends/timer/default/default-timer.h"
+#include "common/util.h"
+#include "common/system.h"
+
+namespace Common {
+// FIXME: Hack: This global variable shouldn't be declared here; in fact it
+// probably shouldn't be declared at all but rather a different method to
+// query the TimerManager object should be invented.
+TimerManager *g_timer = NULL;
+}
+
+DefaultTimerManager::DefaultTimerManager(OSystem *system) :
+ _system(system),
+ _timerHandler(0),
+ _lastTime(0) {
+
+ Common::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);
+
+}
+
+DefaultTimerManager::~DefaultTimerManager() {
+ // 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);
+
+ {
+ Common::StackLock lock(_mutex);
+ for (int i = 0; i < MAX_TIMERS; i++) {
+ _timerSlots[i].procedure = NULL;
+ _timerSlots[i].interval = 0;
+ _timerSlots[i].counter = 0;
+ }
+ }
+}
+
+int DefaultTimerManager::timer_handler(int t) {
+ if (Common::g_timer)
+ return ((DefaultTimerManager *)Common::g_timer)->handler(t);
+ return 0;
+}
+
+int DefaultTimerManager::handler(int t) {
+ Common::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 DefaultTimerManager::installTimerProc(TimerProc procedure, int32 interval, void *refCon) {
+ assert(interval > 0);
+ Common::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 DefaultTimerManager::removeTimerProc(TimerProc procedure) {
+ Common::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;
+ }
+ }
+}
Copied: scummvm/trunk/backends/timer/default/default-timer.h (from rev 23278, scummvm/trunk/common/timer.h)
===================================================================
--- scummvm/trunk/backends/timer/default/default-timer.h (rev 0)
+++ scummvm/trunk/backends/timer/default/default-timer.h 2006-06-24 09:53:45 UTC (rev 23279)
@@ -0,0 +1,59 @@
+/* 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 BACKENDS_TIMER_DEFAULT_H
+#define BACKENDS_TIMER_DEFAULT_H
+
+#include "common/timer.h"
+#include "common/mutex.h"
+
+class OSystem;
+
+class DefaultTimerManager : public Common::TimerManager {
+private:
+ enum {
+ MAX_TIMERS = 8
+ };
+ OSystem *_system;
+ Common::Mutex _mutex;
+ void *_timerHandler;
+ int32 _thisTime;
+ int32 _lastTime;
+
+ struct TimerSlots {
+ TimerProc procedure;
+ int32 interval;
+ int32 counter;
+ void *refCon;
+ } _timerSlots[MAX_TIMERS];
+
+public:
+ DefaultTimerManager(OSystem *system);
+ ~DefaultTimerManager();
+ bool installTimerProc(TimerProc proc, int32 interval, void *refCon);
+ void removeTimerProc(TimerProc proc);
+
+protected:
+ static int timer_handler(int t);
+ int handler(int t);
+};
+
+#endif
Modified: scummvm/trunk/base/main.cpp
===================================================================
--- scummvm/trunk/base/main.cpp 2006-06-24 09:34:49 UTC (rev 23278)
+++ scummvm/trunk/base/main.cpp 2006-06-24 09:53:45 UTC (rev 23279)
@@ -34,6 +34,8 @@
#include "base/commandLine.h"
#include "base/plugins.h"
#include "base/version.h"
+
+#include "backends/timer/default/default-timer.h"
#include "common/config-manager.h"
#include "common/file.h"
#include "common/fs.h"
@@ -317,7 +319,7 @@
system.initBackend();
// Create the timer services
- Common::g_timer = new Common::TimerManager(&system);
+ Common::g_timer = new DefaultTimerManager(&system);
// Set initial window caption
system.setWindowCaption(gScummVMFullVersion);
Modified: scummvm/trunk/common/module.mk
===================================================================
--- scummvm/trunk/common/module.mk 2006-06-24 09:34:49 UTC (rev 23278)
+++ scummvm/trunk/common/module.mk 2006-06-24 09:53:45 UTC (rev 23279)
@@ -10,7 +10,6 @@
mutex.o \
str.o \
stream.o \
- timer.o \
util.o \
savefile.o \
system.o \
Deleted: scummvm/trunk/common/timer.cpp
===================================================================
--- scummvm/trunk/common/timer.cpp 2006-06-24 09:34:49 UTC (rev 23278)
+++ scummvm/trunk/common/timer.cpp 2006-06-24 09:53:45 UTC (rev 23279)
@@ -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
Modified: scummvm/trunk/common/timer.h
===================================================================
--- scummvm/trunk/common/timer.h 2006-06-24 09:34:49 UTC (rev 23278)
+++ scummvm/trunk/common/timer.h 2006-06-24 09:53:45 UTC (rev 23279)
@@ -23,41 +23,15 @@
#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 {
class TimerManager {
public:
typedef void (*TimerProc)(void *refCon);
-private:
- OSystem *_system;
- Mutex _mutex;
- void *_timerHandler;
- int32 _thisTime;
- int32 _lastTime;
+ virtual ~TimerManager() {}
- struct TimerSlots {
- TimerProc procedure;
- int32 interval;
- int32 counter;
- void *refCon;
- } _timerSlots[MAX_TIMERS];
-
-public:
- TimerManager(OSystem *system);
- ~TimerManager();
-
/**
* Install a new timer callback. It will from now be called every interval microseconds.
* The timer may be invoked from a separate thread. Hence any timer code should be
@@ -70,16 +44,12 @@
* @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 @@
} // End of namespace Common
#endif
-
-#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list