* dispatch defer events in pa_mainloop_dispatch() and not already in pa_mainloop_prepare()

* fix the "timeout" parameter of pa_mainloop_prepare()
* remove pa_mainloop_deferred_pending() and update the simple API accordingly


git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@690 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
Lennart Poettering 2006-04-12 22:45:57 +00:00
parent 853caf1274
commit bf88854e60
3 changed files with 81 additions and 86 deletions

View file

@ -624,65 +624,77 @@ static void clear_wakeup(pa_mainloop *m) {
} }
int pa_mainloop_prepare(pa_mainloop *m, int timeout) { int pa_mainloop_prepare(pa_mainloop *m, int timeout) {
int dispatched = 0; assert(m);
assert(m->state == STATE_PASSIVE);
assert(m && (m->state == STATE_PASSIVE));
clear_wakeup(m); clear_wakeup(m);
scan_dead(m); scan_dead(m);
if (m->quit) if (m->quit)
goto quit; goto quit;
dispatched += dispatch_defer(m); if (!m->deferred_pending) {
if (m->quit)
goto quit;
if (m->rebuild_pollfds) if (m->rebuild_pollfds)
rebuild_pollfds(m); rebuild_pollfds(m);
m->prepared_timeout = calc_next_timeout(m); m->prepared_timeout = calc_next_timeout(m);
if ((timeout >= 0) && (m->prepared_timeout > timeout)) if (timeout >= 0 && (timeout < m->prepared_timeout || m->prepared_timeout < 0))
m->prepared_timeout = timeout; m->prepared_timeout = timeout;
}
m->state = STATE_PREPARED; m->state = STATE_PREPARED;
return 0;
return dispatched;
quit: quit:
m->state = STATE_QUIT; m->state = STATE_QUIT;
return -2; return -2;
} }
int pa_mainloop_poll(pa_mainloop *m) { int pa_mainloop_poll(pa_mainloop *m) {
int r; int r;
assert(m && (m->state == STATE_PREPARED)); assert(m);
assert(m->state == STATE_PREPARED);
if (m->quit)
goto quit;
m->state = STATE_POLLING; m->state = STATE_POLLING;
if (m->deferred_pending)
r = 0;
else {
r = poll(m->pollfds, m->n_pollfds, m->prepared_timeout); r = poll(m->pollfds, m->n_pollfds, m->prepared_timeout);
if ((r < 0) && (errno == EINTR)) if (r < 0) {
if (errno == EINTR)
r = 0; r = 0;
if (r < 0)
m->state = STATE_PASSIVE;
else else
m->state = STATE_POLLED; pa_log(__FILE__": poll(): %s", strerror(errno));
}
}
m->state = r < 0 ? STATE_PASSIVE : STATE_POLLED;
return r; return r;
quit:
m->state = STATE_QUIT;
return -2;
} }
int pa_mainloop_dispatch(pa_mainloop *m) { int pa_mainloop_dispatch(pa_mainloop *m) {
int dispatched = 0; int dispatched = 0;
assert(m && (m->state == STATE_POLLED)); assert(m);
assert(m->state == STATE_POLLED);
if (m->quit)
goto quit;
if (m->deferred_pending)
dispatched += dispatch_defer(m);
else {
dispatched += dispatch_timeout(m); dispatched += dispatch_timeout(m);
if (m->quit) if (m->quit)
@ -690,6 +702,8 @@ int pa_mainloop_dispatch(pa_mainloop *m) {
dispatched += dispatch_pollfds(m); dispatched += dispatch_pollfds(m);
}
if (m->quit) if (m->quit)
goto quit; goto quit;
@ -698,9 +712,7 @@ int pa_mainloop_dispatch(pa_mainloop *m) {
return dispatched; return dispatched;
quit: quit:
m->state = STATE_QUIT; m->state = STATE_QUIT;
return -2; return -2;
} }
@ -710,39 +722,30 @@ int pa_mainloop_get_retval(pa_mainloop *m) {
} }
int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval) { int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval) {
int r, dispatched = 0; int r;
assert(m); assert(m);
r = pa_mainloop_prepare(m, block ? -1 : 0); if ((r = pa_mainloop_prepare(m, block ? -1 : 0)) < 0)
if (r < 0) { goto quit;
if ((r = pa_mainloop_poll(m)) < 0)
goto quit;
if ((r = pa_mainloop_dispatch(m)) < 0)
goto quit;
return r;
quit:
if ((r == -2) && retval) if ((r == -2) && retval)
*retval = pa_mainloop_get_retval(m); *retval = pa_mainloop_get_retval(m);
return r; return r;
}
dispatched += r;
r = pa_mainloop_poll(m);
if (r < 0) {
pa_log(__FILE__": poll(): %s", strerror(errno));
return r;
}
r = pa_mainloop_dispatch(m);
if (r < 0) {
if ((r == -2) && retval)
*retval = pa_mainloop_get_retval(m);
return r;
}
dispatched += r;
return dispatched;
} }
int pa_mainloop_run(pa_mainloop *m, int *retval) { int pa_mainloop_run(pa_mainloop *m, int *retval) {
int r; int r;
while ((r = pa_mainloop_iterate(m, 1, retval)) >= 0); while ((r = pa_mainloop_iterate(m, 1, retval)) >= 0);
if (r == -2) if (r == -2)
@ -764,12 +767,6 @@ pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m) {
return &m->api; return &m->api;
} }
int pa_mainloop_deferred_pending(pa_mainloop *m) {
assert(m);
return m->deferred_pending > 0;
}
#if 0 #if 0
void pa_mainloop_dump(pa_mainloop *m) { void pa_mainloop_dump(pa_mainloop *m) {
assert(m); assert(m);

View file

@ -107,12 +107,9 @@ int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval);
/** Run unlimited iterations of the main loop object until the main loop's quit() routine is called. */ /** Run unlimited iterations of the main loop object until the main loop's quit() routine is called. */
int pa_mainloop_run(pa_mainloop *m, int *retval); int pa_mainloop_run(pa_mainloop *m, int *retval);
/** Return the abstract main loop abstraction layer vtable for this main loop. This calls pa_mainloop_iterate() iteratively.*/ /** Return the abstract main loop abstraction layer vtable for this main loop. */
pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m); pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m);
/** Return non-zero when there are any deferred events pending. \since 0.5 */
int pa_mainloop_deferred_pending(pa_mainloop *m);
/** Shutdown the main loop */ /** Shutdown the main loop */
void pa_mainloop_quit(pa_mainloop *m, int r); void pa_mainloop_quit(pa_mainloop *m, int r);

View file

@ -92,9 +92,7 @@ static int iterate(pa_simple *p, int block, int *rerror) {
if (check_error(p, rerror) < 0) if (check_error(p, rerror) < 0)
return -1; return -1;
if (!block && !pa_context_is_pending(p->context)) if (block || pa_context_is_pending(p->context)) {
return 0;
do { do {
if (pa_mainloop_iterate(p->mainloop, 1, NULL) < 0) { if (pa_mainloop_iterate(p->mainloop, 1, NULL) < 0) {
if (rerror) if (rerror)
@ -104,18 +102,21 @@ static int iterate(pa_simple *p, int block, int *rerror) {
if (check_error(p, rerror) < 0) if (check_error(p, rerror) < 0)
return -1; return -1;
} while (pa_context_is_pending(p->context)); } while (pa_context_is_pending(p->context));
}
for (;;) {
int r;
while (pa_mainloop_deferred_pending(p->mainloop)) { if ((r = pa_mainloop_iterate(p->mainloop, 0, NULL)) < 0) {
if (pa_mainloop_iterate(p->mainloop, 0, NULL) < 0) {
if (rerror) if (rerror)
*rerror = PA_ERR_INTERNAL; *rerror = PA_ERR_INTERNAL;
return -1; return -1;
} }
if (r == 0)
break;
if (check_error(p, rerror) < 0) if (check_error(p, rerror) < 0)
return -1; return -1;
} }