On 2014-11-05 00:26, Peter Meerwald wrote:
From: Peter Meerwald <[email protected]>

when the wakeup pipe became ready, and poll() returned
just one descriptor, we can stop scanning io_events

Eh, does this really make things faster?

Right now it seems to add another syscall - with the patch, we call clear_wakeup -> pa_read -> read syscall twice per iteration, once from dispatch_pollfds and once from pa_mainloop_prepare.

In addition, I don't see anything particular time consuming in looping through a few io_events.

Replacing the wakeup pipe with a pa_fdsem would be an interesting optimisation though, as pa_fdsem has a few atomic operations to avoid the entire write-poll-read cycle if no thread is currently waiting for the fdsem.


Signed-off-by: Peter Meerwald <[email protected]>
---
  src/pulse/mainloop.c | 24 ++++++++++++++----------
  1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/src/pulse/mainloop.c b/src/pulse/mainloop.c
index c7a5236..a7a3c48 100644
--- a/src/pulse/mainloop.c
+++ b/src/pulse/mainloop.c
@@ -635,6 +635,15 @@ static void rebuild_pollfds(pa_mainloop *m) {
      m->rebuild_pollfds = false;
  }

+static void clear_wakeup(pa_mainloop *m) {
+    char c[10];
+
+    pa_assert(m);
+
+    while (pa_read(m->wakeup_pipe[0], &c, sizeof(c), &m->wakeup_pipe_type) == 
sizeof(c))
+        ;
+}
+
  static unsigned dispatch_pollfds(pa_mainloop *m) {
      pa_io_event *e;
      unsigned r = 0, k;
@@ -642,6 +651,11 @@ static unsigned dispatch_pollfds(pa_mainloop *m) {
      pa_assert(m->poll_func_ret > 0);

      k = m->poll_func_ret;
+    if (m->pollfds[0].revents) {
+        clear_wakeup(m);
+        m->pollfds[0].revents = 0;
+        k--;
+    }

      PA_LLIST_FOREACH(e, m->io_events) {

@@ -775,20 +789,10 @@ void pa_mainloop_wakeup(pa_mainloop *m) {
          pa_log("pa_write() failed while trying to wake up the mainloop: %s", 
pa_cstrerror(errno));
  }

-static void clear_wakeup(pa_mainloop *m) {
-    char c[10];
-
-    pa_assert(m);
-
-    while (pa_read(m->wakeup_pipe[0], &c, sizeof(c), &m->wakeup_pipe_type) == 
sizeof(c))
-        ;
-}
-
  int pa_mainloop_prepare(pa_mainloop *m, int timeout) {
      pa_assert(m);
      pa_assert(m->state == STATE_PASSIVE);

-    clear_wakeup(m);
      scan_dead(m);

      if (m->quit)


--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
_______________________________________________
pulseaudio-discuss mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss

Reply via email to