166ac63924c2b0d710759176788d91ca83bd3a06
The previous design had a race condition. When WaveViewThreads::stop_threads() was called, it would first acquire the mutex, then set _quit, then call condition.broadcast(). But worker threads would check _quit without holding the mutex. It was therefore for a thread to be delayed in its own lock acquisition by the ::stop_threads() caller, then end up back in cond.wait() AFTER the cond.broadcast() was done. Such a thread would sleep forever and never wake up. This new design removes WaveViewDrawRequestQueue, which was a clean encapsulation of the queueing aspects of WaveViewThreads, but unfortunately made correct mutex acquisition and condition signalling/waiting needlessly complex. THe mutex, condition variable and actual queue were moved into WaveViewThreads, and all worker threads execute a method of the class which gives the appropriate code easy access to the mutex and condition var, which must always be used together.
Please see the Ardour web site at https://ardour.org/ for all documentation..
For information on building ardour:
https://ardour.org/development.html
Description
Languages
C++
56.5%
C
39.6%
JavaScript
1.3%
Lua
0.9%
Python
0.6%
Other
0.9%