From 7c8fcd3b9b8a3aec9ee2389c8e89837d2a742f80 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Sat, 23 Aug 2014 08:16:35 +0100 Subject: [PATCH] add max handle to limit the amount of handles to check. --- include/tr/comm_manager.h | 1 + src/comm_manager_poll.c | 4 ++-- src/i_comm_manager.c | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/tr/comm_manager.h b/include/tr/comm_manager.h index 0c4297d..2f0ba91 100644 --- a/include/tr/comm_manager.h +++ b/include/tr/comm_manager.h @@ -36,6 +36,7 @@ TR_CLASS(TR_CommManager) { TR_CommEndPoint * endpoints; nfds_t n_endpoints; + nfds_t max_handle; }; TR_INSTANCE_INIT(TR_CommManager); TR_CLASSVARS_DECL(TR_CommManager) { diff --git a/src/comm_manager_poll.c b/src/comm_manager_poll.c index 9d2d76c..2ea01af 100644 --- a/src/comm_manager_poll.c +++ b/src/comm_manager_poll.c @@ -80,10 +80,10 @@ TR_commManagerPollSelect(void * _this, TR_Event event, int timeout) nfds_t i; int nevents; - nevents = poll(this->fds, cmgr->n_endpoints, timeout); + nevents = poll(this->fds, cmgr->max_handle+1, timeout); if (nevents) { - for (i = 0; i < cmgr->n_endpoints; i++) { + for (i = 0; i < cmgr->max_handle+1; i++) { TR_CommEndPoint endpoint = cmgr->endpoints[i]; if ((this->fds[i].revents & POLLIN) == POLLIN) { diff --git a/src/i_comm_manager.c b/src/i_comm_manager.c index 0793abf..ee4cf84 100644 --- a/src/i_comm_manager.c +++ b/src/i_comm_manager.c @@ -43,6 +43,10 @@ TR_commManagerAddEndpoint(void * _this, TR_CommEndPoint endpoint) TR_delete(this->endpoints[endpoint->transport->handle]); } + this->max_handle = endpoint->transport->handle > this->max_handle + ? endpoint->transport->handle + : this->max_handle; + this->endpoints[endpoint->transport->handle] = endpoint; TR_CALL(_this, TR_CommManager, addEndpoint, endpoint); } @@ -102,6 +106,10 @@ TR_commManagerClose(void * _this, TR_Event event) TR_socketShutdown(endpoint->transport); TR_CALL(_this, TR_CommManager, close, event); + + if (endpoint->transport->handle == this->max_handle) { + while (! this->endpoints[--this->max_handle]); + } TR_delete(this->endpoints[endpoint->transport->handle]); return TR_EVENT_DONE;