From a83075398bddff015658d993a056417cf3e4bfbb Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 27 Jan 2010 18:45:36 +0000 Subject: [PATCH] fix race when ending freewheeling (from torben) git-svn-id: svn+ssh://jackaudio.org/trunk/jack@3879 0c269be4-1314-0410-8aa9-9f06e86f4224 --- jack/engine.h | 5 +++-- jackd/engine.c | 10 +++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/jack/engine.h b/jack/engine.h index 438b13b..bab00ba 100644 --- a/jack/engine.h +++ b/jack/engine.h @@ -111,8 +111,10 @@ struct _jack_engine { unsigned long fifo_size; unsigned long external_client_cnt; int rtpriority; - char freewheeling; + volatile char freewheeling; + volatile char stop_freewheeling; jack_client_id_t fwclient; + pthread_t freewheel_thread; char verbose; char do_munlock; const char *server_name; @@ -122,7 +124,6 @@ struct _jack_engine { int feedbackcount; int removing_clients; pid_t wait_pid; - pthread_t freewheel_thread; int nozombies; volatile int problems; diff --git a/jackd/engine.c b/jackd/engine.c index f1b659e..93b86b6 100644 --- a/jackd/engine.c +++ b/jackd/engine.c @@ -1749,6 +1749,7 @@ jack_engine_new (int realtime, int rtpriority, int do_mlock, int do_unlock, engine->server_name = server_name; engine->temporary = temporary; engine->freewheeling = 0; + engine->stop_freewheeling = 0; engine->fwclient = 0; engine->feedbackcount = 0; engine->wait_pid = wait_pid; @@ -2019,7 +2020,7 @@ jack_engine_freewheel (void *arg) client = jack_client_internal_by_id (engine, engine->fwclient); - while (engine->freewheeling) { + while (!engine->stop_freewheeling) { jack_run_one_cycle (engine, engine->control->buffer_size, 0.0f); @@ -2067,6 +2068,7 @@ jack_start_freewheeling (jack_engine_t* engine, jack_client_id_t client_id) } engine->freewheeling = 1; + engine->stop_freewheeling = 0; event.type = StartFreewheel; jack_deliver_event_to_all (engine, &event); @@ -2104,13 +2106,15 @@ jack_stop_freewheeling (jack_engine_t* engine, int engine_exiting) to exit. */ - engine->fwclient = 0; - engine->freewheeling = 0; + engine->stop_freewheeling = 1; VERBOSE (engine, "freewheeling stopped, waiting for thread"); pthread_join (engine->freewheel_thread, &ftstatus); VERBOSE (engine, "freewheel thread has returned"); + engine->fwclient = 0; + engine->freewheeling = 0; + if (!engine_exiting) { /* tell everyone we've stopped */