When the task already exists, we forgot to free the passed `user_data`.
This wasn't an issue for most C code, which doesn't pass a
`GDestroyNotify`, but bindings such as gstreamer-rs do!
That said, allocating a trampoline in gstreamer-rs just for it to get
thrown away again is awkward. Maybe we need a `gst_pad_resume_task`?
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3925>
task = GST_PAD_TASK (pad);
if (task == NULL) {
task = gst_task_new (func, user_data, notify);
+ notify = NULL;
gst_task_set_lock (task, GST_PAD_GET_STREAM_LOCK (pad));
gst_task_set_enter_callback (task, pad_enter_thread, pad, NULL);
gst_task_set_leave_callback (task, pad_leave_thread, pad, NULL);
res = gst_task_set_state (task, GST_TASK_STARTED);
GST_OBJECT_UNLOCK (pad);
+ /* free user_data if it wasn't used for gst_task_new */
+ if (notify)
+ notify (user_data);
+
return res;
/* ERRORS */