2014-10-17 09:56:54 -04:00
|
|
|
/**
|
2013-09-01 10:55:13 -04:00
|
|
|
* Copyright 2013 (c) Anna Schumaker.
|
|
|
|
*/
|
2014-06-05 10:19:22 -04:00
|
|
|
#include <core/idle.h>
|
2013-09-01 10:55:13 -04:00
|
|
|
|
|
|
|
#include <queue>
|
|
|
|
|
2015-11-10 13:52:24 -05:00
|
|
|
|
|
|
|
struct idle_task {
|
|
|
|
void (*idle_func)(void *);
|
|
|
|
void *idle_data;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
static std::queue<struct idle_task *> idle_queue;
|
2014-03-16 13:09:33 -04:00
|
|
|
static float queued = 0.0;
|
|
|
|
static float serviced = 0.0;
|
2013-09-01 10:55:13 -04:00
|
|
|
|
|
|
|
|
2015-11-10 13:52:24 -05:00
|
|
|
void idle_schedule(void (*func)(void *), void *data)
|
2013-09-01 10:55:13 -04:00
|
|
|
{
|
2015-11-10 13:52:24 -05:00
|
|
|
struct idle_task *task = new idle_task;
|
|
|
|
task->idle_func = func;
|
|
|
|
task->idle_data = data;
|
2013-09-01 10:55:13 -04:00
|
|
|
|
2015-11-10 13:52:24 -05:00
|
|
|
idle_queue.push(task);
|
2013-09-01 10:55:13 -04:00
|
|
|
queued++;
|
|
|
|
}
|
|
|
|
|
2015-11-10 13:56:54 -05:00
|
|
|
bool idle_run_task()
|
2013-09-01 10:55:13 -04:00
|
|
|
{
|
|
|
|
if (idle_queue.size() > 0) {
|
2015-11-10 13:52:24 -05:00
|
|
|
idle_queue.front()->idle_func(idle_queue.front()->idle_data);
|
2013-09-01 10:55:13 -04:00
|
|
|
delete idle_queue.front();
|
|
|
|
idle_queue.pop();
|
|
|
|
serviced++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (idle_queue.size() > 0)
|
|
|
|
return true;
|
|
|
|
|
2014-03-16 13:09:33 -04:00
|
|
|
queued = 0.0;
|
|
|
|
serviced = 0.0;
|
2013-09-01 10:55:13 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-11-10 13:27:32 -05:00
|
|
|
float idle_progress()
|
2013-09-01 10:55:13 -04:00
|
|
|
{
|
|
|
|
if (idle_queue.size() == 0)
|
2014-03-16 13:09:33 -04:00
|
|
|
return 1.0;
|
2013-09-01 10:55:13 -04:00
|
|
|
return serviced / queued;
|
|
|
|
}
|