Browse Source

fix race when ending freewheeling (from torben)

git-svn-id: svn+ssh://jackaudio.org/trunk/jack@3879 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/0.120.1
paul 16 years ago
parent
commit
a83075398b
2 changed files with 10 additions and 5 deletions
  1. +3
    -2
      jack/engine.h
  2. +7
    -3
      jackd/engine.c

+ 3
- 2
jack/engine.h View File

@@ -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;



+ 7
- 3
jackd/engine.c View File

@@ -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 */


Loading…
Cancel
Save