2017-04-07 14:43:12 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* machinarium.
|
|
|
|
*
|
|
|
|
* cooperative multitasking engine.
|
2020-04-02 11:00:56 +00:00
|
|
|
*/
|
2017-04-07 14:43:12 +00:00
|
|
|
|
|
|
|
#include <machinarium.h>
|
2017-05-17 14:20:04 +00:00
|
|
|
#include <machinarium_private.h>
|
2017-04-07 14:43:12 +00:00
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
int mm_loop_init(mm_loop_t *loop)
|
2017-04-07 14:43:12 +00:00
|
|
|
{
|
|
|
|
loop->poll = mm_epoll_if.create();
|
|
|
|
if (loop->poll == NULL)
|
|
|
|
return -1;
|
2017-04-10 12:11:06 +00:00
|
|
|
mm_clock_init(&loop->clock);
|
2017-04-10 15:07:14 +00:00
|
|
|
mm_clock_update(&loop->clock);
|
2017-04-10 13:03:15 +00:00
|
|
|
memset(&loop->idle, 0, sizeof(loop->idle));
|
2017-04-07 14:43:12 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
int mm_loop_shutdown(mm_loop_t *loop)
|
2017-04-07 14:43:12 +00:00
|
|
|
{
|
2017-04-10 12:11:06 +00:00
|
|
|
mm_clock_free(&loop->clock);
|
2017-04-07 14:43:12 +00:00
|
|
|
int rc;
|
|
|
|
rc = loop->poll->iface->shutdown(loop->poll);
|
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
loop->poll->iface->free(loop->poll);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-28 10:43:31 +00:00
|
|
|
int mm_loop_step(mm_loop_t *loop)
|
2017-04-07 14:43:12 +00:00
|
|
|
{
|
2017-04-10 12:55:59 +00:00
|
|
|
/* update clock time */
|
2018-11-27 13:19:16 +00:00
|
|
|
mm_clock_reset(&loop->clock);
|
|
|
|
if (loop->clock.active)
|
|
|
|
mm_clock_update(&loop->clock);
|
2017-04-10 12:55:59 +00:00
|
|
|
|
2017-04-10 13:03:15 +00:00
|
|
|
/* run idle callback */
|
2017-05-23 18:47:28 +00:00
|
|
|
int rc;
|
|
|
|
if (loop->idle.callback) {
|
|
|
|
rc = loop->idle.callback(&loop->idle);
|
2020-04-02 11:00:56 +00:00
|
|
|
if (!rc)
|
2017-05-23 18:47:28 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2017-04-10 13:03:15 +00:00
|
|
|
|
2017-04-10 12:55:59 +00:00
|
|
|
/* get minimal timer timeout */
|
2017-05-24 13:01:55 +00:00
|
|
|
int timeout = UINT32_MAX;
|
2018-11-22 15:03:25 +00:00
|
|
|
mm_timer_t *next;
|
|
|
|
next = mm_clock_timer_min(&loop->clock);
|
|
|
|
if (next) {
|
2018-11-27 13:19:16 +00:00
|
|
|
int64_t diff = next->timeout - loop->clock.time_ms;
|
2018-11-22 15:03:25 +00:00
|
|
|
if (diff <= 0)
|
|
|
|
timeout = 0;
|
|
|
|
else
|
|
|
|
timeout = diff;
|
|
|
|
}
|
2017-04-10 12:55:59 +00:00
|
|
|
|
2017-04-14 14:53:55 +00:00
|
|
|
/* run timers */
|
|
|
|
mm_clock_step(&loop->clock);
|
|
|
|
|
2017-04-10 12:55:59 +00:00
|
|
|
/* poll for events */
|
2017-04-07 15:52:49 +00:00
|
|
|
rc = loop->poll->iface->step(loop->poll, timeout);
|
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
2017-04-10 12:55:59 +00:00
|
|
|
|
2017-04-07 14:43:12 +00:00
|
|
|
return 0;
|
|
|
|
}
|