summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2018-03-09 11:53:48 +0100
committerKevin Mitchell <kevmitch@gmail.com>2018-03-15 00:00:04 -0700
commit2edf00fb94ba18dc2d476e0354036043ce4f714d (patch)
treecda0ebaa4bb7fcc2df6264cf6a4e3e2a6be04d74
parent03791fae163591951b2b8208fe6b0b6c95d8ae77 (diff)
downloadmpv-2edf00fb94ba18dc2d476e0354036043ce4f714d.tar.bz2
mpv-2edf00fb94ba18dc2d476e0354036043ce4f714d.tar.xz
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.
-rw-r--r--DOCS/client-api-changes.rst2
-rw-r--r--libmpv/client.h5
-rw-r--r--player/client.c2
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;
}