Added 'timer' backend module, based on the existing TimerManager code (work in progress)

svn-id: r23279
This commit is contained in:
Max Horn 2006-06-24 09:53:45 +00:00
parent 75628fe9d7
commit c9fd9c4878
6 changed files with 85 additions and 59 deletions

View file

@ -12,7 +12,8 @@ MODULE_OBJS := \
midi/morphos.o \ midi/morphos.o \
midi/quicktime.o \ midi/quicktime.o \
midi/seq.o \ midi/seq.o \
midi/windows.o midi/windows.o \
timer/default/default-timer.o
# Include common rules # Include common rules
include $(srcdir)/rules.mk include $(srcdir)/rules.mk

View file

@ -19,24 +19,25 @@
* $Id$ * $Id$
*/ */
#ifndef __MORPHOS__
#include "common/stdafx.h" #include "common/stdafx.h"
#include "common/scummsys.h" #include "common/scummsys.h"
#include "common/timer.h" #include "backends/timer/default/default-timer.h"
#include "common/util.h" #include "common/util.h"
#include "common/system.h" #include "common/system.h"
namespace Common { 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; TimerManager *g_timer = NULL;
}
TimerManager::TimerManager(OSystem *system) : DefaultTimerManager::DefaultTimerManager(OSystem *system) :
_system(system), _system(system),
_timerHandler(0), _timerHandler(0),
_lastTime(0) { _lastTime(0) {
g_timer = this; Common::g_timer = this;
for (int i = 0; i < MAX_TIMERS; i++) { for (int i = 0; i < MAX_TIMERS; i++) {
_timerSlots[i].procedure = NULL; _timerSlots[i].procedure = NULL;
@ -51,14 +52,14 @@ TimerManager::TimerManager(OSystem *system) :
} }
TimerManager::~TimerManager() { DefaultTimerManager::~DefaultTimerManager() {
// Remove the timer callback. // Remove the timer callback.
// Note: backends *must* gurantee that after this method call returns, // Note: backends *must* gurantee that after this method call returns,
// the handler is not in use anymore; else race condtions could occur. // the handler is not in use anymore; else race condtions could occur.
_system->setTimerCallback(0, 0); _system->setTimerCallback(0, 0);
{ {
StackLock lock(_mutex); Common::StackLock lock(_mutex);
for (int i = 0; i < MAX_TIMERS; i++) { for (int i = 0; i < MAX_TIMERS; i++) {
_timerSlots[i].procedure = NULL; _timerSlots[i].procedure = NULL;
_timerSlots[i].interval = 0; _timerSlots[i].interval = 0;
@ -67,14 +68,14 @@ TimerManager::~TimerManager() {
} }
} }
int TimerManager::timer_handler(int t) { int DefaultTimerManager::timer_handler(int t) {
if (g_timer) if (Common::g_timer)
return g_timer->handler(t); return ((DefaultTimerManager *)Common::g_timer)->handler(t);
return 0; return 0;
} }
int TimerManager::handler(int t) { int DefaultTimerManager::handler(int t) {
StackLock lock(_mutex); Common::StackLock lock(_mutex);
uint32 interval, l; uint32 interval, l;
_lastTime = _thisTime; _lastTime = _thisTime;
@ -97,9 +98,9 @@ int TimerManager::handler(int t) {
return t; return t;
} }
bool TimerManager::installTimerProc(TimerProc procedure, int32 interval, void *refCon) { bool DefaultTimerManager::installTimerProc(TimerProc procedure, int32 interval, void *refCon) {
assert(interval > 0); assert(interval > 0);
StackLock lock(_mutex); Common::StackLock lock(_mutex);
for (int l = 0; l < MAX_TIMERS; l++) { for (int l = 0; l < MAX_TIMERS; l++) {
if (!_timerSlots[l].procedure) { if (!_timerSlots[l].procedure) {
@ -115,8 +116,8 @@ bool TimerManager::installTimerProc(TimerProc procedure, int32 interval, void *r
return false; return false;
} }
void TimerManager::removeTimerProc(TimerProc procedure) { void DefaultTimerManager::removeTimerProc(TimerProc procedure) {
StackLock lock(_mutex); Common::StackLock lock(_mutex);
for (int l = 0; l < MAX_TIMERS; l++) { for (int l = 0; l < MAX_TIMERS; l++) {
if (_timerSlots[l].procedure == procedure) { if (_timerSlots[l].procedure == procedure) {
@ -127,7 +128,3 @@ void TimerManager::removeTimerProc(TimerProc procedure) {
} }
} }
} }
} // End of namespace Common
#endif

View file

@ -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

View file

@ -34,6 +34,8 @@
#include "base/commandLine.h" #include "base/commandLine.h"
#include "base/plugins.h" #include "base/plugins.h"
#include "base/version.h" #include "base/version.h"
#include "backends/timer/default/default-timer.h"
#include "common/config-manager.h" #include "common/config-manager.h"
#include "common/file.h" #include "common/file.h"
#include "common/fs.h" #include "common/fs.h"
@ -317,7 +319,7 @@ extern "C" int scummvm_main(int argc, char *argv[]) {
system.initBackend(); system.initBackend();
// Create the timer services // Create the timer services
Common::g_timer = new Common::TimerManager(&system); Common::g_timer = new DefaultTimerManager(&system);
// Set initial window caption // Set initial window caption
system.setWindowCaption(gScummVMFullVersion); system.setWindowCaption(gScummVMFullVersion);

View file

@ -10,7 +10,6 @@ MODULE_OBJS := \
mutex.o \ mutex.o \
str.o \ str.o \
stream.o \ stream.o \
timer.o \
util.o \ util.o \
savefile.o \ savefile.o \
system.o \ system.o \

View file

@ -23,16 +23,6 @@
#define COMMON_TIMER_H #define COMMON_TIMER_H
#include "common/scummsys.h" #include "common/scummsys.h"
#include "common/mutex.h"
#define MAX_TIMERS 8
#ifdef __MORPHOS__
#include "morphos_timer.h"
#else
class OSystem;
namespace Common { namespace Common {
@ -40,23 +30,7 @@ class TimerManager {
public: public:
typedef void (*TimerProc)(void *refCon); typedef void (*TimerProc)(void *refCon);
private: virtual ~TimerManager() {}
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();
/** /**
* Install a new timer callback. It will from now be called every interval microseconds. * 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 * @param refCon an arbitrary void pointer; will be passed to the timer callback
* @return true if the timer was installed successfully, false otherwise * @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. * Remove the given timer callback. It will not be invoked anymore.
*/ */
void removeTimerProc(TimerProc proc); virtual void removeTimerProc(TimerProc proc) = 0;
protected:
static int timer_handler(int t);
int handler(int t);
}; };
extern TimerManager *g_timer; extern TimerManager *g_timer;
@ -87,5 +57,3 @@ extern TimerManager *g_timer;
} // End of namespace Common } // End of namespace Common
#endif #endif
#endif