From: Wouter Wijngaards Date: Fri, 17 Apr 2009 08:35:15 +0000 (+0000) Subject: more capacity for winsock handler. X-Git-Tag: release-1.3.0~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6a152952bf7f5867d7ef1572e1bd699831d76abe;p=thirdparty%2Funbound.git more capacity for winsock handler. git-svn-id: file:///svn/unbound/trunk@1604 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index 7333cd375..d2fbb0a7c 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,6 +1,7 @@ 17 April 2009: Wouter - Fix reentrant in minievent handler for unix. Could have resulted in spurious event callbacks. + - timers do not take up a fd slot for winsock handler. 16 April 2009: Wouter - winsock event handler exit very quickly on signal, even if diff --git a/util/config_file.c b/util/config_file.c index 97a9e230c..657c353fc 100644 --- a/util/config_file.c +++ b/util/config_file.c @@ -87,11 +87,13 @@ config_create() cfg->log_time_ascii = 0; #ifndef USE_WINSOCK cfg->outgoing_num_ports = 256; -#else - cfg->outgoing_num_ports = 16; /* windows is limited in num fds */ -#endif cfg->outgoing_num_tcp = 10; cfg->incoming_num_tcp = 10; +#else + cfg->outgoing_num_ports = 48; /* windows is limited in num fds */ + cfg->outgoing_num_tcp = 2; /* leaves 64-52=12 for: 4if,1stop,thread4 */ + cfg->incoming_num_tcp = 2; +#endif cfg->msg_buffer_size = 65552; /* 64 k + a small margin */ cfg->msg_cache_size = 4 * 1024 * 1024; cfg->msg_cache_slabs = 4; diff --git a/util/winsock_event.c b/util/winsock_event.c index 55cc23143..bc214863f 100644 --- a/util/winsock_event.c +++ b/util/winsock_event.c @@ -495,10 +495,6 @@ int event_add(struct event *ev, struct timeval *tv) if(ev->added) event_del(ev); log_assert(ev->ev_fd==-1 || find_fd(ev->ev_base, ev->ev_fd) == -1); - if(ev->ev_base->max == ev->ev_base->cap) - return -1; - ev->idx = ev->ev_base->max++; - ev->ev_base->items[ev->idx] = ev; ev->is_tcp = 0; ev->is_signal = 0; ev->just_checked = 0; @@ -507,6 +503,12 @@ int event_add(struct event *ev, struct timeval *tv) BOOL b=0; int t, l; long events = 0; + + if(ev->ev_base->max == ev->ev_base->cap) + return -1; + ev->idx = ev->ev_base->max++; + ev->ev_base->items[ev->idx] = ev; + if( (ev->ev_events&EV_READ) ) events |= FD_READ; if( (ev->ev_events&EV_WRITE) ) @@ -574,17 +576,19 @@ int event_del(struct event *ev) (ev->ev_events&EV_TIMEOUT)?" EV_TIMEOUT":""); if(!ev->added) return 0; - log_assert(ev->added && ev->ev_base->max > 0) - /* remove item and compact the list */ - ev->ev_base->items[ev->idx] = ev->ev_base->items[ev->ev_base->max-1]; - ev->ev_base->items[ev->ev_base->max-1] = NULL; - ev->ev_base->max--; - if(ev->idx < ev->ev_base->max) - ev->ev_base->items[ev->idx]->idx = ev->idx; - + log_assert(ev->added); if((ev->ev_events&EV_TIMEOUT)) (void)rbtree_delete(ev->ev_base->times, &ev->node); if((ev->ev_events&(EV_READ|EV_WRITE)) && ev->ev_fd != -1) { + log_assert(ev->ev_base->max > 0); + /* remove item and compact the list */ + ev->ev_base->items[ev->idx] = + ev->ev_base->items[ev->ev_base->max-1]; + ev->ev_base->items[ev->ev_base->max-1] = NULL; + ev->ev_base->max--; + if(ev->idx < ev->ev_base->max) + ev->ev_base->items[ev->idx]->idx = ev->idx; + if(WSAEventSelect(ev->ev_fd, ev->hEvent, 0) != 0) log_err("WSAEventSelect(disable) failed: %s", wsa_strerror(WSAGetLastError()));