[Scummvm-cvs-logs] SF.net SVN: scummvm: [26254] scummvm/trunk/engines/scumm/imuse_digi
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Tue Mar 20 19:59:29 CET 2007
Revision: 26254
http://scummvm.svn.sourceforge.net/scummvm/?rev=26254&view=rev
Author: fingolfin
Date: 2007-03-20 11:59:28 -0700 (Tue, 20 Mar 2007)
Log Message:
-----------
Fix a potential race condition (leading to lockups) in IMuseDigital::refreshScripts
Modified Paths:
--------------
scummvm/trunk/engines/scumm/imuse_digi/dimuse_script.cpp
scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp
Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_script.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_script.cpp 2007-03-20 18:45:54 UTC (rev 26253)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_script.cpp 2007-03-20 18:59:28 UTC (rev 26254)
@@ -189,16 +189,20 @@
}
void IMuseDigital::refreshScripts() {
- Common::StackLock lock(_mutex, "IMuseDigital::refreshScripts()");
- debug(5, "refreshScripts()");
- bool found = false;
- for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
- Track *track = _track[l];
- if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {
- found = true;
+ {
+ Common::StackLock lock(_mutex, "IMuseDigital::refreshScripts()");
+ debug(5, "refreshScripts()");
+ bool found = false;
+ for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
+ Track *track = _track[l];
+ if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {
+ found = true;
+ }
}
}
-
+
+ // Make sure parseScriptCmds is *not* called while the mutex is locked
+ // (else race conditions can occur).
if (!found && (_curMusicSeq != 0)) {
debug(5, "refreshScripts() Start Sequence");
parseScriptCmds(0x1001, 0, 0, 0, 0, 0, 0, 0);
Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp 2007-03-20 18:45:54 UTC (rev 26253)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp 2007-03-20 18:59:28 UTC (rev 26254)
@@ -45,7 +45,7 @@
}
if (trackId == -1) {
- debug(5, "IMuseDigital::startSound(): All slots are full");
+ debug(5, "IMuseDigital::allocSlot(): All slots are full");
for (l = 0; l < MAX_DIGITAL_TRACKS; l++) {
Track *track = _track[l];
if (track->used && !track->toBeRemoved &&
@@ -57,9 +57,9 @@
if (lowest_priority <= priority) {
assert(trackId != -1);
_track[trackId]->toBeRemoved = true;
- debug(5, "IMuseDigital::startSound(): Removed sound %d from track %d", _track[trackId]->soundId, trackId);
+ debug(5, "IMuseDigital::allocSlot(): Removed sound %d from track %d", _track[trackId]->soundId, trackId);
} else {
- debug(5, "IMuseDigital::startSound(): Priority sound too low");
+ debug(5, "IMuseDigital::allocSlot(): Priority sound too low");
return -1;
}
}
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