summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-02-03 17:43:47 +0100
committerwm4 <wm4@nowhere>2013-02-03 21:08:26 +0100
commitcc5cf98348a2f3675565be65480278ba401ba98a (patch)
tree61229fcb37b5acbffed8ff41d7efc8a4cdbaefff /core
parent738a5af586b996ac70eb6c72e9a2e73d14ea1dbb (diff)
downloadmpv-cc5cf98348a2f3675565be65480278ba401ba98a.tar.bz2
mpv-cc5cf98348a2f3675565be65480278ba401ba98a.tar.xz
input: free all queued/allocated commands on exit
These were memory leaks in theory, though not in practice (all memory is free'd on exit anyway). However, it was still annoying when leak reporting is enabled. I'm not sure if there was an actual leak in check_autorepeat(), maybe not.
Diffstat (limited to 'core')
-rw-r--r--core/input/input.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/core/input/input.c b/core/input/input.c
index e5af8e8d0c..06966ce25c 100644
--- a/core/input/input.c
+++ b/core/input/input.c
@@ -1328,7 +1328,9 @@ static mp_cmd_t *check_autorepeat(struct input_ctx *ictx)
unsigned int t = GetTimer();
// First time : wait delay
if (ictx->ar_state == 0
- && (t - ictx->last_key_down) >= ictx->ar_delay * 1000) {
+ && (t - ictx->last_key_down) >= ictx->ar_delay * 1000)
+ {
+ talloc_free(ictx->ar_cmd);
ictx->ar_cmd = get_cmd_from_keys(ictx, ictx->num_key_down,
ictx->key_down);
if (!ictx->ar_cmd) {
@@ -1519,8 +1521,10 @@ int mp_input_queue_cmd(struct input_ctx *ictx, mp_cmd_t *cmd)
*/
mp_cmd_t *mp_input_get_cmd(struct input_ctx *ictx, int time, int peek_only)
{
- if (async_quit_request)
- return mp_input_parse_cmd(bstr0("quit 1"), "");
+ if (async_quit_request) {
+ struct mp_cmd *cmd = mp_input_parse_cmd(bstr0("quit 1"), "");
+ queue_add(&ictx->control_cmd_queue, cmd, true);
+ }
if (ictx->control_cmd_queue.first || ictx->key_cmd_queue.first)
time = 0;
@@ -1876,6 +1880,15 @@ struct input_ctx *mp_input_init(struct input_conf *input_conf)
return ictx;
}
+static void clear_queue(struct cmd_queue *queue)
+{
+ while (queue->first) {
+ struct mp_cmd *item = queue->first;
+ queue_remove(queue, item);
+ talloc_free(item);
+ }
+}
+
void mp_input_uninit(struct input_ctx *ictx)
{
if (!ictx)
@@ -1889,9 +1902,13 @@ void mp_input_uninit(struct input_ctx *ictx)
if (ictx->cmd_fds[i].close_func)
ictx->cmd_fds[i].close_func(ictx->cmd_fds[i].fd);
}
- for (int i = 0; i < 2; i++)
+ for (int i = 0; i < 2; i++) {
if (ictx->wakeup_pipe[i] != -1)
close(ictx->wakeup_pipe[i]);
+ }
+ clear_queue(&ictx->key_cmd_queue);
+ clear_queue(&ictx->control_cmd_queue);
+ talloc_free(ictx->ar_cmd);
talloc_free(ictx);
}