static void retro_task_regular_gather(void) { retro_task_t *task = NULL; retro_task_t *queue = NULL; retro_task_t *next = NULL; while ((task = task_queue_get(&tasks_running)) != NULL) { task->next = queue; queue = task; } for (task = queue; task; task = next) { next = task->next; task->handler(task); task_queue_push_progress(task); if (task->finished) task_queue_put(&tasks_finished, task); else retro_task_regular_push_running(task); } retro_task_internal_gather(); }
static void retro_task_threaded_gather(void) { retro_task_t *task = NULL; slock_lock(running_lock); for (task = tasks_running.front; task; task = task->next) task_queue_push_progress(task); slock_unlock(running_lock); slock_lock(finished_lock); retro_task_internal_gather(); slock_unlock(finished_lock); }
static void retro_task_internal_gather(void) { retro_task_t *task = NULL; while ((task = task_queue_get(&tasks_finished)) != NULL) { task_queue_push_progress(task); if (task->callback) task->callback(task->task_data, task->user_data, task->error); if (task->error) free(task->error); if (task->title) free(task->title); free(task); } }