From 2edf00fb94ba18dc2d476e0354036043ce4f714d Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 9 Mar 2018 11:53:48 +0100 Subject: client API: send MPV_EVENT_SHUTDOWN only once Before this change, mpv_wait_event() could inconsistently return multiple MPV_EVENT_SHUTDOWN events to a single mpv_handle, up to the point of spamming the event queue under certain circumstances. Change this and just send it exactly once to each mpv_handle. Some client API users might have weird requirements about destroying their state asynchronously (and not reacting immediately to the SHUTDOWN event). This change will help a bit to make this less weird and surprising. --- DOCS/client-api-changes.rst | 2 ++ libmpv/client.h | 5 ++--- player/client.c | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/DOCS/client-api-changes.rst b/DOCS/client-api-changes.rst index 5c3d6af7c5..b9240ac64a 100644 --- a/DOCS/client-api-changes.rst +++ b/DOCS/client-api-changes.rst @@ -40,6 +40,8 @@ API changes - rename mpv_detach_destroy() to mpv_destroy() (the old function will remain valid as deprecated alias) - add mpv_create_weak_client(), which makes use of above changes + - MPV_EVENT_SHUTDOWN is now returned exactly once if a mpv_handle + should terminate, instead of spamming the event queue with this event 1.28 - deprecate the render opengl_cb API, and replace it with render.h and render_gl.h. The goal is allowing support for APIs other than OpenGL. The old API is emulated with the new API. diff --git a/libmpv/client.h b/libmpv/client.h index acdac45dc5..1483f1afd6 100644 --- a/libmpv/client.h +++ b/libmpv/client.h @@ -1166,9 +1166,8 @@ typedef enum mpv_event_id { /** * Happens when the player quits. The player enters a state where it tries * to disconnect all clients. Most requests to the player will fail, and - * mpv_wait_event() will always return instantly (returning new shutdown - * events if no other events are queued). The client should react to this - * and quit with mpv_destroy() as soon as possible. + * the client should react to this and quit with mpv_destroy() as soon as + * possible. */ MPV_EVENT_SHUTDOWN = 1, /** diff --git a/player/client.c b/player/client.c index 289508447b..3bad543c98 100644 --- a/player/client.c +++ b/player/client.c @@ -634,6 +634,8 @@ static int append_event(struct mpv_handle *ctx, struct mpv_event event, bool cop ctx->events[(ctx->first_event + ctx->num_events) % ctx->max_events] = event; ctx->num_events++; wakeup_client(ctx); + if (event.event_id == MPV_EVENT_SHUTDOWN) + ctx->event_mask &= ctx->event_mask & ~(1ULL << MPV_EVENT_SHUTDOWN); return 0; } -- cgit v1.2.3