Lines Matching +full:1000 +full:base +full:- +full:t

2  * util/winsock_event.c - implementation of the unbound winsock event handler. 
55 if(e->ev_timeout.tv_sec < f->ev_timeout.tv_sec) in mini_ev_cmp()
56 return -1; in mini_ev_cmp()
57 if(e->ev_timeout.tv_sec > f->ev_timeout.tv_sec) in mini_ev_cmp()
59 if(e->ev_timeout.tv_usec < f->ev_timeout.tv_usec) in mini_ev_cmp()
60 return -1; in mini_ev_cmp()
61 if(e->ev_timeout.tv_usec > f->ev_timeout.tv_usec) in mini_ev_cmp()
64 return -1; in mini_ev_cmp()
72 settime(struct event_base* base) in settime() argument
74 if(gettimeofday(base->time_tv, NULL) < 0) { in settime()
75 return -1; in settime()
78 *base->time_secs = (time_t)base->time_tv->tv_sec; in settime()
86 * Note that not all items have a fd associated (those are -1).
88 * @param base: event base to look in.
90 * @return the index in the array, or -1 on failure.
93 find_fd(struct event_base* base, int fd) in find_fd() argument
96 for(i=0; i<base->max; i++) { in find_fd()
97 if(base->items[i]->ev_fd == fd) in find_fd()
100 return -1; in find_fd()
104 /** Find ptr in base array */
117 struct event_base* base = (struct event_base*)malloc( in event_init() local
119 if(!base) in event_init()
121 memset(base, 0, sizeof(*base)); in event_init()
122 base->time_secs = time_secs; in event_init()
123 base->time_tv = time_tv; in event_init()
124 if(settime(base) < 0) { in event_init()
125 event_base_free(base); in event_init()
128 base->items = (struct event**)calloc(WSK_MAX_ITEMS, in event_init()
130 if(!base->items) { in event_init()
131 event_base_free(base); in event_init()
134 base->cap = WSK_MAX_ITEMS; in event_init()
135 base->max = 0; in event_init()
136 base->times = rbtree_create(mini_ev_cmp); in event_init()
137 if(!base->times) { in event_init()
138 event_base_free(base); in event_init()
141 base->signals = (struct event**)calloc(MAX_SIG, sizeof(struct event*)); in event_init()
142 if(!base->signals) { in event_init()
143 event_base_free(base); in event_init()
146 base->tcp_stickies = 0; in event_init()
147 base->tcp_reinvigorated = 0; in event_init()
149 return base; in event_init()
154 return "winsock-event-"PACKAGE_VERSION; in event_get_version()
162 /** call timeouts handlers, and return how long to wait for next one or -1 */
163 static void handle_timeouts(struct event_base* base, struct timeval* now, in handle_timeouts() argument
168 wait->tv_sec = (time_t)-1; in handle_timeouts()
172 while((rbnode_type*)(p = (struct event*)rbtree_first(base->times)) in handle_timeouts()
175 if(p->ev_timeout.tv_sec > now->tv_sec || in handle_timeouts()
176 (p->ev_timeout.tv_sec==now->tv_sec && in handle_timeouts()
177 p->ev_timeout.tv_usec > now->tv_usec)) { in handle_timeouts()
179 wait->tv_sec = p->ev_timeout.tv_sec - now->tv_sec; in handle_timeouts()
180 if(now->tv_usec > p->ev_timeout.tv_usec) { in handle_timeouts()
181 wait->tv_sec--; in handle_timeouts()
182 wait->tv_usec = 1000000 - (now->tv_usec - in handle_timeouts()
183 p->ev_timeout.tv_usec); in handle_timeouts()
185 wait->tv_usec = p->ev_timeout.tv_usec in handle_timeouts()
186 - now->tv_usec; in handle_timeouts()
189 (long long)wait->tv_sec, (int)wait->tv_usec); in handle_timeouts()
194 (void)rbtree_delete(base->times, p); in handle_timeouts()
195 p->ev_events &= ~EV_TIMEOUT; in handle_timeouts()
196 fptr_ok(fptr_whitelist_event(p->ev_callback)); in handle_timeouts()
197 (*p->ev_callback)(p->ev_fd, EV_TIMEOUT, p->ev_arg); in handle_timeouts()
199 verbose(VERB_CLIENT, "winsock_event wait=(-1)"); in handle_timeouts()
206 log_assert(ev->is_signal && ev->hEvent); in handle_signal()
208 ret = WSAWaitForMultipleEvents(1, &ev->hEvent, 0 /* any object */, in handle_signal()
221 if(!WSAResetEvent(ev->hEvent)) in handle_signal()
225 fptr_ok(fptr_whitelist_event(ev->ev_callback)); in handle_signal()
226 (*ev->ev_callback)(ev->ev_fd, ev->ev_events, ev->ev_arg); in handle_signal()
230 static int handle_select(struct event_base* base, struct timeval* wait) in handle_select() argument
243 if(wait->tv_sec==(time_t)-1) in handle_select()
246 timeout = wait->tv_sec*1000 + wait->tv_usec/1000; in handle_select()
247 if(base->tcp_stickies) { in handle_select()
256 for(i=0; i<base->max; i++) { in handle_select()
257 if(base->items[i]->ev_fd == -1 && !base->items[i]->is_signal) in handle_select()
259 eventlist[numwait] = base->items[i]; in handle_select()
260 base->waitfor[numwait++] = base->items[i]->hEvent; in handle_select()
266 "timeout=%d", base->max, numwait, (wait?"<wait>":"<null>"), in handle_select()
271 /* WSAWaitFor.. doesn't like 0 event objects */ in handle_select()
277 ret = WSAWaitForMultipleEvents(numwait, base->waitfor, in handle_select()
283 return -1; in handle_select()
287 return -1; in handle_select()
291 startidx = ret - WSA_WAIT_EVENT_0; in handle_select()
297 if(settime(base) < 0) in handle_select()
298 return -1; in handle_select()
301 if(base->tcp_stickies) in handle_select()
304 eventlist[i]->just_checked = 1; in handle_select()
308 if(!base->waitfor[i]) in handle_select()
310 if(eventlist[i]->is_signal) { in handle_select()
311 eventlist[i]->just_checked = 0; in handle_select()
315 /* early exit - do not process network, exit quickly */ in handle_select()
316 if(base->need_to_exit) in handle_select()
325 if(!base->waitfor[i]) in handle_select()
327 if(!eventlist[i]->just_checked) in handle_select()
329 if(eventlist[i]->is_signal) in handle_select()
331 eventlist[i]->just_checked = 0; in handle_select()
333 if(WSAEnumNetworkEvents(eventlist[i]->ev_fd, in handle_select()
334 base->waitfor[i], /* reset the event handle */ in handle_select()
339 return -1; in handle_select()
373 if(eventlist[i]->is_tcp && eventlist[i]->stick_events) { in handle_select()
375 eventlist[i]->ev_fd, in handle_select()
376 (eventlist[i]->old_events&EV_READ)?"EV_READ":"", in handle_select()
377 (eventlist[i]->old_events&EV_WRITE)?"EV_WRITE":""); in handle_select()
378 bits |= eventlist[i]->old_events; in handle_select()
380 if(eventlist[i]->is_tcp && bits) { in handle_select()
381 eventlist[i]->old_events = bits; in handle_select()
382 eventlist[i]->stick_events = 1; in handle_select()
383 if((eventlist[i]->ev_events & bits)) { in handle_select()
387 eventlist[i]->ev_fd, in handle_select()
388 (eventlist[i]->old_events&EV_READ)?"EV_READ":"", in handle_select()
389 (eventlist[i]->old_events&EV_WRITE)?"EV_WRITE":""); in handle_select()
391 if((bits & eventlist[i]->ev_events)) { in handle_select()
394 eventlist[i], eventlist[i]->ev_fd, in handle_select()
407 eventlist[i]->ev_callback)); in handle_select()
408 (*eventlist[i]->ev_callback)(eventlist[i]->ev_fd, in handle_select()
409 bits & eventlist[i]->ev_events, in handle_select()
410 eventlist[i]->ev_arg); in handle_select()
412 if(eventlist[i]->is_tcp && bits) in handle_select()
414 eventlist[i]->ev_fd, in handle_select()
415 (eventlist[i]->old_events&EV_READ)?"EV_READ":"", in handle_select()
416 (eventlist[i]->old_events&EV_WRITE)?"EV_WRITE":""); in handle_select()
419 if(base->tcp_reinvigorated) { in handle_select()
421 base->tcp_reinvigorated = 0; in handle_select()
424 base->tcp_stickies = newstickies; in handle_select()
429 int event_base_dispatch(struct event_base *base) in event_base_dispatch() argument
432 if(settime(base) < 0) in event_base_dispatch()
433 return -1; in event_base_dispatch()
434 while(!base->need_to_exit) in event_base_dispatch()
437 handle_timeouts(base, base->time_tv, &wait); in event_base_dispatch()
438 if(base->need_to_exit) in event_base_dispatch()
441 if(handle_select(base, &wait) < 0) { in event_base_dispatch()
442 if(base->need_to_exit) in event_base_dispatch()
444 return -1; in event_base_dispatch()
450 int event_base_loopexit(struct event_base *base, in event_base_loopexit() argument
454 base->need_to_exit = 1; in event_base_loopexit()
458 void event_base_free(struct event_base *base) in event_base_free() argument
461 if(!base) in event_base_free()
463 free(base->items); in event_base_free()
464 free(base->times); in event_base_free()
465 free(base->signals); in event_base_free()
466 free(base); in event_base_free()
472 ev->node.key = ev; in event_set()
473 ev->ev_fd = fd; in event_set()
474 ev->ev_events = bits; in event_set()
475 ev->ev_callback = cb; in event_set()
476 fptr_ok(fptr_whitelist_event(ev->ev_callback)); in event_set()
477 ev->ev_arg = arg; in event_set()
478 ev->just_checked = 0; in event_set()
479 ev->added = 0; in event_set()
482 int event_base_set(struct event_base *base, struct event *ev) in event_base_set() argument
484 ev->ev_base = base; in event_base_set()
485 ev->old_events = 0; in event_base_set()
486 ev->stick_events = 0; in event_base_set()
487 ev->added = 0; in event_base_set()
494 ev, ev->added, ev->ev_fd, in event_add()
495 (tv?(long long)tv->tv_sec*1000+(long long)tv->tv_usec/1000:-1), in event_add()
496 (ev->ev_events&EV_READ)?" EV_READ":"", in event_add()
497 (ev->ev_events&EV_WRITE)?" EV_WRITE":"", in event_add()
498 (ev->ev_events&EV_TIMEOUT)?" EV_TIMEOUT":""); in event_add()
499 if(ev->added) in event_add()
501 log_assert(ev->ev_fd==-1 || find_fd(ev->ev_base, ev->ev_fd) == -1); in event_add()
502 ev->is_tcp = 0; in event_add()
503 ev->is_signal = 0; in event_add()
504 ev->just_checked = 0; in event_add()
506 if((ev->ev_events&(EV_READ|EV_WRITE)) && ev->ev_fd != -1) { in event_add()
508 int t, l; in event_add() local
511 if(ev->ev_base->max == ev->ev_base->cap) in event_add()
512 return -1; in event_add()
513 ev->idx = ev->ev_base->max++; in event_add()
514 ev->ev_base->items[ev->idx] = ev; in event_add()
516 if( (ev->ev_events&EV_READ) ) in event_add()
518 if( (ev->ev_events&EV_WRITE) ) in event_add()
520 l = sizeof(t); in event_add()
521 if(getsockopt(ev->ev_fd, SOL_SOCKET, SO_TYPE, in event_add()
522 (void*)&t, &l) != 0) in event_add()
525 if(t == SOCK_STREAM) { in event_add()
527 ev->is_tcp = 1; in event_add()
529 if( (ev->ev_events&EV_WRITE) ) in event_add()
532 if(getsockopt(ev->ev_fd, SOL_SOCKET, SO_ACCEPTCONN, in event_add()
539 ev->hEvent = WSACreateEvent(); in event_add()
540 if(ev->hEvent == WSA_INVALID_EVENT) in event_add()
545 if(WSAEventSelect(ev->ev_fd, ev->hEvent, events) != 0) { in event_add()
549 if(ev->is_tcp && ev->stick_events && in event_add()
550 (ev->ev_events & ev->old_events)) { in event_add()
552 ev->ev_base->tcp_reinvigorated = 1; in event_add()
556 if(tv && (ev->ev_events&EV_TIMEOUT)) { in event_add()
558 struct timeval *now = ev->ev_base->time_tv; in event_add()
559 ev->ev_timeout.tv_sec = tv->tv_sec + now->tv_sec; in event_add()
560 ev->ev_timeout.tv_usec = tv->tv_usec + now->tv_usec; in event_add()
561 while(ev->ev_timeout.tv_usec >= 1000000) { in event_add()
562 ev->ev_timeout.tv_usec -= 1000000; in event_add()
563 ev->ev_timeout.tv_sec++; in event_add()
566 (void)rbtree_insert(ev->ev_base->times, &ev->node); in event_add()
568 ev->added = 1; in event_add()
575 ev, ev->added, ev->ev_fd, in event_del()
576 (ev->ev_events&EV_TIMEOUT)?(long long)ev->ev_timeout.tv_sec*1000+ in event_del()
577 (long long)ev->ev_timeout.tv_usec/1000:-1, in event_del()
578 (ev->ev_events&EV_READ)?" EV_READ":"", in event_del()
579 (ev->ev_events&EV_WRITE)?" EV_WRITE":"", in event_del()
580 (ev->ev_events&EV_TIMEOUT)?" EV_TIMEOUT":""); in event_del()
581 if(!ev->added) in event_del()
583 log_assert(ev->added); in event_del()
584 if((ev->ev_events&EV_TIMEOUT)) in event_del()
585 (void)rbtree_delete(ev->ev_base->times, &ev->node); in event_del()
586 if((ev->ev_events&(EV_READ|EV_WRITE)) && ev->ev_fd != -1) { in event_del()
587 log_assert(ev->ev_base->max > 0); in event_del()
589 ev->ev_base->items[ev->idx] = in event_del()
590 ev->ev_base->items[ev->ev_base->max-1]; in event_del()
591 ev->ev_base->items[ev->ev_base->max-1] = NULL; in event_del()
592 ev->ev_base->max--; in event_del()
593 if(ev->idx < ev->ev_base->max) in event_del()
594 ev->ev_base->items[ev->idx]->idx = ev->idx; in event_del()
595 zero_waitfor(ev->ev_base->waitfor, ev->hEvent); in event_del()
597 if(WSAEventSelect(ev->ev_fd, ev->hEvent, 0) != 0) in event_del()
600 if(!WSACloseEvent(ev->hEvent)) in event_del()
604 ev->just_checked = 0; in event_del()
605 ev->added = 0; in event_del()
609 /** which base gets to handle signals */
617 ev = signal_base->signals[sig]; in sigh()
620 fptr_ok(fptr_whitelist_event(ev->ev_callback)); in sigh()
621 (*ev->ev_callback)(sig, EV_SIGNAL, ev->ev_arg); in sigh()
626 if(ev->ev_fd == -1 || ev->ev_fd >= MAX_SIG) in signal_add()
627 return -1; in signal_add()
628 signal_base = ev->ev_base; in signal_add()
629 ev->ev_base->signals[ev->ev_fd] = ev; in signal_add()
630 ev->added = 1; in signal_add()
631 if(signal(ev->ev_fd, sigh) == SIG_ERR) { in signal_add()
632 return -1; in signal_add()
639 if(ev->ev_fd == -1 || ev->ev_fd >= MAX_SIG) in signal_del()
640 return -1; in signal_del()
641 ev->ev_base->signals[ev->ev_fd] = NULL; in signal_del()
642 ev->added = 0; in signal_del()
650 ev->old_events &= (~eventbits); in winsock_tcp_wouldblock()
651 if(ev->old_events == 0) in winsock_tcp_wouldblock()
652 ev->stick_events = 0; in winsock_tcp_wouldblock()
654 * possibly run an empty handler loop to reset the base in winsock_tcp_wouldblock()
659 int winsock_register_wsaevent(struct event_base* base, struct event* ev, in winsock_register_wsaevent() argument
662 if(base->max == base->cap) in winsock_register_wsaevent()
665 ev->ev_fd = -1; in winsock_register_wsaevent()
666 ev->ev_events = EV_READ; in winsock_register_wsaevent()
667 ev->ev_callback = cb; in winsock_register_wsaevent()
668 ev->ev_arg = arg; in winsock_register_wsaevent()
669 ev->is_signal = 1; in winsock_register_wsaevent()
670 ev->hEvent = wsaevent; in winsock_register_wsaevent()
671 ev->added = 1; in winsock_register_wsaevent()
672 ev->ev_base = base; in winsock_register_wsaevent()
673 ev->idx = ev->ev_base->max++; in winsock_register_wsaevent()
674 ev->ev_base->items[ev->idx] = ev; in winsock_register_wsaevent()
680 if(!ev || !ev->added) return; in winsock_unregister_wsaevent()
681 log_assert(ev->added && ev->ev_base->max > 0) in winsock_unregister_wsaevent()
683 ev->ev_base->items[ev->idx] = ev->ev_base->items[ev->ev_base->max-1]; in winsock_unregister_wsaevent()
684 ev->ev_base->items[ev->ev_base->max-1] = NULL; in winsock_unregister_wsaevent()
685 ev->ev_base->max--; in winsock_unregister_wsaevent()
686 if(ev->idx < ev->ev_base->max) in winsock_unregister_wsaevent()
687 ev->ev_base->items[ev->idx]->idx = ev->idx; in winsock_unregister_wsaevent()
688 ev->added = 0; in winsock_unregister_wsaevent()