[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