[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