Browse Source

implement a slightly more clean fix for the linux poll bug

git-svn-id: svn+ssh://jackaudio.org/trunk/jack@2268 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/0.115.6
pieterpalmers 18 years ago
parent
commit
3b7d4ed948
1 changed files with 12 additions and 10 deletions
  1. +12
    -10
      jackd/engine.c

+ 12
- 10
jackd/engine.c View File

@@ -615,19 +615,19 @@ static const int system_clock_monotonic = 0;
#endif

static int
linux_poll_bug_encountered (jack_engine_t* engine, jack_time_t then, int* poll_timeout)
linux_poll_bug_encountered (jack_engine_t* engine, jack_time_t then, jack_time_t *required)
{
if (engine->control->clock_source != JACK_TIMER_SYSTEM_CLOCK || system_clock_monotonic) {
jack_time_t now = jack_get_microseconds ();
if ((now - then) < ((*poll_timeout) * 1000)) {
if ((now - then) < *required) {
/*
So, adjust poll timeout to account for time already spent waiting.
*/
*poll_timeout -= (now - then) / 1000;
VERBOSE (engine, "FALSE WAKEUP (%lldusecs vs. %d msec)", (now - then), *poll_timeout);
VERBOSE (engine, "FALSE WAKEUP (%lldusecs vs. %lld usec)", (now - then), *required);
*required -= (now - then);
return 1;
}
}
@@ -668,6 +668,7 @@ jack_process_external(jack_engine_t *engine, JSList *node)
char c = 0;
struct pollfd pfd[1];
int poll_timeout;
jack_time_t poll_timeout_usecs;
jack_client_internal_t *client;
jack_client_control_t *ctl;
jack_time_t now, then;
@@ -701,14 +702,15 @@ jack_process_external(jack_engine_t *engine, JSList *node)
then = jack_get_microseconds ();

if (engine->freewheeling) {
poll_timeout = 10000; /* 10 seconds */
poll_timeout_usecs = 10000000; /* 10 seconds */
} else {
poll_timeout = (engine->client_timeout_msecs > 0 ?
engine->client_timeout_msecs :
1 + engine->driver->period_usecs/1000);
poll_timeout_usecs = (engine->client_timeout_msecs > 0 ?
engine->client_timeout_msecs * 1000 :
engine->driver->period_usecs);
}

again:
poll_timeout = 1 + poll_timeout_usecs / 1000;
pfd[0].fd = client->subgraph_wait_fd;
pfd[0].events = POLLERR|POLLIN|POLLHUP|POLLNVAL;

@@ -740,7 +742,7 @@ jack_process_external(jack_engine_t *engine, JSList *node)
*/

#ifdef __linux
if (linux_poll_bug_encountered (engine, then, &poll_timeout)) {
if (linux_poll_bug_encountered (engine, then, &poll_timeout_usecs)) {
goto again;
}
#endif


Loading…
Cancel
Save