ocarina/core/idle.cpp

53 lines
906 B
C++
Raw Normal View History

/**
* Copyright 2013 (c) Anna Schumaker.
*/
#include <core/idle.h>
#include <glib.h>
struct idle_task {
void (*idle_func)(void *);
void *idle_data;
};
static GQueue idle_queue = G_QUEUE_INIT;
static float queued = 0.0;
static float serviced = 0.0;
void idle_schedule(void (*func)(void *), void *data)
{
struct idle_task *task = new idle_task;
task->idle_func = func;
task->idle_data = data;
g_queue_push_tail(&idle_queue, task);
queued++;
}
bool idle_run_task()
{
struct idle_task *task;
if (g_queue_get_length(&idle_queue) > 0) {
task = (struct idle_task *)g_queue_pop_head(&idle_queue);
task->idle_func(task->idle_data);
delete task;
serviced++;
}
if (g_queue_is_empty(&idle_queue)) {
queued = 0.0;
serviced = 0.0;
}
return !g_queue_is_empty(&idle_queue);
}
float idle_progress()
{
if (g_queue_is_empty(&idle_queue))
return 1.0;
return serviced / queued;
}