]> code.delx.au - pulseaudio/commitdiff
mainloop: Change wakeup_requested type from pa_bool_t to pa_atomic_t.
authorTanu Kaskinen <tanu.kaskinen@digia.com>
Mon, 2 Apr 2012 12:01:02 +0000 (15:01 +0300)
committerTanu Kaskinen <tanuk@iki.fi>
Thu, 15 Nov 2012 15:52:22 +0000 (17:52 +0200)
The variable is accessed from multiple threads, so it should
be atomic.

src/pulse/mainloop.c

index 725bdb4f3bfb863d4b6940ee9bd004375b0e4933..179465a3e8ff152d951da2cd364894ca38cc34fb 100644 (file)
@@ -114,7 +114,7 @@ struct pa_mainloop {
     int retval;
     pa_bool_t quit:1;
 
-    pa_bool_t wakeup_requested:1;
+    pa_atomic_t wakeup_requested;
     int wakeup_pipe[2];
     int wakeup_pipe_type;
 
@@ -774,7 +774,7 @@ void pa_mainloop_wakeup(pa_mainloop *m) {
 
     if (m->wakeup_pipe[1] >= 0 && m->state == STATE_POLLING) {
         pa_write(m->wakeup_pipe[1], &c, sizeof(c), &m->wakeup_pipe_type);
-        m->wakeup_requested++;
+        pa_atomic_store(&m->wakeup_requested, TRUE);
     }
 }
 
@@ -786,10 +786,9 @@ static void clear_wakeup(pa_mainloop *m) {
     if (m->wakeup_pipe[0] < 0)
         return;
 
-    if (m->wakeup_requested) {
+    if (pa_atomic_cmpxchg(&m->wakeup_requested, TRUE, FALSE)) {
         while (pa_read(m->wakeup_pipe[0], &c, sizeof(c), &m->wakeup_pipe_type) == sizeof(c))
             ;
-        m->wakeup_requested = 0;
     }
 }