[Scummvm-cvs-logs] CVS: scummvm/scumm imuse.cpp,2.96,2.97 imuse_internal.h,2.22,2.23

Jamieson Christian jamieson630 at users.sourceforge.net
Mon Sep 29 01:01:01 CEST 2003


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv24156/scummvm/scumm

Modified Files:
	imuse.cpp imuse_internal.h 
Log Message:
Fixed iMuse termination sequence to avoid deadlock.
Fixes Bug [813920].

Index: imuse.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse.cpp,v
retrieving revision 2.96
retrieving revision 2.97
diff -u -d -r2.96 -r2.97
--- imuse.cpp	28 Sep 2003 00:03:23 -0000	2.96
+++ imuse.cpp	29 Sep 2003 06:32:45 -0000	2.97
@@ -316,7 +316,7 @@
 }
 
 void IMuseInternal::on_timer(MidiDriver *midi) {
-	if (_paused)
+	if (_paused || !_initialized)
 		return;
 
 	if (midi == _midi_native || !_midi_native)
@@ -612,9 +612,16 @@
 	return _master_volume;
 }
 
-int IMuseInternal::terminate() {
+int IMuseInternal::terminate1() {
+	_initialized = false;
 	stopAllSounds();
+	return 0;
+}
 
+// This is the stuff that has to be done
+// outside the monitor's mutex, otherwise
+// a deadlock occurs.
+int IMuseInternal::terminate2() {
 	if (_midi_adlib) {
 		_midi_adlib->close();
 		delete _midi_adlib;
@@ -1779,7 +1786,7 @@
 int IMuse::clear_queue() { in(); int ret = _target->clear_queue(); out(); return ret; }
 void IMuse::setBase(byte **base) { in(); _target->setBase(base); out(); }
 uint32 IMuse::property(int prop, uint32 value) { in(); uint32 ret = _target->property(prop, value); out(); return ret; }
-void IMuse::terminate() { in(); _target->terminate(); out(); }
+void IMuse::terminate() { in(); _target->terminate1(); out(); _target->terminate2(); }
 
 // The IMuse::create method provides a front-end factory
 // for creating IMuseInternal without exposing that class

Index: imuse_internal.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse_internal.h,v
retrieving revision 2.22
retrieving revision 2.23
diff -u -d -r2.22 -r2.23
--- imuse_internal.h	28 Sep 2003 00:03:23 -0000	2.22
+++ imuse_internal.h	29 Sep 2003 06:32:46 -0000	2.23
@@ -450,7 +450,8 @@
 
 	void on_timer(MidiDriver *midi);
 	void pause(bool paused);
-	int terminate();
+	int terminate1();
+	int terminate2();
 	int save_or_load(Serializer *ser, Scumm *scumm);
 	int set_music_volume(uint vol);
 	int get_music_volume();





More information about the Scummvm-git-logs mailing list