Add lock to prevent zb_block popping from empty queue before zb_dispatch have push_back in it.
Signed-off-by: Yunkai Zhang <[email protected]> --- sheep/cluster/zookeeper.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c index 6da8626..39d9592 100644 --- a/sheep/cluster/zookeeper.c +++ b/sheep/cluster/zookeeper.c @@ -14,6 +14,7 @@ #include <netdb.h> #include <search.h> #include <assert.h> +#include <pthread.h> #include <sys/eventfd.h> #include <zookeeper/zookeeper.h> @@ -60,6 +61,8 @@ struct zk_event { int callbacked; /* set non-zero if sheep already called block_cb() */ }; +/* protect queue_start_pos */ +static pthread_mutex_t queue_lock = PTHREAD_MUTEX_INITIALIZER; /* ZooKeeper-based lock */ @@ -445,12 +448,16 @@ static void zk_block(struct work *work) { struct zk_event ev; + pthread_mutex_lock(&queue_lock); + zk_queue_pop(zhandle, &ev); ev.block_cb(ev.buf); ev.blocked = 0; zk_queue_push_back(zhandle, &ev); + + pthread_mutex_unlock(&queue_lock); } static void zk_block_done(struct work *work) @@ -475,6 +482,8 @@ static int zk_dispatch(void) if (ret < 0) return 0; + pthread_mutex_lock(&queue_lock); + ret = zk_queue_pop(zhandle, &ev); if (ret < 0) goto out; @@ -541,6 +550,7 @@ static int zk_dispatch(void) break; } out: + pthread_mutex_unlock(&queue_lock); return 0; } -- 1.7.7.6 -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
