[Scummvm-git-logs] scummvm branch-2-6 -> c59d08855fe539892fa7010370dbf78360c489dd

AndywinXp noreply at scummvm.org
Thu Oct 6 17:35:11 UTC 2022


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
c59d08855f SCUMM: DiMUSE: Solve very rare deadlocks caused by two different mutex objects


Commit: c59d08855fe539892fa7010370dbf78360c489dd
    https://github.com/scummvm/scummvm/commit/c59d08855fe539892fa7010370dbf78360c489dd
Author: Andrea Boscarino (andywinxp at gmail.com)
Date: 2022-10-06T19:27:03+02:00

Commit Message:
SCUMM: DiMUSE: Solve very rare deadlocks caused by two different mutex objects

Changed paths:
    engines/scumm/imuse_digi/dimuse_dispatch.cpp
    engines/scumm/imuse_digi/dimuse_engine.cpp
    engines/scumm/imuse_digi/dimuse_engine.h
    engines/scumm/imuse_digi/dimuse_streamer.cpp
    engines/scumm/imuse_digi/dimuse_tracks.cpp
    engines/scumm/imuse_digi/dimuse_wave.cpp
    engines/scumm/imuse_digi/dimuse_waveout.cpp
    engines/scumm/scumm.cpp


diff --git a/engines/scumm/imuse_digi/dimuse_dispatch.cpp b/engines/scumm/imuse_digi/dimuse_dispatch.cpp
index 97a31fdff4f..c7a82a091bf 100644
--- a/engines/scumm/imuse_digi/dimuse_dispatch.cpp
+++ b/engines/scumm/imuse_digi/dimuse_dispatch.cpp
@@ -812,7 +812,7 @@ void IMuseDigital::dispatchProcessDispatches(IMuseDigiTrack *trackPtr, int feedS
 }
 
 void IMuseDigital::dispatchPredictFirstStream() {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 
 	for (int i = 0; i < _trackCount; i++) {
 		if (_dispatches[i].trackPtr->soundId && _dispatches[i].streamPtr && _dispatches[i].streamZoneList)
diff --git a/engines/scumm/imuse_digi/dimuse_engine.cpp b/engines/scumm/imuse_digi/dimuse_engine.cpp
index d59dad6264e..ef8fe01873a 100644
--- a/engines/scumm/imuse_digi/dimuse_engine.cpp
+++ b/engines/scumm/imuse_digi/dimuse_engine.cpp
@@ -41,8 +41,8 @@ void IMuseDigital::timer_handler(void *refCon) {
 	diMUSE->callback();
 }
 
-IMuseDigital::IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer)
-	: _vm(scumm), _mixer(mixer) {
+IMuseDigital::IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer, Common::Mutex *mutex)
+	: _vm(scumm), _mixer(mixer), _mutex(mutex) {
 	assert(_vm);
 	assert(mixer);
 
@@ -269,7 +269,7 @@ static void skipLegacyTrackEntry(Common::Serializer &s) {
 }
 
 void IMuseDigital::saveLoadEarly(Common::Serializer &s) {
-	Common::StackLock lock(_mutex, "IMuseDigital::saveLoadEarly()");
+	Common::StackLock lock(*_mutex, "IMuseDigital::saveLoadEarly()");
 
 	if (s.isLoading()) {
 		diMUSEStopAllSounds();
diff --git a/engines/scumm/imuse_digi/dimuse_engine.h b/engines/scumm/imuse_digi/dimuse_engine.h
index 2e2f44a607a..8157b3b52c6 100644
--- a/engines/scumm/imuse_digi/dimuse_engine.h
+++ b/engines/scumm/imuse_digi/dimuse_engine.h
@@ -67,7 +67,7 @@ struct IMuseDigiStreamZone;
 
 class IMuseDigital : public MusicEngine {
 private:
-	Common::Mutex _mutex;
+	Common::Mutex *_mutex;
 	ScummEngine_v7 *_vm;
 	Audio::Mixer *_mixer;
 	SmushPlayer *_splayer;
@@ -300,7 +300,7 @@ private:
 	byte waveOutGetStreamFlags();
 
 public:
-	IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer);
+	IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer, Common::Mutex *mutex);
 	~IMuseDigital() override;
 
 	// Wrapper functions used by the main engine
diff --git a/engines/scumm/imuse_digi/dimuse_streamer.cpp b/engines/scumm/imuse_digi/dimuse_streamer.cpp
index 6c5d9bc7ec3..69bcf80628a 100644
--- a/engines/scumm/imuse_digi/dimuse_streamer.cpp
+++ b/engines/scumm/imuse_digi/dimuse_streamer.cpp
@@ -335,9 +335,9 @@ int IMuseDigital::streamerFetchData(IMuseDigiStream *streamPtr) {
 
 		_streamerBailFlag = 0;
 
-		Common::StackLock lock(_mutex);
+		_mutex->lock();
 		actualAmount = _filesHandler->read(streamPtr->soundId, &streamPtr->buf[streamPtr->loadIndex], requestedAmount, streamPtr->bufId);
-		Common::StackLock unlock(_mutex);
+		_mutex->unlock();
 
 		// FT has no bailFlag
 		if (!_isEarlyDiMUSE && _streamerBailFlag)
diff --git a/engines/scumm/imuse_digi/dimuse_tracks.cpp b/engines/scumm/imuse_digi/dimuse_tracks.cpp
index 407cccfc5ba..388b6ec83a0 100644
--- a/engines/scumm/imuse_digi/dimuse_tracks.cpp
+++ b/engines/scumm/imuse_digi/dimuse_tracks.cpp
@@ -71,7 +71,7 @@ void IMuseDigital::tracksResume() {
 }
 
 void IMuseDigital::tracksSaveLoad(Common::Serializer &ser) {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	dispatchSaveLoad(ser);
 
 	for (int l = 0; l < _trackCount; l++) {
@@ -150,8 +150,6 @@ void IMuseDigital::tracksCallback() {
 		_tracksPauseTimer = 3;
 	}
 
-	Common::StackLock lock(_mutex);
-
 	// If we leave the number of queued streams unbounded, we fill the queue with streams faster than
 	// we can play them: this leads to a very noticeable audio latency and desync with the graphics.
 	if ((int)_internalMixer->_stream->numQueuedStreams() < _maxQueuedStreams) {
@@ -228,9 +226,9 @@ int IMuseDigital::tracksStartSound(int soundId, int tryPriority, int group) {
 		return -1;
 	}
 
-	Common::StackLock lock(_mutex);
+	_mutex->lock();
 	addTrackToList(&_trackList, allocatedTrack);
-	Common::StackLock unlock(_mutex);
+	_mutex->unlock();
 
 	return 0;
 }
@@ -254,7 +252,7 @@ int IMuseDigital::tracksStopSound(int soundId) {
 }
 
 int IMuseDigital::tracksStopAllSounds() {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	IMuseDigiTrack *nextTrack = _trackList;
 	IMuseDigiTrack *curTrack;
 
diff --git a/engines/scumm/imuse_digi/dimuse_wave.cpp b/engines/scumm/imuse_digi/dimuse_wave.cpp
index c8574259846..ce8ea6e73dd 100644
--- a/engines/scumm/imuse_digi/dimuse_wave.cpp
+++ b/engines/scumm/imuse_digi/dimuse_wave.cpp
@@ -34,39 +34,39 @@ int IMuseDigital::waveTerminate() {
 }
 
 int IMuseDigital::wavePause() {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	tracksPause();
 	return 0;
 }
 
 int IMuseDigital::waveResume() {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	tracksResume();
 	return 0;
 }
 
 void IMuseDigital::waveSaveLoad(Common::Serializer &ser) {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	tracksSaveLoad(ser);
 }
 
 void IMuseDigital::waveUpdateGroupVolumes() {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	tracksSetGroupVol();
 }
 
 int IMuseDigital::waveStartSound(int soundId, int priority) {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	return tracksStartSound(soundId, priority, 0);
 }
 
 int IMuseDigital::waveStopSound(int soundId) {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	return tracksStopSound(soundId);
 }
 
 int IMuseDigital::waveStopAllSounds() {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	return tracksStopAllSounds();
 }
 
@@ -75,12 +75,12 @@ int IMuseDigital::waveGetNextSound(int soundId) {
 }
 
 int IMuseDigital::waveSetParam(int soundId, int opcode, int value) {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	return tracksSetParam(soundId, opcode, value);
 }
 
 int IMuseDigital::waveGetParam(int soundId, int opcode) {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	return tracksGetParam(soundId, opcode);
 }
 
@@ -96,32 +96,32 @@ int IMuseDigital::waveStartStream(int soundId, int priority, int bufferId) {
 	if (soundId == 0)
 		return -1;
 
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	return tracksStartSound(soundId, priority, bufferId);
 }
 
 int IMuseDigital::waveSwitchStream(int oldSoundId, int newSoundId, int fadeLengthMs, int fadeSyncFlag2, int fadeSyncFlag1) {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	return dispatchSwitchStream(oldSoundId, newSoundId, fadeLengthMs, fadeSyncFlag2, fadeSyncFlag1);
 }
 
 int IMuseDigital::waveSwitchStream(int oldSoundId, int newSoundId, uint8 *crossfadeBuffer, int crossfadeBufferSize, int vocLoopFlag) {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	return dispatchSwitchStream(oldSoundId, newSoundId, crossfadeBuffer, crossfadeBufferSize, vocLoopFlag);
 }
 
 int IMuseDigital::waveProcessStreams() {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	return streamerProcessStreams();
 }
 
 void IMuseDigital::waveQueryStream(int soundId, int32 &bufSize, int32 &criticalSize, int32 &freeSpace, int &paused) {
-	Common::StackLock lock(_mutex);
 	tracksQueryStream(soundId, bufSize, criticalSize, freeSpace, paused);
+	Common::StackLock lock(*_mutex);
 }
 
 int IMuseDigital::waveFeedStream(int soundId, uint8 *srcBuf, int32 sizeToFeed, int paused) {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	return tracksFeedStream(soundId, srcBuf, sizeToFeed, paused);
 }
 
diff --git a/engines/scumm/imuse_digi/dimuse_waveout.cpp b/engines/scumm/imuse_digi/dimuse_waveout.cpp
index 7311ad9b8f9..d3433c31996 100644
--- a/engines/scumm/imuse_digi/dimuse_waveout.cpp
+++ b/engines/scumm/imuse_digi/dimuse_waveout.cpp
@@ -87,7 +87,7 @@ int IMuseDigital::waveOutDeinit() {
 }
 
 void IMuseDigital::waveOutCallback() {
-	Common::StackLock lock(_mutex);
+	Common::StackLock lock(*_mutex);
 	tracksCallback();
 }
 
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index f8eacf3a54e..2fffe43f6e6 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -1366,7 +1366,7 @@ void ScummEngine_v7::setupScumm(const Common::String &macResourceFile) {
 		filesAreCompressed |= _sound->isSfxFileCompressed();
 	}
 
-	_musicEngine = _imuseDigital = new IMuseDigital(this, _mixer);
+	_musicEngine = _imuseDigital = new IMuseDigital(this, _mixer, &_resourceAccessMutex);
 
 	if (filesAreCompressed) {
 		GUI::MessageDialog dialog(_(




More information about the Scummvm-git-logs mailing list