document the new binlog stats
[beanstalkd.git] / sock-bsd.c
blob39bd03eb3c6ad758f5146bb128d2549788e24535
1 #include <stdlib.h>
2 #include <errno.h>
3 #include <sys/types.h>
4 #include <sys/event.h>
5 #include <sys/time.h>
6 #include "dat.h"
8 static void handle(Socket *s, int events);
10 static Handle tick;
11 static void *tickval;
12 static int kq;
13 static int64 ival;
14 static struct timespec ivalts;
17 void
18 sockinit(Handle f, void *x, int64 ns)
20 tick = f;
21 tickval = x;
22 ival = ns;
23 ivalts.tv_sec = ns / 1000000000;
24 ivalts.tv_nsec = ns % 1000000000;
25 kq = kqueue();
26 if (kq == -1) {
27 twarn("kqueue");
28 exit(1);
33 int
34 sockwant(Socket *s, int rw)
36 struct kevent ev = {};
37 struct timespec ts = {};
39 if (!s->added && !rw) {
40 return 0;
41 } else if (rw) {
42 s->added = 1;
43 ev.flags = EV_ADD;
44 } else {
45 ev.flags = EV_DELETE;
48 switch (rw) {
49 case 'r':
50 ev.filter = EVFILT_READ;
51 break;
52 case 'w':
53 ev.filter = EVFILT_WRITE;
54 break;
56 ev.ident = s->fd;
57 ev.udata = s;
58 return kevent(kq, &ev, 1, NULL, 0, &ts);
62 void
63 sockmain()
65 int i, r, n = 500;
66 int64 e, t = nanoseconds();
67 struct kevent evs[n];
69 for (;;) {
70 r = kevent(kq, NULL, 0, evs, n, &ivalts);
71 if (r == -1 && errno != EINTR) {
72 twarn("kevent");
73 exit(1);
76 // should tick?
77 e = nanoseconds();
78 if (e-t > ival) {
79 tick(tickval, 0);
80 t = e;
83 for (i=0; i<r; i++) {
84 handle(evs[i].udata, evs[i].filter);
91 static void
92 handle(Socket *s, int filt)
94 switch (filt) {
95 case EVFILT_READ:
96 s->f(s->x, 'r');
97 break;
98 case EVFILT_WRITE:
99 s->f(s->x, 'w');
100 break;