simple: always loop around pa_threaded_mainloop_wait() to handle spurious wakeups properly

This commit is contained in:
Lennart Poettering 2009-08-05 01:04:36 +02:00
parent b553e7283d
commit a73c615b74

View file

@ -178,14 +178,23 @@ pa_simple* pa_simple_new(
if (pa_threaded_mainloop_start(p->mainloop) < 0) if (pa_threaded_mainloop_start(p->mainloop) < 0)
goto unlock_and_fail; goto unlock_and_fail;
/* Wait until the context is ready */ for (;;) {
pa_threaded_mainloop_wait(p->mainloop); pa_context_state_t state;
if (pa_context_get_state(p->context) != PA_CONTEXT_READY) { state = pa_context_get_state(p->context);
if (state == PA_CONTEXT_READY)
break;
if (!PA_CONTEXT_IS_GOOD(state)) {
error = pa_context_errno(p->context); error = pa_context_errno(p->context);
goto unlock_and_fail; goto unlock_and_fail;
} }
/* Wait until the context is ready */
pa_threaded_mainloop_wait(p->mainloop);
}
if (!(p->stream = pa_stream_new(p->context, stream_name, ss, map))) { if (!(p->stream = pa_stream_new(p->context, stream_name, ss, map))) {
error = pa_context_errno(p->context); error = pa_context_errno(p->context);
goto unlock_and_fail; goto unlock_and_fail;
@ -212,15 +221,23 @@ pa_simple* pa_simple_new(
goto unlock_and_fail; goto unlock_and_fail;
} }
/* Wait until the stream is ready */ for (;;) {
pa_threaded_mainloop_wait(p->mainloop); pa_stream_state_t state;
/* Wait until the stream is ready */ state = pa_stream_get_state(p->stream);
if (pa_stream_get_state(p->stream) != PA_STREAM_READY) {
if (state == PA_STREAM_READY)
break;
if (!PA_STREAM_IS_GOOD(state)) {
error = pa_context_errno(p->context); error = pa_context_errno(p->context);
goto unlock_and_fail; goto unlock_and_fail;
} }
/* Wait until the stream is ready */
pa_threaded_mainloop_wait(p->mainloop);
}
pa_threaded_mainloop_unlock(p->mainloop); pa_threaded_mainloop_unlock(p->mainloop);
return p; return p;