From 3c4d8f65896253a82e19adcbe2808a863a99f74f Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Thu, 15 Mar 2018 12:53:56 +0100 Subject: Properly protect player struct with mutex The volatile keyword neither guarantees atomic access nor memory visibility[1]. Although this is usually not a problem on x86, it is incorrect to rely on this. Use mutex locks to protect all shared player variables and enforce memory visibility. [1] https://wiki.sei.cmu.edu/confluence/display/c/CON02-C.+Do+not+use+volatile+as+a+synchronization+primitive --- src/ui_act.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'src/ui_act.c') diff --git a/src/ui_act.c b/src/ui_act.c index 2c5f264..d112749 100644 --- a/src/ui_act.c +++ b/src/ui_act.c @@ -1,5 +1,5 @@ /* -Copyright (c) 2008-2013 +Copyright (c) 2008-2018 Lars-Dominik Braun Permission is hereby granted, free of charge, to any person obtaining a copy @@ -52,11 +52,11 @@ THE SOFTWARE. static inline void BarUiDoSkipSong (player_t * const player) { assert (player != NULL); - pthread_mutex_lock (&player->pauseMutex); + pthread_mutex_lock (&player->lock); player->doQuit = true; player->doPause = false; - pthread_cond_broadcast (&player->pauseCond); - pthread_mutex_unlock (&player->pauseMutex); + pthread_cond_broadcast (&player->cond); + pthread_mutex_unlock (&player->lock); } /* transform station if necessary to allow changes like rename, rate, ... @@ -419,28 +419,28 @@ BarUiActCallback(BarUiActSkipSong) { /* play */ BarUiActCallback(BarUiActPlay) { - pthread_mutex_lock (&app->player.pauseMutex); + pthread_mutex_lock (&app->player.lock); app->player.doPause = false; - pthread_cond_broadcast (&app->player.pauseCond); - pthread_mutex_unlock (&app->player.pauseMutex); + pthread_cond_broadcast (&app->player.cond); + pthread_mutex_unlock (&app->player.lock); } /* pause */ BarUiActCallback(BarUiActPause) { - pthread_mutex_lock (&app->player.pauseMutex); + pthread_mutex_lock (&app->player.lock); app->player.doPause = true; - pthread_cond_broadcast (&app->player.pauseCond); - pthread_mutex_unlock (&app->player.pauseMutex); + pthread_cond_broadcast (&app->player.cond); + pthread_mutex_unlock (&app->player.lock); } /* toggle pause */ BarUiActCallback(BarUiActTogglePause) { - pthread_mutex_lock (&app->player.pauseMutex); + pthread_mutex_lock (&app->player.lock); app->player.doPause = !app->player.doPause; - pthread_cond_broadcast (&app->player.pauseCond); - pthread_mutex_unlock (&app->player.pauseMutex); + pthread_cond_broadcast (&app->player.cond); + pthread_mutex_unlock (&app->player.lock); } /* rename current station -- cgit v1.2.3