[sheepdog] [PATCH RFC 4/5] event: use rbtree for event management
MORITA Kazutaka
morita.kazutaka at gmail.com
Thu Sep 5 02:29:19 CEST 2013
From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
lib/event.c | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/lib/event.c b/lib/event.c
index f3af3e8..88078f4 100644
--- a/lib/event.c
+++ b/lib/event.c
@@ -15,12 +15,12 @@
#include <unistd.h>
#include <sys/epoll.h>
-#include "list.h"
+#include "rbtree.h"
#include "util.h"
#include "event.h"
static int efd;
-static LIST_HEAD(events_list);
+static struct rb_root events_tree = RB_ROOT;
static void timer_handler(int fd, int events, void *data)
{
@@ -64,13 +64,18 @@ struct event_info {
event_handler_t handler;
int fd;
void *data;
- struct list_node ei_list;
+ struct rb_node rb;
int prio;
};
static struct epoll_event *events;
static int nr_events;
+static int event_cmp(const struct event_info *e1, const struct event_info *e2)
+{
+ return intcmp(e1->fd, e2->fd);
+}
+
int init_event(int nr)
{
nr_events = nr;
@@ -86,13 +91,9 @@ int init_event(int nr)
static struct event_info *lookup_event(int fd)
{
- struct event_info *ei;
+ struct event_info key = { .fd = fd };
- list_for_each_entry(ei, &events_list, ei_list) {
- if (ei->fd == fd)
- return ei;
- }
- return NULL;
+ return rb_search(&events_tree, &key, rb, event_cmp);
}
int register_event_prio(int fd, event_handler_t h, void *data, int prio)
@@ -116,7 +117,7 @@ int register_event_prio(int fd, event_handler_t h, void *data, int prio)
sd_err("failed to add epoll event: %m");
free(ei);
} else
- list_add(&ei->ei_list, &events_list);
+ rb_insert(&events_tree, ei, rb, event_cmp);
return ret;
}
@@ -134,7 +135,7 @@ void unregister_event(int fd)
if (ret)
sd_err("failed to delete epoll event for fd %d: %m", fd);
- list_del(&ei->ei_list);
+ rb_erase(&ei->rb, &events_tree);
free(ei);
/*
--
1.7.9.5
More information about the sheepdog
mailing list