… | |
… | |
127 | } |
127 | } |
128 | |
128 | |
129 | static void |
129 | static void |
130 | kqueue_init (struct event_base *base) |
130 | kqueue_init (struct event_base *base) |
131 | { |
131 | { |
|
|
132 | struct kevent ch, ev; |
|
|
133 | |
132 | /* Initalize the kernel queue */ |
134 | /* Initalize the kernel queue */ |
133 | if ((kq_fd = kqueue ()) == -1) |
135 | 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; |
136 | return; |
143 | |
137 | |
144 | events = malloc (NEVENT * sizeof (struct kevent)); |
138 | /* Check for Mac OS X kqueue bug. */ |
145 | if (!events) |
139 | ch.ident = -1; |
146 | { |
140 | ch.filter = EVFILT_READ; |
147 | free (kq_changes); |
141 | ch.flags = EV_ADD; |
148 | return; |
|
|
149 | } |
|
|
150 | |
142 | |
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 | /* |
143 | /* |
156 | * If kqueue works, then kevent will succeed, and it will |
144 | * If kqueue works, then kevent will succeed, and it will |
157 | * stick an error in events[0]. If kqueue is broken, then |
145 | * stick an error in events[0]. If kqueue is broken, then |
158 | * kevent will fail. |
146 | * kevent will fail. |
159 | */ |
147 | */ |
160 | if (kevent (kq_fd, kq_changes, 1, kq_events, NEVENT, NULL) != 1 |
148 | if (kevent (kq_fd, &ch, 1, &ev, 1, 0) != 1 |
161 | || kq_events[0].ident != -1 |
149 | || ev.ident != -1 |
162 | || kq_events[0].flags != EV_ERROR) |
150 | || ev.flags != EV_ERROR) |
163 | { |
151 | { |
164 | /* detected broken kqueue */ |
152 | /* detected broken kqueue */ |
165 | free (kq_changes); |
|
|
166 | free (kq_events); |
|
|
167 | close (kq_fd); |
153 | close (kq_fd); |
168 | return; |
154 | return; |
169 | } |
155 | } |
170 | |
156 | |
171 | ev_method = EVMETHOD_KQUEUE; |
157 | ev_method = EVMETHOD_KQUEUE; |