Opened 8 years ago

Closed 6 years ago

#7011 closed defect (fixed)

RINGWORLD2: Deadlock in the sound code

Reported by: bgK Owned by: csnover
Priority: blocker Component: Engine: TsAGE
Version: Keywords: has-backtrace, has-pull-request
Cc: Game: Return to Ringworld

Description

ScummVM 1.8.0git6411-gf94153f (Feb 1 2016 21:33:04) Platform : Linux x64 Game : R2R demo Steps to reproduce : In the first room, play a bit with the computer's menus. The game freezes after a few clicks with a sound related deadlock.

Backtrace for the first thread: ~~~~

0 0x00007ffff4755cfc in __lll_lock_wait () from /usr/lib/libpthread.so.0

No symbol table info available.

1 0x00007ffff474fbb2 in pthread_mutex_lock () from /usr/lib/libpthread.so.0

No symbol table info available.

2 0x00007ffff7b92a5e in ?? () from /usr/lib/libSDL2-2.0.so.0

No symbol table info available.

3 0x0000000001b60b24 in SdlMutexManager::lockMutex (this=0x2951ce0, mutex=0x2ae9c00) at backends/mutex/sdl/sdl-mutex.cpp:36

No locals.

4 0x0000000001b4d5f8 in ModularBackend::lockMutex (this=0x28fcdf0, mutex=0x2ae9c00) at backends/modular-backend.cpp:222

    __PRETTY_FUNCTION__ = "virtual void ModularBackend::lockMutex(OSystem::MutexRef)"

5 0x0000000001cba40b in Common::StackLock::lock (this=0x7ffffffb73b0) at common/mutex.cpp:68

No locals.

6 0x0000000001cba38a in Common::StackLock::StackLock (this=0x7ffffffb73b0, mutex=..., mutexName=0x0) at common/mutex.cpp:57

No locals.

7 0x0000000001c48146 in Audio::MixerImpl::isSoundHandleActive (this=0x2ae9ec0, handle=...) at audio/mixer.cpp:452

    lock = {_mutex = 0x2ae9c00, _mutexName = 0x0}
    index = 32767

8 0x00000000018e7ae8 in TsAGE::SoundBlasterDriver::updateVoice (this=0x2d71140, channel=0) at engines/tsage/sound.cpp:3098

No locals.

9 0x00000000018e1490 in TsAGE::SoundManager::sfRethinkVoiceTypes () at engines/tsage/sound.cpp:1272

    vse = @0x2d712a0: {_field4 = -1, _field5 = 0, _field6 = 0, _sound = 0x3058808, _channelNum = 0, _priority = 0, _sound2 = 0x3058808, _channelNum2 = 0, _priority2 = 0, _sound3 = 0x0, _channelNum3 = 0, _priority3 = 0}
    sound = 0x3058808
    vse2 = @0x2d712a0: {_field4 = -1, _field5 = 0, _field6 = 0, _sound = 0x3058808, _channelNum = 0, _priority = 0, _sound2 = 0x3058808, _channelNum2 = 0, _priority2 = 0, _sound3 = 0x0, _channelNum3 = 0, _priority3 = 0}
    driver = 0x2d71140
    idx = 0
    idx2 = 0
    vs = 0x2d71220
    voiceIndex = 3
    priorityOffset = 32
    __PRETTY_FUNCTION__ = "static void TsAGE::SoundManager::sfRethinkVoiceTypes()"

10 0x00000000018def7d in TsAGE::SoundManager::sfAddToPlayList (sound=0x3058808) at engines/tsage/sound.cpp:624

    slock = {_mutex = 0x2caf3d0, _mutexName = 0x0}

11 0x00000000018de3ac in TsAGE::SoundManager::addToPlayList (this=0x2d72788, sound=0x3058808) at engines/tsage/sound.cpp:357

No locals.

12 0x00000000018e2740 in TsAGE::Sound::play (this=0x3058808, soundNum=14) at engines/tsage/sound.cpp:1561

No locals.

13 0x00000000018e5773 in TsAGE::ASound::play (this=0x30587f8, soundNum=14, endAction=0x0, volume=127) at engines/tsage/sound.cpp:2467

No locals.

14 0x000000000183367b in TsAGE::Ringworld2::Scene125::Icon::process (this=0x3059848, event=...) at engines/tsage/ringworld2/ringworld2_scenes0.cpp:465

    regionIndex = 2
    scene = 0x30578c0

15 0x00000000018353d7 in TsAGE::Ringworld2::Scene125::process (this=0x30578c0, event=...) at engines/tsage/ringworld2/ringworld2_scenes0.cpp:837

No locals.

16 0x00000000017646a4 in TsAGE::SceneHandler::process (this=0x2cafdf0, event=...) at engines/tsage/core.cpp:4336

No locals.

17 0x000000000180cd48 in TsAGE::Ringworld2::SceneHandlerExt::process (this=0x2cafdf0, event=...) at engines/tsage/ringworld2/ringworld2_logic.cpp:633

    scene = 0x30578c0

18 0x0000000001764e9c in TsAGE::SceneHandler::dispatch (this=0x2cafdf0) at engines/tsage/core.cpp:4472

    event = {eventType = TsAGE::EVENT_BUTTON_DOWN, mousePos = {x = 78, y = 30}, btnState = 0, kbd = {keycode = Common::KEYCODE_INVALID, ascii = 0, flags = 0 '\000'}, ctr = 0, gfxMan = 0x7c00000077, handled = false}

19 0x000000000180cd7f in TsAGE::Ringworld2::SceneHandlerExt::dispatch (this=0x2cafdf0) at engines/tsage/ringworld2/ringworld2_logic.cpp:638

No locals.

20 0x00000000017642f9 in TsAGE::GameHandler::execute (this=0x2cafdf0) at engines/tsage/core.cpp:4266

No locals.

21 0x00000000018dcefb in TsAGE::Game::execute (this=0x2cafdd0) at engines/tsage/scenes.cpp:617

~~~~

Backtrace for the second thread: ~~~~

0 0x00007ffff4755cfc in __lll_lock_wait () from /usr/lib/libpthread.so.0

No symbol table info available.

1 0x00007ffff474fbb2 in pthread_mutex_lock () from /usr/lib/libpthread.so.0

No symbol table info available.

2 0x00007ffff7b92a5e in ?? () from /usr/lib/libSDL2-2.0.so.0

No symbol table info available.

3 0x0000000001b60b24 in SdlMutexManager::lockMutex (this=0x2951ce0, mutex=0x2caf3d0) at backends/mutex/sdl/sdl-mutex.cpp:36

No locals.

4 0x0000000001b4d5f8 in ModularBackend::lockMutex (this=0x28fcdf0, mutex=0x2caf3d0) at backends/modular-backend.cpp:222

    __PRETTY_FUNCTION__ = "virtual void ModularBackend::lockMutex(OSystem::MutexRef)"

5 0x0000000001cba40b in Common::StackLock::lock (this=0x7fffdffeab90) at common/mutex.cpp:68

No locals.

6 0x0000000001cba38a in Common::StackLock::StackLock (this=0x7fffdffeab90, mutex=..., mutexName=0x0) at common/mutex.cpp:57

No locals.

7 0x00000000018e76ba in TsAGE::AdlibSoundDriver::onTimer (this=0x2d654d0) at engines/tsage/sound.cpp:3017

    slock1 = {_mutex = 0x2caf3a0, _mutexName = 0x0}
    slock2 = {_mutex = 0x2caf3d0, _mutexName = 0x0}

8 0x00000000018e9b92 in Common::Functor0Mem::operator() (this=0x2d806d0) at ./common/func.h:388

No locals.

9 0x0000000001c38584 in OPL::EmulatedOPL::readBuffer (this=0x2cb0160, buffer=0x7fffc8001070, numSamples=2048) at audio/fmopl.cpp:295

    stereoFactor = 1
    len = 1504
    step = 800

10 0x0000000001c8d4b9 in Audio::CopyRateConverter::flow (this=0x2d80760, input=..., obuf=0x2adea90, osamp=2048, vol_l=256, vol_r=256) at audio/rate.cpp:315

    __PRETTY_FUNCTION__ = "int Audio::CopyRateConverter::flow(Audio::AudioStream&, Audio::st_sample_t*, Audio::st_size_t, Audio::st_volume_t, Audio::st_volume_t) [with bool stereo = false; bool reverseSte"...
    ptr = 0x2d80748
    len = 32767
    ostart = 0x2adea90

11 0x0000000001c48b16 in Audio::Channel::mix (this=0x2d80700, data=0x2adea90, len=2048) at audio/mixer.cpp:621

    __PRETTY_FUNCTION__ = "int Audio::Channel::mix(int16*, uint)"
    res = 0

12 0x0000000001c475e6 in Audio::MixerImpl::mixCallback (this=0x2ae9ec0, samples=0x2adea90 "", len=2048) at audio/mixer.cpp:293

    i = 0
    __PRETTY_FUNCTION__ = "int Audio::MixerImpl::mixCallback(byte*, uint)"
    lock = {_mutex = 0x2ae9c00, _mutexName = 0x0}
    buf = 0x2adea90
    res = 0
    tmp = 0

13 0x0000000001b60a1b in SdlMixerManager::callbackHandler (this=0x2a80c70, samples=0x2adea90 "", len=8192) at backends/mixer/sdl/sdl-mixer.cpp:164

    __PRETTY_FUNCTION__ = "virtual void SdlMixerManager::callbackHandler(byte*, int)"

14 0x0000000001b60a77 in SdlMixerManager::sdlCallback (this_=0x2a80c70, samples=0x2adea90 "", len=8192) at backends/mixer/sdl/sdl-mixer.cpp:171

    manager = 0x2a80c70
    __PRETTY_FUNCTION__ = "static void SdlMixerManager::sdlCallback(void*, byte*, int)"

~~~~

The backtrace is with SDL2, but it happens just the same with SDL1.

Ticket imported from: bugs/7011.

Change History (8)

comment:1 by Strangerke, 8 years ago

Priority: normalhigh

comment:2 by Strangerke, 8 years ago

It would be nice to fix it before the release of 1.8.0. Raising priority.

comment:3 by csnover, 6 years ago

Priority: highblocker

Raising all identified crasher, hang, and memory violation bugs which I could not fully triage myself to blocker priority for the next release.

comment:4 by csnover, 6 years ago

Keywords: has-backtrace added

comment:5 by csnover, 6 years ago

This is basically the same as the other audio deadlocks in the game:

  1. The main thread calls to sfAddToPlayList which locks the game’s sound manager mutex;
  2. The audio thread is triggered, which locks the system mixer mutex, then the OPL callback tries to lock the game’s sound manager mutex and blocks;
  3. The main thread calls to a mixer method which tries to lock the system mixer mutex, which blocks;
  4. Deadlock.

comment:6 by csnover, 6 years ago

Owner: set to csnover

comment:7 by csnover, 6 years ago

Keywords: has-pull-request added

comment:8 by csnover, 6 years ago

Resolution: fixed
Status: newclosed

Thanks for your report! A patch for this issue has been added in commit fe45300891fea90f7ad72d66af7f060c3ec6b753 and will be available in daily builds 1.10.0git-5490 and later.

Note: See TracTickets for help on using tickets.