ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev_kqueue.c
(Generate patch)

Comparing libev/ev_kqueue.c (file contents):
Revision 1.1 by root, Fri Nov 2 20:59:15 2007 UTC vs.
Revision 1.5 by root, Sat Nov 3 16:23:59 2007 UTC

1
2/* 1/*
3 * Copyright 2007 Marc Alexander Lehmann <libev@schmorp.de> 2 * Copyright 2007 Marc Alexander Lehmann <libev@schmorp.de>
4 * Copyright 2000-2002 Niels Provos <provos@citi.umich.edu> 3 * Copyright 2000-2002 Niels Provos <provos@citi.umich.edu>
5 * All rights reserved. 4 * All rights reserved.
6 * 5 *
54 ke->filter = filter; 53 ke->filter = filter;
55 ke->flags = flags; 54 ke->flags = flags;
56 ke->fflags = fflags; 55 ke->fflags = fflags;
57} 56}
58 57
58#ifndef NOTE_EOF
59# define NOTE_EOF 0
60#endif
61
59static void 62static void
60kqueue_modify (int fd, int oev, int nev) 63kqueue_modify (int fd, int oev, int nev)
61{ 64{
62 if ((oev ^ new) & EV_READ) 65 if ((oev ^ nev) & EV_READ)
63 { 66 {
64 if (nev & EV_READ) 67 if (nev & EV_READ)
65 kqueue_change (fd, EVFILT_READ, EV_ADD, NOTE_EOF); 68 kqueue_change (fd, EVFILT_READ, EV_ADD, NOTE_EOF);
66 else 69 else
67 kqueue_change (fd, EVFILT_READ, EV_DELETE, 0); 70 kqueue_change (fd, EVFILT_READ, EV_DELETE, 0);
68 } 71 }
69 72
70 if ((oev ^ new) & EV_WRITE) 73 if ((oev ^ nev) & EV_WRITE)
71 { 74 {
72 if (nev & EV_WRITE) 75 if (nev & EV_WRITE)
73 kqueue_change (fd, EVFILT_WRITE, EV_ADD, NOTE_EOF); 76 kqueue_change (fd, EVFILT_WRITE, EV_ADD, NOTE_EOF);
74 else 77 else
75 kqueue_change (fd, EVFILT_WRITE, EV_DELETE, 0); 78 kqueue_change (fd, EVFILT_WRITE, EV_DELETE, 0);
104 * should not be returned ever; but FreeBSD does :-\ 107 * should not be returned ever; but FreeBSD does :-\
105 * An error is also indicated when a callback deletes 108 * An error is also indicated when a callback deletes
106 * an event we are still processing. In that case 109 * an event we are still processing. In that case
107 * the data field is set to ENOENT. 110 * the data field is set to ENOENT.
108 */ 111 */
109 if (events [i].data == EBADF) 112 if (kq_events [i].data == EBADF)
110 fd_kill (events [i].ident); 113 fd_kill (kq_events [i].ident);
111 } 114 }
112 else 115 else
113 event ( 116 fd_event (
114 events [i].ident, 117 kq_events [i].ident,
115 events [i].filter == EVFILT_READ ? EV_READ 118 kq_events [i].filter == EVFILT_READ ? EV_READ
116 : events [i].filter == EVFILT_WRITE ? EV_WRITE 119 : kq_events [i].filter == EVFILT_WRITE ? EV_WRITE
117 : 0 120 : 0
118 ); 121 );
119 } 122 }
120 123
121 if (expect_false (res == kq_eventmax)) 124 if (expect_false (res == kq_eventmax))
125 kq_events = malloc (sizeof (struct kevent) * kq_eventmax); 128 kq_events = malloc (sizeof (struct kevent) * kq_eventmax);
126 } 129 }
127} 130}
128 131
129static void 132static void
130kqueue_init (struct event_base *base) 133kqueue_init (int flags)
131{ 134{
135 struct kevent ch, ev;
136
132 /* Initalize the kernel queue */ 137 /* Initalize the kernel queue */
133 if ((kq_fd = kqueue ()) == -1) 138 if ((kq_fd = kqueue ()) < 0)
134 {
135 free (kqueueop);
136 return;
137 }
138
139 /* Initalize fields */
140 kq_changes = malloc (NEVENT * sizeof (struct kevent));
141 if (!kq_changes)
142 return; 139 return;
143 140
144 events = malloc (NEVENT * sizeof (struct kevent)); 141 /* Check for Mac OS X kqueue bug. */
145 if (!events) 142 ch.ident = -1;
146 { 143 ch.filter = EVFILT_READ;
147 free (kq_changes); 144 ch.flags = EV_ADD;
148 return;
149 }
150 145
151 /* Check for Mac OS X kqueue bug. */
152 kq_changes [0].ident = -1;
153 kq_changes [0].filter = EVFILT_READ;
154 kq_changes [0].flags = EV_ADD;
155 /* 146 /*
156 * If kqueue works, then kevent will succeed, and it will 147 * If kqueue works, then kevent will succeed, and it will
157 * stick an error in events[0]. If kqueue is broken, then 148 * stick an error in ev. If kqueue is broken, then
158 * kevent will fail. 149 * kevent will fail.
159 */ 150 */
160 if (kevent (kq_fd, kq_changes, 1, kq_events, NEVENT, NULL) != 1 151 if (kevent (kq_fd, &ch, 1, &ev, 1, 0) != 1
161 || kq_events[0].ident != -1 152 || ev.ident != -1
162 || kq_events[0].flags != EV_ERROR) 153 || ev.flags != EV_ERROR)
163 { 154 {
164 /* detected broken kqueue */ 155 /* detected broken kqueue */
165 free (kq_changes);
166 free (kq_events);
167 close (kq_fd); 156 close (kq_fd);
168 return; 157 return;
169 } 158 }
170 159
171 ev_method = EVMETHOD_KQUEUE; 160 ev_method = EVMETHOD_KQUEUE;
172 method_fudge = 1e-3; /* needed to compensate for kevent returning early */ 161 method_fudge = 1e-3; /* needed to compensate for kevent returning early */
173 method_modify = kq_modify; 162 method_modify = kqueue_modify;
174 method_poll = kq_poll; 163 method_poll = kqueue_poll;
175 164
176 kq_eventmax = 64; /* intiial number of events receivable per poll */ 165 kq_eventmax = 64; /* intiial number of events receivable per poll */
177 kq_events = malloc (sizeof (struct kevent) * kq_eventmax); 166 kq_events = malloc (sizeof (struct kevent) * kq_eventmax);
178} 167}
179 168

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines