diff --git a/libretro-common/include/queues/task_queue.h b/libretro-common/include/queues/task_queue.h index 4b438acbb0..aedd8456c3 100644 --- a/libretro-common/include/queues/task_queue.h +++ b/libretro-common/include/queues/task_queue.h @@ -123,6 +123,10 @@ struct retro_task /* always called from the main loop */ retro_task_callback_t callback; + /* task cleanup handler to free allocated resources, will + * be called immediately after running the main callback */ + retro_task_handler_t cleanup; + /* set to true by the handler to signal * the task has finished executing. */ bool finished; diff --git a/libretro-common/queues/task_queue.c b/libretro-common/queues/task_queue.c index a52c7d6105..a21c0b9a69 100644 --- a/libretro-common/queues/task_queue.c +++ b/libretro-common/queues/task_queue.c @@ -126,6 +126,9 @@ static void retro_task_internal_gather(void) if (task->callback) task->callback(task->task_data, task->user_data, task->error); + if (task->cleanup) + task->cleanup(task); + if (task->error) free(task->error); diff --git a/tasks/task_image.c b/tasks/task_image.c index fc340af8d6..4b0e1a033e 100644 --- a/tasks/task_image.c +++ b/tasks/task_image.c @@ -383,6 +383,7 @@ bool rarch_task_push_image_load(const char *fullpath, t->state = nbio; t->handler = rarch_task_file_load_handler; + t->cleanup = rarch_task_image_load_free; t->callback = cb; t->user_data = user_data;