summaryrefslogtreecommitdiffstats
path: root/player/lua.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-12-15 14:44:25 +0100
committerwm4 <wm4@nowhere>2014-12-15 14:44:47 +0100
commit756adee999bbc24b79d02fea34f8512239de016c (patch)
tree9d8bf84a0bad38016e4c91a5960ffc4af329382d /player/lua.c
parenta40df83bae2a8e018ac9e27827012347f3105725 (diff)
downloadmpv-756adee999bbc24b79d02fea34f8512239de016c.tar.bz2
mpv-756adee999bbc24b79d02fea34f8512239de016c.tar.xz
client API: be more lenient about mpv_suspend/resume mismatches
Before this commit, this was defined to trigger undefined behavior. This was nice because it required less code; but on the other hand, Lua as well as IPC support had to check these things manually. Do it directly in the API to avoid code duplication, and to make the API more robust. (The total code size still grows, though...) Since all of the failure cases were originally meant to ruin things forever, there is no way to return error codes. So just print the errors.
Diffstat (limited to 'player/lua.c')
-rw-r--r--player/lua.c33
1 files changed, 6 insertions, 27 deletions
diff --git a/player/lua.c b/player/lua.c
index 1110137c68..47bcc07110 100644
--- a/player/lua.c
+++ b/player/lua.c
@@ -80,7 +80,6 @@ struct script_ctx {
struct mp_log *log;
struct mpv_handle *client;
struct MPContext *mpctx;
- int suspended;
};
#if LUA_VERSION_NUM <= 501
@@ -393,8 +392,7 @@ static int load_lua(struct mpv_handle *client, const char *fname)
r = 0;
error_out:
- if (ctx->suspended)
- mpv_resume(ctx->client);
+ mp_resume_all(client);
if (ctx->state)
lua_close(ctx->state);
talloc_free(ctx);
@@ -452,33 +450,20 @@ static int script_find_config_file(lua_State *L)
static int script_suspend(lua_State *L)
{
struct script_ctx *ctx = get_ctx(L);
- if (!ctx->suspended)
- mpv_suspend(ctx->client);
- ctx->suspended++;
+ mpv_suspend(ctx->client);
return 0;
}
static int script_resume(lua_State *L)
{
struct script_ctx *ctx = get_ctx(L);
- if (ctx->suspended < 1)
- luaL_error(L, "trying to resume, but core is not suspended");
- ctx->suspended--;
- if (!ctx->suspended)
- mpv_resume(ctx->client);
+ mpv_resume(ctx->client);
return 0;
}
-static void resume_all(struct script_ctx *ctx)
-{
- if (ctx->suspended)
- mpv_resume(ctx->client);
- ctx->suspended = 0;
-}
-
static int script_resume_all(lua_State *L)
{
- resume_all(get_ctx(L));
+ mp_resume_all(get_ctx(L)->client);
return 0;
}
@@ -488,13 +473,7 @@ static int script_wait_event(lua_State *L)
{
struct script_ctx *ctx = get_ctx(L);
- double timeout = luaL_optnumber(L, 1, 1e20);
-
- // This will almost surely lead to a deadlock. (Polling is still ok.)
- if (ctx->suspended && timeout > 0)
- luaL_error(L, "attempting to wait while core is suspended");
-
- mpv_event *event = mpv_wait_event(ctx->client, timeout);
+ mpv_event *event = mpv_wait_event(ctx->client, luaL_optnumber(L, 1, 1e20));
lua_newtable(L); // event
lua_pushstring(L, mpv_event_name(event->event_id)); // event name
@@ -1196,7 +1175,7 @@ static int script_subprocess(lua_State *L)
luaL_checktype(L, 1, LUA_TTABLE);
void *tmp = mp_lua_PITA(L);
- resume_all(ctx);
+ mp_resume_all(ctx->client);
lua_getfield(L, 1, "args"); // args
int num_args = mp_lua_len(L, -1);