static void retro_task_threaded_push_running(retro_task_t *task) { slock_lock(running_lock); task_queue_put(&tasks_running, task); scond_signal(worker_cond); slock_unlock(running_lock); }
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 threaded_worker(void *userdata) { (void)userdata; RARCH_LOG("Threaded rarch_task started\n"); for (;;) { rarch_task_t *queue = NULL; rarch_task_t *task = NULL; rarch_task_t *next = NULL; /* pop all into a local queue to avoid trouble with rarch_task_push(), * tasks are in the reverse order here. */ slock_lock(running_lock); if (!worker_continue) break; /* should we keep running until all tasks finished? */ while ((task = task_queue_get(&tasks_running)) != NULL) { task->next = queue; queue = task; } if (queue == NULL) /* no tasks running, lets wait a bit */ { scond_wait(worker_cond, running_lock); slock_unlock(running_lock); continue; } slock_unlock(running_lock); for (task = queue; task; task = next) { next = task->next; task->handler(task); if (task->finished) { slock_lock(finished_lock); task_queue_put(&tasks_finished, task); slock_unlock(finished_lock); } else threaded_push_running(task); } } slock_unlock(running_lock); }
static void threaded_worker(void *userdata) { (void)userdata; for (;;) { retro_task_t *task = NULL; if (!worker_continue) break; /* should we keep running until all tasks finished? */ slock_lock(running_lock); /* Get first task to run */ task = tasks_running.front; if (task == NULL) { scond_wait(worker_cond, running_lock); slock_unlock(running_lock); continue; } slock_unlock(running_lock); task->handler(task); slock_lock(running_lock); task_queue_remove(&tasks_running, task); slock_unlock(running_lock); /* Update queue */ if (!task->finished) { /* Re-add task to running queue */ retro_task_threaded_push_running(task); } else { /* Add task to finished queue */ slock_lock(finished_lock); task_queue_put(&tasks_finished, task); slock_unlock(finished_lock); } #if 0 retro_sleep(10); #endif } slock_unlock(running_lock); }
static void retro_task_regular_push_running(retro_task_t *task) { task_queue_put(&tasks_running, task); }