more capacity for winsock handler.

git-svn-id: file:///svn/unbound/trunk@1604 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2009-04-17 08:35:15 +00:00
parent f3d98d17f4
commit 6a152952bf
3 changed files with 22 additions and 15 deletions

View file

@ -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

View file

@ -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;

View file

@ -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()));