diff --git a/jackd/clientengine.c b/jackd/clientengine.c index de0e06b..31b5c17 100644 --- a/jackd/clientengine.c +++ b/jackd/clientengine.c @@ -237,7 +237,7 @@ jack_remove_client (jack_engine_t *engine, jack_client_internal_t *client) } } -void +int jack_check_clients (jack_engine_t* engine, int with_timeout_check) { /* CALLER MUST HOLD graph read lock */ @@ -278,13 +278,15 @@ jack_check_clients (jack_engine_t* engine, int with_timeout_check) */ struct timespec wait_time; wait_time.tv_sec = 0; - wait_time.tv_nsec = engine->driver->period_usecs - (now - client->control->awake_at); + wait_time.tv_nsec = (engine->driver->period_usecs - (now - client->control->awake_at)) * 1000; + VERBOSE (engine, "client %s seems to have timed out. we may have mercy of %d ns." , client->control->name, (int) wait_time.tv_nsec ); nanosleep (&wait_time, NULL); } if (client->control->finished_at == 0) { client->control->timed_out++; client->error++; + errs++; VERBOSE (engine, "client %s has timed out", client->control->name); } else { /* @@ -302,6 +304,8 @@ jack_check_clients (jack_engine_t* engine, int with_timeout_check) if (errs) { jack_engine_signal_problems (engine); } + + return errs; } void diff --git a/jackd/clientengine.h b/jackd/clientengine.h index 537d109..bcda149 100644 --- a/jackd/clientengine.h +++ b/jackd/clientengine.h @@ -58,7 +58,7 @@ void jack_intclient_name_request (jack_engine_t *engine, jack_request_t *req); void jack_intclient_unload_request (jack_engine_t *engine, jack_request_t *req); -void jack_check_clients (jack_engine_t* engine, int with_timeout_check); +int jack_check_clients (jack_engine_t* engine, int with_timeout_check); void jack_remove_clients (jack_engine_t* engine, int* exit_freewheeling); void jack_client_registration_notify (jack_engine_t *engine, const char* name, int yn); diff --git a/jackd/engine.c b/jackd/engine.c index 1866f62..36e896f 100644 --- a/jackd/engine.c +++ b/jackd/engine.c @@ -799,23 +799,25 @@ jack_process_external(jack_engine_t *engine, JSList *node) ctl->finished_at? (ctl->finished_at - ctl->signalled_at): 0); - jack_check_clients (engine, 1); - - engine->process_errors++; - return NULL; /* will stop the loop */ + if (jack_check_clients (engine, 1)) { + engine->process_errors++; + return NULL; /* will stop the loop */ + } } else { + engine->continuous_stream = 0; + } - DEBUG ("reading byte from subgraph_wait_fd==%d", - client->subgraph_wait_fd); - if (read (client->subgraph_wait_fd, &c, sizeof(c)) - != sizeof (c)) { - jack_error ("pp: cannot clean up byte from graph wait " - "fd (%s)", strerror (errno)); - client->error++; - return NULL; /* will stop the loop */ - } + DEBUG ("reading byte from subgraph_wait_fd==%d", + client->subgraph_wait_fd); + + if (read (client->subgraph_wait_fd, &c, sizeof(c)) + != sizeof (c)) { + jack_error ("pp: cannot clean up byte from graph wait " + "fd (%s)", strerror (errno)); + client->error++; + return NULL; /* will stop the loop */ } /* Move to next internal client (or end of client list) */ @@ -2445,7 +2447,6 @@ jack_run_one_cycle (jack_engine_t *engine, jack_nframes_t nframes, DEBUG("run process\n"); if (jack_engine_process (engine, nframes) != 0) { - engine->continuous_stream = 0; DEBUG ("engine process cycle failed"); jack_check_client_status (engine); }