From 328d0c7fc326abce5fc1783e74cdd082c87d4986 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 11 May 2015 23:27:41 +0200 Subject: ao: make better use of atomics The main reason for this was compatibility; but some associated problems have been solved in the previous commit. (cherry picked from commit ca9964a4fb6b1faa0155da43b3c815db0075e2d5) --- audio/out/ao.c | 23 ++++++++++------------- audio/out/internal.h | 2 +- osdep/atomics.h | 1 + 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/audio/out/ao.c b/audio/out/ao.c index e2d01d65a3..f82637eb2a 100644 --- a/audio/out/ao.c +++ b/audio/out/ao.c @@ -385,28 +385,26 @@ bool ao_eof_reached(struct ao *ao) // Query the AO_EVENT_*s as requested by the events parameter, and return them. int ao_query_and_reset_events(struct ao *ao, int events) { - int actual_events = 0; - if (atomic_load(&ao->request_reload)) // don't need to reset it - actual_events |= AO_EVENT_RELOAD; - if (atomic_load(&ao->request_hotplug)) - actual_events |= AO_EVENT_HOTPLUG; - return actual_events & events; + return atomic_fetch_and(&ao->events_, ~(unsigned)events) & events; } -// Request that the player core destroys and recreates the AO. Fully thread-safe. -void ao_request_reload(struct ao *ao) +static void ao_add_events(struct ao *ao, int events) { - atomic_store(&ao->request_reload, true); + atomic_fetch_or(&ao->events_, events); if (ao->input_ctx) mp_input_wakeup(ao->input_ctx); } +// Request that the player core destroys and recreates the AO. Fully thread-safe. +void ao_request_reload(struct ao *ao) +{ + ao_add_events(ao, AO_EVENT_RELOAD); +} + // Notify the player that the device list changed. Fully thread-safe. void ao_hotplug_event(struct ao *ao) { - atomic_store(&ao->request_hotplug, true); - if (ao->input_ctx) - mp_input_wakeup(ao->input_ctx); + ao_add_events(ao, AO_EVENT_HOTPLUG); } bool ao_chmap_sel_adjust(struct ao *ao, const struct mp_chmap_sel *s, @@ -503,7 +501,6 @@ bool ao_hotplug_check_update(struct ao_hotplug *hp) { if (hp->ao && ao_query_and_reset_events(hp->ao, AO_EVENT_HOTPLUG)) { hp->needs_update = true; - atomic_store(&hp->ao->request_hotplug, false); return true; } return false; diff --git a/audio/out/internal.h b/audio/out/internal.h index 820ac051bf..49131ba293 100644 --- a/audio/out/internal.h +++ b/audio/out/internal.h @@ -59,7 +59,7 @@ struct ao { char *redirect; // Internal events (use ao_request_reload(), ao_hotplug_event()) - atomic_bool request_reload, request_hotplug; + atomic_int events_; int buffer; double def_buffer; diff --git a/osdep/atomics.h b/osdep/atomics.h index 6997ba97b2..e0bef8a879 100644 --- a/osdep/atomics.h +++ b/osdep/atomics.h @@ -34,6 +34,7 @@ typedef struct { volatile unsigned long v, t; } atomic_ulong; typedef struct { volatile int v, t; } atomic_int; +typedef struct { volatile unsigned int v, t; } atomic_uint; typedef struct { volatile _Bool v, t; } atomic_bool; typedef struct { volatile long long v, t; } atomic_llong; typedef struct { volatile uint_least32_t v, t; } atomic_uint_least32_t; -- cgit v1.2.3