ocarina/core/idle.cpp

53 lines
829 B
C++
Raw Normal View History

/**
* Copyright 2013 (c) Anna Schumaker.
*/
#include <core/idle.h>
#include <queue>
struct idle_task {
void (*idle_func)(void *);
void *idle_data;
};
static std::queue<struct idle_task *> idle_queue;
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;
idle_queue.push(task);
queued++;
}
bool idle_run_task()
{
if (idle_queue.size() > 0) {
idle_queue.front()->idle_func(idle_queue.front()->idle_data);
delete idle_queue.front();
idle_queue.pop();
serviced++;
}
if (idle_queue.size() > 0)
return true;
queued = 0.0;
serviced = 0.0;
return false;
}
float idle_progress()
{
if (idle_queue.size() == 0)
return 1.0;
return serviced / queued;
}