Lines Matching +full:short +full:- +full:descriptor

4  * Copyright 2006-2007 Niels Provos
5 * Copyright 2007-2012 Niels Provos and Nick Mathewson
41 * Each entry in the ed_fds array corresponds to a file descriptor, and contains
49 * Helper functions are used: grow() grows the file descriptor array as
51 * the proper file-descriptor/event-port associations.
56 #include "event2/event-config.h"
57 #include "evconfig-private.h"
75 #include "evthread-internal.h"
76 #include "event-internal.h"
77 #include "log-internal.h"
78 #include "evsignal-internal.h"
79 #include "evmap-internal.h"
85 * Per-file-descriptor information about what events we're subscribed to. These
91 short fdi_what;
98 #define FDI_HAS_READ(fdi) ((fdi)->fdi_what & EV_READ)
99 #define FDI_HAS_WRITE(fdi) ((fdi)->fdi_what & EV_WRITE)
118 static int evport_add(struct event_base *, int fd, short old, short events, void *);
119 static int evport_del(struct event_base *, int fd, short old, short events, void *);
148 if ((evpd->ed_port = port_create()) == -1) { in evport_init()
154 close(evpd->ed_port); in evport_init()
159 evpd->ed_npending = 0; in evport_init()
172 if (data->ed_maxevents) { in grow()
173 newsize = data->ed_maxevents; in grow()
181 new_pending = mm_realloc(data->ed_pending, sizeof(int)*newsize); in grow()
183 return -1; in grow()
184 data->ed_pending = new_pending; in grow()
185 new_pevtlist = mm_realloc(data->ed_pevtlist, sizeof(port_event_t)*newsize); in grow()
187 return -1; in grow()
188 data->ed_pevtlist = new_pevtlist; in grow()
190 data->ed_maxevents = newsize; in grow()
198 * file descriptor ever used is rather large.
205 EVUTIL_ASSERT(evpd->ed_port > 0); in check_evportop()
220 EVUTIL_ASSERT(pevt->portev_source == PORT_SOURCE_FD); in check_event()
229 * (Re)associates the given file descriptor with the event port. The OS events
238 if (port_associate(epdp->ed_port, PORT_SOURCE_FD, in reassociate()
239 fd, sysevents, fdip) == -1) { in reassociate()
241 return (-1); in reassociate()
251 * Main event loop - polls port_getn for some number of events, and processes
259 struct evport_data *epdp = base->evbase; in evport_dispatch()
260 port_event_t *pevtlist = epdp->ed_pevtlist; in evport_dispatch()
272 * (only difference is nanoseconds vs. microseconds). If no time-based in evport_dispatch()
278 ts.tv_sec = tv->tv_sec; in evport_dispatch()
279 ts.tv_nsec = tv->tv_usec * 1000; in evport_dispatch()
288 for (i = 0; i < epdp->ed_npending; ++i) { in evport_dispatch()
290 const int fd = epdp->ed_pending[i]; in evport_dispatch()
291 if (fd != -1) { in evport_dispatch()
294 fdi = evmap_io_get_fdinfo_(&base->io, fd); in evport_dispatch()
299 /* epdp->ed_pending[i] = -1; */ in evport_dispatch()
300 fdi->pending_idx_plus_1 = 0; in evport_dispatch()
306 res = port_getn(epdp->ed_port, pevtlist, epdp->ed_maxevents, in evport_dispatch()
311 if (res == -1) { in evport_dispatch()
319 return (-1); in evport_dispatch()
327 int fd = (int) pevt->portev_object; in evport_dispatch()
328 struct fd_info *fdi = pevt->portev_user; in evport_dispatch()
329 /*EVUTIL_ASSERT(evmap_io_get_fdinfo_(&base->io, fd) == fdi);*/ in evport_dispatch()
333 epdp->ed_pending[i] = fd; in evport_dispatch()
334 fdi->pending_idx_plus_1 = i + 1; in evport_dispatch()
341 if (pevt->portev_events & (POLLERR|POLLHUP)) { in evport_dispatch()
344 if (pevt->portev_events & POLLIN) in evport_dispatch()
346 if (pevt->portev_events & POLLOUT) in evport_dispatch()
353 if (pevt->portev_events & (POLLERR|POLLHUP|POLLNVAL)) in evport_dispatch()
358 epdp->ed_npending = nevents; in evport_dispatch()
360 if (nevents == epdp->ed_maxevents && in evport_dispatch()
361 epdp->ed_maxevents < MAX_EVENTS_PER_GETN) { in evport_dispatch()
364 grow(epdp, epdp->ed_maxevents * 2); in evport_dispatch()
379 evport_add(struct event_base *base, int fd, short old, short events, void *p) in evport_add()
381 struct evport_data *evpd = base->evbase; in evport_add()
386 fdi->fdi_what |= events; in evport_add()
396 evport_del(struct event_base *base, int fd, short old, short events, void *p) in evport_del()
398 struct evport_data *evpd = base->evbase; in evport_del()
400 int associated = ! fdi->pending_idx_plus_1; in evport_del()
404 fdi->fdi_what &= ~(events &(EV_READ|EV_WRITE)); in evport_del()
408 port_dissociate(evpd->ed_port, PORT_SOURCE_FD, fd) == -1) { in evport_del()
415 return (-1); in evport_del()
423 if ((fdi->fdi_what & (EV_READ|EV_WRITE)) == 0) { in evport_del()
424 const int i = fdi->pending_idx_plus_1 - 1; in evport_del()
425 EVUTIL_ASSERT(evpd->ed_pending[i] == fd); in evport_del()
426 evpd->ed_pending[i] = -1; in evport_del()
427 fdi->pending_idx_plus_1 = 0; in evport_del()
437 struct evport_data *evpd = base->evbase; in evport_dealloc()
441 close(evpd->ed_port); in evport_dealloc()
443 if (evpd->ed_pending) in evport_dealloc()
444 mm_free(evpd->ed_pending); in evport_dealloc()
445 if (evpd->ed_pevtlist) in evport_dealloc()
446 mm_free(evpd->ed_pevtlist); in evport_dealloc()