75 |
77 |
76 return ev; |
78 return ev; |
77 } |
79 } |
78 |
80 |
79 void ev_handle_events(ev_thr_conf_t *conf) { |
81 void ev_handle_events(ev_thr_conf_t *conf) { |
|
82 event_handler_t *ev = conf->handler; |
|
83 int kq = conf->port; |
80 |
84 |
|
85 free(conf); |
|
86 |
|
87 struct timespec timeout; |
|
88 timeout.tv_nsec = 0; |
|
89 timeout.tv_sec = 600; |
|
90 |
|
91 struct kevent events[16]; |
|
92 |
|
93 for(;;) { |
|
94 // wait for events |
|
95 int nev; |
|
96 nev = kevent(kq, NULL, 0, events, 16, &timeout); |
|
97 if(nev == -1) { |
|
98 // TODO: check for error |
|
99 perror("kevent"); |
|
100 continue; |
|
101 } |
|
102 |
|
103 for(int i=0;i<nev;i++) { |
|
104 event_t *event = events[i].udata; |
|
105 if(event->fn) { |
|
106 if(event->fn(ev, event)) { |
|
107 // TODO: reassociate? |
|
108 } else if(event->finish) { |
|
109 event->finish(ev, event); |
|
110 } |
|
111 } |
|
112 } |
|
113 } |
81 } |
114 } |
82 |
115 |
83 /* returns a event handler port */ |
116 /* returns a event handler port */ |
84 int ev_get_port(event_handler_t *h) { |
117 int ev_get_port(event_handler_t *h) { |
|
118 int nps = h->nports; |
|
119 if(nps == 1) { |
|
120 return h->ports[0]; |
|
121 } |
85 |
122 |
|
123 int cp = h->lp % nps; |
|
124 ws_atomic_inc32(&h->lp); |
|
125 |
|
126 return h->ports[cp]; |
86 } |
127 } |
87 |
128 |
88 int ev_pollin(event_handler_t *h, int fd, event_t *event) { |
129 int ev_pollin(event_handler_t *h, int fd, event_t *event) { |
89 |
130 struct kevent kev; |
|
131 EV_SET(&kev, fd, EVFILT_READ, EV_ADD, 0, 0, event); |
|
132 return kevent(ev_get_port(h), &kev, 1, NULL, 0, NULL); |
90 } |
133 } |
91 |
134 |
92 int ev_pollout(event_handler_t *h, int fd, event_t *event) { |
135 int ev_pollout(event_handler_t *h, int fd, event_t *event) { |
93 |
136 struct kevent kev; |
94 } |
137 EV_SET(&kev, fd, EVFILT_WRITE, EV_ADD, 0, 0, event); |
95 |
138 return kevent(ev_get_port(h), &kev, 1, NULL, 0, NULL); |
96 int ev_poll(event_handler_t *h, event_t *event) { |
|
97 |
|
98 } |
139 } |
99 |
140 |
100 int evt_send(event_handler_t *h, event_t *event) { |
141 int evt_send(event_handler_t *h, event_t *event) { |
101 |
142 return 0; |
102 } |
143 } |