summaryrefslogtreecommitdiff
path: root/idle.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-06-22 20:20:08 +0200
committerDavid Härdeman <david@hardeman.nu>2020-06-22 20:20:08 +0200
commit3d7ae10a541629727844163f7d64507baedd6c78 (patch)
treea31d9274c64c743cd944414ae4833b880283ffcc /idle.c
parentdc83b9bf92439f0472333dca0bfa1f7edda689b4 (diff)
Add a shared timer, remove timerfd usage from idle and announce
Diffstat (limited to 'idle.c')
-rw-r--r--idle.c48
1 files changed, 12 insertions, 36 deletions
diff --git a/idle.c b/idle.c
index e0eb525..0d13b31 100644
--- a/idle.c
+++ b/idle.c
@@ -1,6 +1,5 @@
#define _GNU_SOURCE
#include <inttypes.h>
-#include <sys/timerfd.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
@@ -12,10 +11,11 @@
#include "uring.h"
#include "server.h"
#include "idle.h"
+#include "ptimer.h"
struct idle {
+ struct ptimer_task ptask;
struct uring_task task;
- uint64_t value;
};
static inline void
@@ -315,25 +315,18 @@ idle_check_get_player_count(struct server *server, struct connection *conn)
}
static void
-idle_cb(struct uring_task *task, int res)
+idle_cb(struct ptimer_task *ptask)
{
- struct idle *idle = container_of(task, struct idle, task);
+ struct idle *idle = container_of(ptask, struct idle, ptask);
struct server *server;
- assert_return(task);
- assert_task_alive(DBG_IDLE, task);
-
- if (res != sizeof(idle->value)) {
- error("timerfd_read: %i", res);
- return;
- }
+ assert_return(ptask);
+ assert_task_alive(DBG_IDLE, &idle->task);
- debug(DBG_IDLE, "timer fired (value: %" PRIu64 ")", idle->value);
+ debug(DBG_IDLE, "timer fired");
list_for_each_entry(server, &cfg->servers, list)
server_idle_check(server);
-
- uring_read(&idle->task, &idle->value, sizeof(idle->value), idle_cb);
}
static void
@@ -360,6 +353,7 @@ idle_delete()
assert_return(cfg->idle);
debug(DBG_IDLE, "closing fd %i", cfg->idle->task.fd);
+ ptimer_del_task(&cfg->idle->ptask);
uring_task_destroy(&cfg->idle->task);
cfg->idle = NULL;
}
@@ -368,18 +362,6 @@ void
idle_init()
{
struct idle *idle;
- int ifd;
- struct itimerspec tspec = {
- .it_interval = {
- .tv_sec = 60,
- .tv_nsec = 0
- },
- .it_value = {
- /* FIXME: change to 60 */
- .tv_sec = 4,
- .tv_nsec = 0
- }
- };
assert_return(!cfg->idle);
@@ -387,17 +369,11 @@ idle_init()
if (!idle)
die("malloc: %m");
- ifd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
- if (ifd < 0)
- die("timerfd_create: %m");
-
- if (timerfd_settime(ifd, 0, &tspec, NULL) != 0)
- die("timerfd_settime: %m");
-
+ idle->ptask.interval = 60;
+ idle->ptask.times = 0;
+ idle->ptask.cb = idle_cb;
uring_task_init(&idle->task, "idle", uring_parent(), idle_free);
- uring_task_set_fd(&idle->task, ifd);
+ ptimer_add_task(&idle->ptask);
cfg->idle = idle;
-
- uring_read(&idle->task, &idle->value, sizeof(idle->value), idle_cb);
}