[sheepdog] [PATCH 1/3] Revert "sheep: allow {register, unregister}_event to be called in worker thread"

Hitoshi Mitake mitake.hitoshi at gmail.com
Mon Jan 13 09:40:37 CET 2014


This reverts commit 6601e90cf2c5168dfc15919caabcaef50eb75483.

The reverted commit introduced thread safe
{register,unregister}_event(). But these functions are not true thread
safe ones. They would be bug prone stuff in the future. Instead of
these dangerous functions, succeeding patches introduc real thread
safe functions for register/unregister events.

Conflicts:
	lib/event.c

Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
 include/event.h | 15 ---------------
 lib/event.c     | 14 ++------------
 2 files changed, 2 insertions(+), 27 deletions(-)

diff --git a/include/event.h b/include/event.h
index 0082e1a..8f8b21f 100644
--- a/include/event.h
+++ b/include/event.h
@@ -27,21 +27,6 @@ void add_timer(struct timer *t, unsigned int mseconds);
 #define EVENT_PRIO_DEFAULT 0
 #define EVENT_PRIO_MIN     INT_MIN
 
-/*
- * We can register/unregister the events in the worker thread with the
- * assumption:
- *
- * - one event will only be manipluated by a single entity.
- *
- * By allowing register/unregister events in the work thread, we get the
- * following benefits:
- *
- * 1. avoid to be trapped to main thread for better performance
- * 2. make sure registeration is done before some other events
- *
- * This doesn't mean we can manipulate the same event with multiple threads
- * simultaneously.
- */
 static inline int register_event(int fd, event_handler_t h, void *data)
 {
 	return register_event_prio(fd, h, data, EVENT_PRIO_DEFAULT);
diff --git a/lib/event.c b/lib/event.c
index cdb33d6..88078f4 100644
--- a/lib/event.c
+++ b/lib/event.c
@@ -21,7 +21,6 @@
 
 static int efd;
 static struct rb_root events_tree = RB_ROOT;
-static struct sd_rw_lock events_lock = SD_RW_LOCK_INITIALIZER;
 
 static void timer_handler(int fd, int events, void *data)
 {
@@ -93,12 +92,8 @@ int init_event(int nr)
 static struct event_info *lookup_event(int fd)
 {
 	struct event_info key = { .fd = fd };
-	struct event_info *ret;
 
-	sd_read_lock(&events_lock);
-	ret = rb_search(&events_tree, &key, rb, event_cmp);
-	sd_rw_unlock(&events_lock);
-	return ret;
+	return rb_search(&events_tree, &key, rb, event_cmp);
 }
 
 int register_event_prio(int fd, event_handler_t h, void *data, int prio)
@@ -121,11 +116,8 @@ 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 {
-		sd_write_lock(&events_lock);
+	} else
 		rb_insert(&events_tree, ei, rb, event_cmp);
-		sd_rw_unlock(&events_lock);
-	}
 
 	return ret;
 }
@@ -143,9 +135,7 @@ 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_rw_unlock(&events_lock);
 	free(ei);
 
 	/*
-- 
1.8.3.2



More information about the sheepdog mailing list