src/server/daemon/event_bsd.c

changeset 109
8a0a7754f123
parent 79
f48cea237ec3
child 111
c93be34fde76
equal deleted inserted replaced
108:2a394ccdd778 109:8a0a7754f123
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29 #include <stdio.h> 29 #include <stdio.h>
30 #include <stdlib.h> 30 #include <stdlib.h>
31
32 #include "../util/atomic.h"
31 33
32 #include "event_bsd.h" 34 #include "event_bsd.h"
33 35
34 event_handler_t* evhandler_create(int numthreads) { 36 event_handler_t* evhandler_create(int numthreads) {
35 event_handler_t *ev = malloc(sizeof(event_handler_t)); 37 event_handler_t *ev = malloc(sizeof(event_handler_t));
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 }

mercurial