Lines Matching refs:ev
203 static void handle_signal(struct event* ev)
206 log_assert(ev->is_signal && ev->hEvent);
208 ret = WSAWaitForMultipleEvents(1, &ev->hEvent, 0 /* any object */,
221 if(!WSAResetEvent(ev->hEvent))
225 fptr_ok(fptr_whitelist_event(ev->ev_callback));
226 (*ev->ev_callback)(ev->ev_fd, ev->ev_events, ev->ev_arg);
469 void event_set(struct event *ev, int fd, short bits,
472 ev->node.key = ev;
473 ev->ev_fd = fd;
474 ev->ev_events = bits;
475 ev->ev_callback = cb;
476 fptr_ok(fptr_whitelist_event(ev->ev_callback));
477 ev->ev_arg = arg;
478 ev->just_checked = 0;
479 ev->added = 0;
482 int event_base_set(struct event_base *base, struct event *ev)
484 ev->ev_base = base;
485 ev->old_events = 0;
486 ev->stick_events = 0;
487 ev->added = 0;
491 int event_add(struct event *ev, struct timeval *tv)
494 ev, ev->added, ev->ev_fd,
496 (ev->ev_events&EV_READ)?" EV_READ":"",
497 (ev->ev_events&EV_WRITE)?" EV_WRITE":"",
498 (ev->ev_events&EV_TIMEOUT)?" EV_TIMEOUT":"");
499 if(ev->added)
500 event_del(ev);
501 log_assert(ev->ev_fd==-1 || find_fd(ev->ev_base, ev->ev_fd) == -1);
502 ev->is_tcp = 0;
503 ev->is_signal = 0;
504 ev->just_checked = 0;
506 if((ev->ev_events&(EV_READ|EV_WRITE)) && ev->ev_fd != -1) {
511 if(ev->ev_base->max == ev->ev_base->cap)
513 ev->idx = ev->ev_base->max++;
514 ev->ev_base->items[ev->idx] = ev;
516 if( (ev->ev_events&EV_READ) )
518 if( (ev->ev_events&EV_WRITE) )
521 if(getsockopt(ev->ev_fd, SOL_SOCKET, SO_TYPE,
527 ev->is_tcp = 1;
529 if( (ev->ev_events&EV_WRITE) )
532 if(getsockopt(ev->ev_fd, SOL_SOCKET, SO_ACCEPTCONN,
539 ev->hEvent = WSACreateEvent();
540 if(ev->hEvent == WSA_INVALID_EVENT)
545 if(WSAEventSelect(ev->ev_fd, ev->hEvent, events) != 0) {
549 if(ev->is_tcp && ev->stick_events &&
550 (ev->ev_events & ev->old_events)) {
552 ev->ev_base->tcp_reinvigorated = 1;
556 if(tv && (ev->ev_events&EV_TIMEOUT)) {
558 struct timeval *now = ev->ev_base->time_tv;
559 ev->ev_timeout.tv_sec = tv->tv_sec + now->tv_sec;
560 ev->ev_timeout.tv_usec = tv->tv_usec + now->tv_usec;
561 while(ev->ev_timeout.tv_usec >= 1000000) {
562 ev->ev_timeout.tv_usec -= 1000000;
563 ev->ev_timeout.tv_sec++;
566 (void)rbtree_insert(ev->ev_base->times, &ev->node);
568 ev->added = 1;
572 int event_del(struct event *ev)
575 ev, ev->added, ev->ev_fd,
576 (ev->ev_events&EV_TIMEOUT)?(long long)ev->ev_timeout.tv_sec*1000+
577 (long long)ev->ev_timeout.tv_usec/1000:-1,
578 (ev->ev_events&EV_READ)?" EV_READ":"",
579 (ev->ev_events&EV_WRITE)?" EV_WRITE":"",
580 (ev->ev_events&EV_TIMEOUT)?" EV_TIMEOUT":"");
581 if(!ev->added)
583 log_assert(ev->added);
584 if((ev->ev_events&EV_TIMEOUT))
585 (void)rbtree_delete(ev->ev_base->times, &ev->node);
586 if((ev->ev_events&(EV_READ|EV_WRITE)) && ev->ev_fd != -1) {
587 log_assert(ev->ev_base->max > 0);
589 ev->ev_base->items[ev->idx] =
590 ev->ev_base->items[ev->ev_base->max-1];
591 ev->ev_base->items[ev->ev_base->max-1] = NULL;
592 ev->ev_base->max--;
593 if(ev->idx < ev->ev_base->max)
594 ev->ev_base->items[ev->idx]->idx = ev->idx;
595 zero_waitfor(ev->ev_base->waitfor, ev->hEvent);
597 if(WSAEventSelect(ev->ev_fd, ev->hEvent, 0) != 0)
600 if(!WSACloseEvent(ev->hEvent))
604 ev->just_checked = 0;
605 ev->added = 0;
614 struct event* ev;
617 ev = signal_base->signals[sig];
618 if(!ev)
620 fptr_ok(fptr_whitelist_event(ev->ev_callback));
621 (*ev->ev_callback)(sig, EV_SIGNAL, ev->ev_arg);
624 int signal_add(struct event *ev, struct timeval * ATTR_UNUSED(tv))
626 if(ev->ev_fd == -1 || ev->ev_fd >= MAX_SIG)
628 signal_base = ev->ev_base;
629 ev->ev_base->signals[ev->ev_fd] = ev;
630 ev->added = 1;
631 if(signal(ev->ev_fd, sigh) == SIG_ERR) {
637 int signal_del(struct event *ev)
639 if(ev->ev_fd == -1 || ev->ev_fd >= MAX_SIG)
641 ev->ev_base->signals[ev->ev_fd] = NULL;
642 ev->added = 0;
646 void winsock_tcp_wouldblock(struct event* ev, int eventbits)
650 ev->old_events &= (~eventbits);
651 if(ev->old_events == 0)
652 ev->stick_events = 0;
659 int winsock_register_wsaevent(struct event_base* base, struct event* ev,
664 memset(ev, 0, sizeof(*ev));
665 ev->ev_fd = -1;
666 ev->ev_events = EV_READ;
667 ev->ev_callback = cb;
668 ev->ev_arg = arg;
669 ev->is_signal = 1;
670 ev->hEvent = wsaevent;
671 ev->added = 1;
672 ev->ev_base = base;
673 ev->idx = ev->ev_base->max++;
674 ev->ev_base->items[ev->idx] = ev;
678 void winsock_unregister_wsaevent(struct event* ev)
680 if(!ev || !ev->added) return;
681 log_assert(ev->added && ev->ev_base->max > 0)
683 ev->ev_base->items[ev->idx] = ev->ev_base->items[ev->ev_base->max-1];
684 ev->ev_base->items[ev->ev_base->max-1] = NULL;
685 ev->ev_base->max--;
686 if(ev->idx < ev->ev_base->max)
687 ev->ev_base->items[ev->idx]->idx = ev->idx;
688 ev->added = 0;