diff options
author | Willem Jan Palenstijn | 2013-04-18 23:34:29 +0200 |
---|---|---|
committer | Willem Jan Palenstijn | 2013-05-08 20:39:44 +0200 |
commit | 01f3f3a8dd0ad2891939d03b0ce47cbf36ea9bc6 (patch) | |
tree | 544b07f3aa41abe7907bcd2040cdad11ebc324bb /backends/timer/default/default-timer.cpp | |
parent | 9cf2c83e5e5a35816ab153bf8443dac691829ea8 (diff) | |
parent | a41d72a44a660c72fdadbc3a8ef580e5e03cb890 (diff) | |
download | scummvm-rg350-01f3f3a8dd0ad2891939d03b0ce47cbf36ea9bc6.tar.gz scummvm-rg350-01f3f3a8dd0ad2891939d03b0ce47cbf36ea9bc6.tar.bz2 scummvm-rg350-01f3f3a8dd0ad2891939d03b0ce47cbf36ea9bc6.zip |
Merge branch 'master'
Diffstat (limited to 'backends/timer/default/default-timer.cpp')
-rw-r--r-- | backends/timer/default/default-timer.cpp | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/backends/timer/default/default-timer.cpp b/backends/timer/default/default-timer.cpp index 8480fcc7ee..e1aadb62b8 100644 --- a/backends/timer/default/default-timer.cpp +++ b/backends/timer/default/default-timer.cpp @@ -24,10 +24,10 @@ #include "common/util.h" #include "common/system.h" - struct TimerSlot { Common::TimerManager::TimerProc callback; void *refCon; + Common::String id; uint32 interval; // in microseconds uint32 nextFireTime; // in milliseconds @@ -109,13 +109,28 @@ void DefaultTimerManager::handler() { } } -bool DefaultTimerManager::installTimerProc(TimerProc callback, int32 interval, void *refCon) { +bool DefaultTimerManager::installTimerProc(TimerProc callback, int32 interval, void *refCon, const Common::String &id) { assert(interval > 0); Common::StackLock lock(_mutex); + if (_callbacks.contains(id)) { + if (_callbacks[id] != callback) { + error("Different callbacks are referred by same name (%s)", id.c_str()); + } + } + TimerSlotMap::const_iterator i; + + for (i = _callbacks.begin(); i != _callbacks.end(); ++i) { + if (i->_value == callback) { + error("Same callback is referred by different names (%s vs %s)", i->_key.c_str(), id.c_str()); + } + } + _callbacks[id] = callback; + TimerSlot *slot = new TimerSlot; slot->callback = callback; slot->refCon = refCon; + slot->id = id; slot->interval = interval; slot->nextFireTime = g_system->getMillis() + interval / 1000; slot->nextFireTimeMicro = interval % 1000; @@ -146,4 +161,21 @@ void DefaultTimerManager::removeTimerProc(TimerProc callback) { slot = slot->next; } } + + // We need to remove all names referencing the timer proc here. + // + // Else we run into troubles, when the client code removes and readds timer + // callbacks. + // + // Another issues occurs when one plays a game with ALSA as music driver, + // does RTL and starts a different engine game with ALSA as music driver. + // In this case the MPU401 code will add different timer procs with the + // same name, resulting in two different callbacks added with the same + // name and causing installTimerProc to error out. + // A good test case is running a SCUMM with ALSA output and then a KYRA + // game for example. + for (TimerSlotMap::iterator i = _callbacks.begin(), end = _callbacks.end(); i != end; ++i) { + if (i->_value == callback) + _callbacks.erase(i); + } } |