[sheepdog] [PATCH v2 1/3] sheep: make {register, unregister}_event thread safe
Liu Yuan
namei.unix at gmail.com
Tue Dec 17 07:31:56 CET 2013
This allow us to call even handling functions in worker thread
Signed-off-by: Liu Yuan <namei.unix at gmail.com>
---
lib/event.c | 14 ++++++++++++--
shepherd/Makefile.am | 2 +-
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/lib/event.c b/lib/event.c
index 88078f4..16aa921 100644
--- a/lib/event.c
+++ b/lib/event.c
@@ -21,6 +21,7 @@
static int efd;
static struct rb_root events_tree = RB_ROOT;
+static struct sd_lock events_lock = SD_LOCK_INITIALIZER;
static void timer_handler(int fd, int events, void *data)
{
@@ -92,8 +93,12 @@ int init_event(int nr)
static struct event_info *lookup_event(int fd)
{
struct event_info key = { .fd = fd };
+ struct event_info *ret;
- return rb_search(&events_tree, &key, rb, event_cmp);
+ sd_read_lock(&events_lock);
+ ret = rb_search(&events_tree, &key, rb, event_cmp);
+ sd_unlock(&events_lock);
+ return ret;
}
int register_event_prio(int fd, event_handler_t h, void *data, int prio)
@@ -116,8 +121,11 @@ int register_event_prio(int fd, event_handler_t h, void *data, int prio)
if (ret) {
sd_err("failed to add epoll event: %m");
free(ei);
- } else
+ } else {
+ sd_write_lock(&events_lock);
rb_insert(&events_tree, ei, rb, event_cmp);
+ sd_unlock(&events_lock);
+ }
return ret;
}
@@ -135,7 +143,9 @@ void unregister_event(int fd)
if (ret)
sd_err("failed to delete epoll event for fd %d: %m", fd);
+ sd_write_lock(&events_lock);
rb_erase(&ei->rb, &events_tree);
+ sd_unlock(&events_lock);
free(ei);
/*
diff --git a/shepherd/Makefile.am b/shepherd/Makefile.am
index 33a3da6..86f45be 100644
--- a/shepherd/Makefile.am
+++ b/shepherd/Makefile.am
@@ -25,7 +25,7 @@ sbin_PROGRAMS = shepherd
shepherd_SOURCES = shepherd.c
-shepherd_LDADD = ../lib/libsheepdog.a
+shepherd_LDADD = ../lib/libsheepdog.a -lpthread
shepherd_DEPENDENCIES = ../lib/libsheepdog.a
EXTRA_DIST =
--
1.7.9.5
More information about the sheepdog
mailing list