Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This fixes several tsan warnings related with stopping / closing portaudio streams, including #13870.
Apart from access to a non-atomic variable m_pStream, the real problem here was that
readProcess() writeProcess() would take a copy of m_pStream:
and close() would then call Pa_StopStream(m_pStream); Apparently stopping a stream and still accessing it in the callback leads to data races, at least on macOS.
Now, it the portaudio docs I read:
So what I do: in close() I set an atomic variable to STOP, to indicate that readProcess and writeProcess should not access the stream anymore, and to indicate that the callback function should return paAbort, which will stop the stream. Pa_StopStream can then safely be called and m_pStream set to null.
As a side effect this also addresses a comment in the code about a failed intent to use Pa_AbortStream instead of PaStopStream.
This works well on macOS and I have not seen any portaudio related tsan warnings anymore. But since the platform specific aspects of Portaudio it is important to ensure this works as expected on Windows and Linux.