summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrond Norbye <trond.norbye@gmail.com>2011-05-02 22:13:46 +0200
committerTrond Norbye <trond.norbye@gmail.com>2011-07-11 16:22:38 +0200
commit3dc5964d9309bf8b4757c523a4491b61ca3ba8b8 (patch)
tree1b83f51fc27d68be80704a89eacc03ea55102415
parentc13692d3df1ebe7f1f7a1d18baecd0580405cfe4 (diff)
downloadmemcached-3dc5964d9309bf8b4757c523a4491b61ca3ba8b8.tar.gz
Ensure that we don't register a connection twice in libevent
-rw-r--r--daemon/memcached.c8
-rw-r--r--daemon/memcached.h2
-rw-r--r--daemon/thread.c4
3 files changed, 3 insertions, 11 deletions
diff --git a/daemon/memcached.c b/daemon/memcached.c
index 05d9ef6..17ba1cd 100644
--- a/daemon/memcached.c
+++ b/daemon/memcached.c
@@ -4901,9 +4901,7 @@ static enum try_read_result try_read_network(conn *c) {
}
bool register_event(conn *c, struct timeval *timeout) {
-#ifdef DEBUG
assert(!c->registered_in_libevent);
-#endif
if (event_add(&c->event, timeout) == -1) {
settings.extensions.logger->log(EXTENSION_LOG_WARNING,
@@ -4913,25 +4911,19 @@ bool register_event(conn *c, struct timeval *timeout) {
return false;
}
-#ifdef DEBUG
c->registered_in_libevent = true;
-#endif
return true;
}
bool unregister_event(conn *c) {
-#ifdef DEBUG
assert(c->registered_in_libevent);
-#endif
if (event_del(&c->event) == -1) {
return false;
}
-#ifdef DEBUG
c->registered_in_libevent = false;
-#endif
return true;
}
diff --git a/daemon/memcached.h b/daemon/memcached.h
index efa6dc3..c8a0983 100644
--- a/daemon/memcached.h
+++ b/daemon/memcached.h
@@ -276,9 +276,7 @@ struct conn {
sasl_conn_t *sasl_conn;
STATE_FUNC state;
enum bin_substates substate;
-#ifdef DEBUG
bool registered_in_libevent;
-#endif
struct event event;
short ev_flags;
short which; /** which events were just triggered */
diff --git a/daemon/thread.c b/daemon/thread.c
index 99479a9..3c30520 100644
--- a/daemon/thread.c
+++ b/daemon/thread.c
@@ -519,7 +519,9 @@ static void libevent_tap_process(int fd, short which, void *arg) {
"Processing tap pending_io for %d\n", c->sfd);
UNLOCK_THREAD(me);
- register_event(c, NULL);
+ if (!c->registered_in_libevent) {
+ register_event(c, NULL);
+ }
/*
* We don't want the thread to keep on serving all of the data
* from the context of the notification pipe, so just let it