18#define MAX_TIMERS 4096
21#define MAX_WAIT 60000.0
62 rc = gettimeofday(&tv,
NULL);
67 return ((
double) tv.tv_sec) * 1000.0 + ((double) tv.tv_usec) / 1000.0;
87 for (i = n - 1; i > 0; i--) {
92 if (t->
target <= (t-1)->target) {
97 memcpy((
void *) &tmp, (
void *) (t - 1),
sizeof(
ev_timer));
98 memcpy((
void *) (t - 1), (
void *) t,
sizeof(
ev_timer));
99 memcpy((
void *) t, (
void *) &tmp,
sizeof(
ev_timer));
121 while (sanity-- > 0) {
129 fprintf(stderr,
"exit requested, exiting timer expiry loop\n");
153 memset((
void *) t, 0,
sizeof(
ev_timer));
160 t->target = now + t->delay;
172 fprintf(stderr,
"calling user callback for timer id %d\n", (
int) t->id);
181 fprintf(stderr,
"timer callback failed for timer %d: %s\n", (
int) t->id,
duk_to_string(ctx, -1));
190 fprintf(stderr,
"deleting callback state for timer %d\n", (
int) t->id);
200 fprintf(stderr,
"queueing timer %d back into active list\n", (
int) t->id);
225 for (i = 0, j = 0; i < n; i++) {
230 fprintf(stderr,
"remove pollfd (index %d): fd=%d, events=%d, revents=%d\n",
231 i, pfd->fd, pfd->events, pfd->revents),
238 fprintf(stderr,
"keep pollfd (index %d -> %d): fd=%d, events=%d, revents=%d\n",
239 i, j, pfd->fd, pfd->events, pfd->revents),
274 idx_eventloop = idx_fd_handler - 1;
289 fprintf(stderr,
"exit requested, exiting event loop\n");
315 timeout = (int) diff;
319 fprintf(stderr,
"no timers and no sockets to poll, exiting\n");
332 fprintf(stderr,
"going to poll, timeout %d ms, pollfd count %d\n", timeout,
poll_count);
338 fprintf(stderr,
"poll rc: %d\n", rc);
343 }
else if (rc == 0) {
360 for (i = 0; i < n; i++) {
370 fprintf(stderr,
"fd %d has revents: %d\n", (
int) pfd->fd, (
int) pfd->revents);
380 fprintf(stderr,
"fd callback failed for fd %d: %s\n", (
int) pfd->fd,
duk_to_string(ctx, -1));
426 memset((
void *) t, 0,
sizeof(
ev_timer));
451 fprintf(stderr,
"created timer id: %d\n", (
int) timer_id);
481 if (t->
id == timer_id) {
485 fprintf(stderr,
"deleted expiring timer id: %d\n", (
int) timer_id);
492 for (i = 0; i < n; i++) {
494 if (t->
id == timer_id) {
520 fprintf(stderr,
"deleted timer id: %d\n", (
int) timer_id);
529 fprintf(stderr,
"trying to delete timer id %d, but not found; ignoring\n", (
int) timer_id);
545 fprintf(stderr,
"listen_fd: fd=%d, events=%d\n", fd, events);
551 for (i = 0; i < n; i++) {
555 fprintf(stderr,
"listen_fd: fd found at index %d\n", i);
562 pfd->events = events;
570 fprintf(stderr,
"listen_fd: fd not found on list, add new entry\n");
580 pfd->events = events;
static struct pollfd poll_list[MAX_FDS]
static int exit_requested
static double get_now(void)
static int listen_fd(duk_context *ctx)
static void expire_timers(duk_context *ctx)
static ev_timer timer_list[MAX_TIMERS]
int eventloop_run(duk_context *ctx)
static duk_function_list_entry eventloop_funcs[]
static ev_timer timer_expiring
static void compact_poll_list(void)
static int request_exit(duk_context *ctx)
void eventloop_register(duk_context *ctx)
static int delete_timer(duk_context *ctx)
static ev_timer * find_nearest_timer(void)
static void bubble_last_timer(void)
static int64_t timer_next_id
static int create_timer(duk_context *ctx)
DUK_EXTERNAL duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL void duk_pop_2(duk_context *ctx)
DUK_EXTERNAL void duk_push_true(duk_context *ctx)
DUK_EXTERNAL duk_double_t duk_require_number(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL void duk_push_boolean(duk_context *ctx, duk_bool_t val)
DUK_EXTERNAL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key)
DUK_EXTERNAL void duk_push_int(duk_context *ctx, duk_int_t val)
DUK_EXTERNAL duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_index)
DUK_EXTERNAL duk_idx_t duk_push_object(duk_context *ctx)
DUK_EXTERNAL duk_idx_t duk_get_top_index(duk_context *ctx)
DUK_EXTERNAL void duk_dup(duk_context *ctx, duk_idx_t from_index)
DUK_EXTERNAL duk_int_t duk_pcall_method(duk_context *ctx, duk_idx_t nargs)
DUK_EXTERNAL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key)
DUK_EXTERNAL duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_index)
DUK_EXTERNAL void duk_push_number(duk_context *ctx, duk_double_t val)
DUK_EXTERNAL void duk_pop_n(duk_context *ctx, duk_idx_t count)
DUK_EXTERNAL void duk_push_global_stash(duk_context *ctx)
DUK_EXTERNAL void duk_push_global_object(duk_context *ctx)
DUK_EXTERNAL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_index, const duk_function_list_entry *funcs)
DUK_EXTERNAL const char * duk_to_string(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL void duk_pop(duk_context *ctx)
DUK_EXTERNAL duk_int_t duk_require_int(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL duk_int_t duk_pcall(duk_context *ctx, duk_idx_t nargs)
DUK_EXTERNAL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_idx)
#define DUK_ERR_RANGE_ERROR