Fix synchronization between shutdown and player threads
shutdwn() sets the EOF indicator, aborts the running command, if any, forbids sleeping on I/O and wakes up the player thread, for all player threads in state PS_PLAYING. It takes play_lock to prevent new commands from running. It then waits up to 3s for player threads to terminate, by polling player_next(), to let output buffers drain. Issues: 1. Polling is lame. 2. New player threads can still enter state PS_PLAYING. They'll block as soon as they try to run a command. Somehwat unclean. 3. We can exit before all player threads left state PS_PLAYING, losing a treasury update, play time update, and log entries. Could happen when player threads blocked on output until commit 90b3abc5 fixed that; its commit message describes the bug's impact in more detail. Since then, the bug shouldn't bite in practice, because player threads should leave state PS_PLAYING quickly. Fix by introducing shutdown_lock: player threads in state PS_PLAYING hold it shared, shutdwn() takes it exclusive, instead of play_lock. Takes care of the issues as follows: 3. shutdwn() waits until all player threads left state PS_PLAYING, no matter how long it takes them. 2. New player threads block before entering state PS_PLAYING. 1. shutdwn() still polls up to 3s for player threads to terminate. Still lame. Left for another day.
This commit is contained in:
parent
86f0294573
commit
49ae6a7b9d
3 changed files with 21 additions and 6 deletions
|
@ -39,6 +39,7 @@
|
|||
|
||||
extern int shutdown_pending;
|
||||
extern empth_rwlock_t *play_lock;
|
||||
extern empth_rwlock_t *shutdown_lock;
|
||||
extern int update_running;
|
||||
extern time_t update_time[UPDATE_TIME_LEN];
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue