From eb96a2bc7988f69b508fe87a6818174d5542b403 Mon Sep 17 00:00:00 2001 From: "Robert G. Jakabosky" Date: Fri, 25 Mar 2011 05:18:00 -0700 Subject: [PATCH] Fixed some bugs in low-level Poller object. --- src/poller.nobj.lua | 12 +++++++----- src/pre_generated-zmq.nobj.c | 12 +++++++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/poller.nobj.lua b/src/poller.nobj.lua index 26d0988..69076d4 100644 --- a/src/poller.nobj.lua +++ b/src/poller.nobj.lua @@ -33,7 +33,7 @@ object "ZMQ_Poller" { userdata_type = "embed", c_source(ZMQ_Poller_type), c_source[[ -#define FREE_ITEM_EVENTS_TAG 0xFFFF +#define FREE_ITEM_EVENTS_TAG ((short)0xFFFF) #define ITEM_TO_INDEX(items, item) (item - (items)) @@ -50,7 +50,7 @@ static int poller_resize_items(ZMQ_Poller *this, int len) { this->len = len; if(len > old_len) { /* clear new space. */ - memset(&(this->items[old_len]), 0, (old_len - len) * sizeof(zmq_pollitem_t)); + memset(&(this->items[old_len]), 0, (len - old_len) * sizeof(zmq_pollitem_t)); } return len; } @@ -108,6 +108,8 @@ static void poller_remove_item(ZMQ_Poller *this, int idx) { this->free_list = idx; /* mark this slot as a free slot. */ items[idx].events = FREE_ITEM_EVENTS_TAG; + /* clear old revents. */ + items[idx].revents = 0; } static int poller_get_free_item(ZMQ_Poller *this) { @@ -161,15 +163,14 @@ static int poller_compact_items(ZMQ_Poller *this) { items = this->items; next = 0; /* find first free slot. */ - while(items[next].events != FREE_ITEM_EVENTS_TAG) { - assert(next <= old_count); + while(next < count && items[next].events != FREE_ITEM_EVENTS_TAG) { ++next; } /* move non-free slots into free slot. */ count = next; ++next; - while(next <= old_count) { + while(next < old_count) { if(items[next].events != FREE_ITEM_EVENTS_TAG) { /* found non-free slot, move it to the current free slot. */ items[count] = items[next]; @@ -183,6 +184,7 @@ static int poller_compact_items(ZMQ_Poller *this) { this->count = count; this->free_list = -1; /* free list is now empty. */ + assert(count <= this->len); return count; } diff --git a/src/pre_generated-zmq.nobj.c b/src/pre_generated-zmq.nobj.c index b4195fb..cf3efd8 100644 --- a/src/pre_generated-zmq.nobj.c +++ b/src/pre_generated-zmq.nobj.c @@ -1748,7 +1748,7 @@ typedef struct ZMQ_Poller { int len; } ZMQ_Poller; -#define FREE_ITEM_EVENTS_TAG 0xFFFF +#define FREE_ITEM_EVENTS_TAG ((short)0xFFFF) #define ITEM_TO_INDEX(items, item) (item - (items)) @@ -1765,7 +1765,7 @@ static int poller_resize_items(ZMQ_Poller *this, int len) { this->len = len; if(len > old_len) { /* clear new space. */ - memset(&(this->items[old_len]), 0, (old_len - len) * sizeof(zmq_pollitem_t)); + memset(&(this->items[old_len]), 0, (len - old_len) * sizeof(zmq_pollitem_t)); } return len; } @@ -1823,6 +1823,8 @@ static void poller_remove_item(ZMQ_Poller *this, int idx) { this->free_list = idx; /* mark this slot as a free slot. */ items[idx].events = FREE_ITEM_EVENTS_TAG; + /* clear old revents. */ + items[idx].revents = 0; } static int poller_get_free_item(ZMQ_Poller *this) { @@ -1876,15 +1878,14 @@ static int poller_compact_items(ZMQ_Poller *this) { items = this->items; next = 0; /* find first free slot. */ - while(items[next].events != FREE_ITEM_EVENTS_TAG) { - assert(next <= old_count); + while(next < count && items[next].events != FREE_ITEM_EVENTS_TAG) { ++next; } /* move non-free slots into free slot. */ count = next; ++next; - while(next <= old_count) { + while(next < old_count) { if(items[next].events != FREE_ITEM_EVENTS_TAG) { /* found non-free slot, move it to the current free slot. */ items[count] = items[next]; @@ -1898,6 +1899,7 @@ static int poller_compact_items(ZMQ_Poller *this) { this->count = count; this->free_list = -1; /* free list is now empty. */ + assert(count <= this->len); return count; }