diff options
author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-07-22 03:11:08 +0300 |
---|---|---|
committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-07-22 03:11:19 +0300 |
commit | 3f89c98dac05c24a8897330f0bd96bfabdd8096f (patch) | |
tree | 3c0e623db17740c0e2a12dd9e92ead8daca2127b | |
parent | 25900c179cdc963cab207ec821a739a196cf1d29 (diff) |
SL-17816 Crash trying to schedule audio decoding on shutdown
-rwxr-xr-x | indra/llaudio/llaudiodecodemgr.cpp | 64 |
1 files changed, 37 insertions, 27 deletions
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index bc082bf39a..38a6b41afe 100755 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -607,36 +607,46 @@ void LLAudioDecodeMgr::Impl::startMoreDecodes() // Kick off a decode mDecodes[decode_id] = LLPointer<LLVorbisDecodeState>(NULL); - main_queue->postTo( - general_queue, - [decode_id]() // Work done on general queue - { - LLPointer<LLVorbisDecodeState> decode_state = beginDecodingAndWritingAudio(decode_id); - - if (!decode_state) - { - // Audio decode has errored - return decode_state; - } - - // Disk write of decoded audio is now in progress off-thread - return decode_state; - }, - [decode_id, this](LLPointer<LLVorbisDecodeState> decode_state) // Callback to main thread - mutable { - if (!gAudiop) + try + { + main_queue->postTo( + general_queue, + [decode_id]() // Work done on general queue { - // There is no LLAudioEngine anymore. This might happen if - // an audio decode is enqueued just before shutdown. - return; - } + LLPointer<LLVorbisDecodeState> decode_state = beginDecodingAndWritingAudio(decode_id); - // At this point, we can be certain that the pointer to "this" - // is valid because the lifetime of "this" is dependent upon - // the lifetime of gAudiop. + if (!decode_state) + { + // Audio decode has errored + return decode_state; + } - enqueueFinishAudio(decode_id, decode_state); - }); + // Disk write of decoded audio is now in progress off-thread + return decode_state; + }, + [decode_id, this](LLPointer<LLVorbisDecodeState> decode_state) // Callback to main thread + mutable { + if (!gAudiop) + { + // There is no LLAudioEngine anymore. This might happen if + // an audio decode is enqueued just before shutdown. + return; + } + + // At this point, we can be certain that the pointer to "this" + // is valid because the lifetime of "this" is dependent upon + // the lifetime of gAudiop. + + enqueueFinishAudio(decode_id, decode_state); + }); + } + catch (const LLThreadSafeQueueInterrupt&) + { + // Shutdown + // Consider making processQueue() do a cleanup instead + // of starting more decodes + LL_WARNS() << "Tried to start decoding on shutdown" << LL_ENDL; + } } } |