Home | History | Annotate | Download | only in Modules
      1 /* select - Module containing unix select(2) call.
      2    Under Unix, the file descriptors are small integers.
      3    Under Win32, select only exists for sockets, and sockets may
      4    have any value except INVALID_SOCKET.
      5    Under BeOS, we suffer the same dichotomy as Win32; sockets can be anything
      6    >= 0.
      7 */
      8 
      9 #include "Python.h"
     10 #include <structmember.h>
     11 
     12 #ifdef __APPLE__
     13     /* Perform runtime testing for a broken poll on OSX to make it easier
     14      * to use the same binary on multiple releases of the OS.
     15      */
     16 #undef HAVE_BROKEN_POLL
     17 #endif
     18 
     19 /* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
     20    64 is too small (too many people have bumped into that limit).
     21    Here we boost it.
     22    Users who want even more than the boosted limit should #define
     23    FD_SETSIZE higher before this; e.g., via compiler /D switch.
     24 */
     25 #if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
     26 #define FD_SETSIZE 512
     27 #endif
     28 
     29 #if defined(HAVE_POLL_H)
     30 #include <poll.h>
     31 #elif defined(HAVE_SYS_POLL_H)
     32 #include <sys/poll.h>
     33 #endif
     34 
     35 #ifdef __sgi
     36 /* This is missing from unistd.h */
     37 extern void bzero(void *, int);
     38 #endif
     39 
     40 #ifdef HAVE_SYS_TYPES_H
     41 #include <sys/types.h>
     42 #endif
     43 
     44 #if defined(PYOS_OS2) && !defined(PYCC_GCC)
     45 #include <sys/time.h>
     46 #include <utils.h>
     47 #endif
     48 
     49 #ifdef MS_WINDOWS
     50 #  include <winsock2.h>
     51 #else
     52 #  define SOCKET int
     53 #  ifdef __BEOS__
     54 #    include <net/socket.h>
     55 #  elif defined(__VMS)
     56 #    include <socket.h>
     57 #  endif
     58 #endif
     59 
     60 static PyObject *SelectError;
     61 
     62 /* list of Python objects and their file descriptor */
     63 typedef struct {
     64     PyObject *obj;                           /* owned reference */
     65     SOCKET fd;
     66     int sentinel;                            /* -1 == sentinel */
     67 } pylist;
     68 
     69 static void
     70 reap_obj(pylist fd2obj[FD_SETSIZE + 1])
     71 {
     72     int i;
     73     for (i = 0; i < FD_SETSIZE + 1 && fd2obj[i].sentinel >= 0; i++) {
     74         Py_CLEAR(fd2obj[i].obj);
     75     }
     76     fd2obj[0].sentinel = -1;
     77 }
     78 
     79 
     80 /* returns -1 and sets the Python exception if an error occurred, otherwise
     81    returns a number >= 0
     82 */
     83 static int
     84 seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
     85 {
     86     int i;
     87     int max = -1;
     88     int index = 0;
     89     PyObject* fast_seq = NULL;
     90     PyObject* o = NULL;
     91 
     92     fd2obj[0].obj = (PyObject*)0;            /* set list to zero size */
     93     FD_ZERO(set);
     94 
     95     fast_seq = PySequence_Fast(seq, "arguments 1-3 must be sequences");
     96     if (!fast_seq)
     97         return -1;
     98 
     99     for (i = 0; i < PySequence_Fast_GET_SIZE(fast_seq); i++)  {
    100         SOCKET v;
    101 
    102         /* any intervening fileno() calls could decr this refcnt */
    103         if (!(o = PySequence_Fast_GET_ITEM(fast_seq, i)))
    104             return -1;
    105 
    106         Py_INCREF(o);
    107         v = PyObject_AsFileDescriptor( o );
    108         if (v == -1) goto finally;
    109 
    110 #if defined(_MSC_VER)
    111         max = 0;                             /* not used for Win32 */
    112 #else  /* !_MSC_VER */
    113         if (!_PyIsSelectable_fd(v)) {
    114             PyErr_SetString(PyExc_ValueError,
    115                         "filedescriptor out of range in select()");
    116             goto finally;
    117         }
    118         if (v > max)
    119             max = v;
    120 #endif /* _MSC_VER */
    121         FD_SET(v, set);
    122 
    123         /* add object and its file descriptor to the list */
    124         if (index >= FD_SETSIZE) {
    125             PyErr_SetString(PyExc_ValueError,
    126                           "too many file descriptors in select()");
    127             goto finally;
    128         }
    129         fd2obj[index].obj = o;
    130         fd2obj[index].fd = v;
    131         fd2obj[index].sentinel = 0;
    132         fd2obj[++index].sentinel = -1;
    133     }
    134     Py_DECREF(fast_seq);
    135     return max+1;
    136 
    137   finally:
    138     Py_XDECREF(o);
    139     Py_DECREF(fast_seq);
    140     return -1;
    141 }
    142 
    143 /* returns NULL and sets the Python exception if an error occurred */
    144 static PyObject *
    145 set2list(fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
    146 {
    147     int i, j, count=0;
    148     PyObject *list, *o;
    149     SOCKET fd;
    150 
    151     for (j = 0; fd2obj[j].sentinel >= 0; j++) {
    152         if (FD_ISSET(fd2obj[j].fd, set))
    153             count++;
    154     }
    155     list = PyList_New(count);
    156     if (!list)
    157         return NULL;
    158 
    159     i = 0;
    160     for (j = 0; fd2obj[j].sentinel >= 0; j++) {
    161         fd = fd2obj[j].fd;
    162         if (FD_ISSET(fd, set)) {
    163             o = fd2obj[j].obj;
    164             fd2obj[j].obj = NULL;
    165             /* transfer ownership */
    166             if (PyList_SetItem(list, i, o) < 0)
    167                 goto finally;
    168 
    169             i++;
    170         }
    171     }
    172     return list;
    173   finally:
    174     Py_DECREF(list);
    175     return NULL;
    176 }
    177 
    178 #undef SELECT_USES_HEAP
    179 #if FD_SETSIZE > 1024
    180 #define SELECT_USES_HEAP
    181 #endif /* FD_SETSIZE > 1024 */
    182 
    183 static PyObject *
    184 select_select(PyObject *self, PyObject *args)
    185 {
    186 #ifdef SELECT_USES_HEAP
    187     pylist *rfd2obj, *wfd2obj, *efd2obj;
    188 #else  /* !SELECT_USES_HEAP */
    189     /* XXX: All this should probably be implemented as follows:
    190      * - find the highest descriptor we're interested in
    191      * - add one
    192      * - that's the size
    193      * See: Stevens, APitUE, $12.5.1
    194      */
    195     pylist rfd2obj[FD_SETSIZE + 1];
    196     pylist wfd2obj[FD_SETSIZE + 1];
    197     pylist efd2obj[FD_SETSIZE + 1];
    198 #endif /* SELECT_USES_HEAP */
    199     PyObject *ifdlist, *ofdlist, *efdlist;
    200     PyObject *ret = NULL;
    201     PyObject *tout = Py_None;
    202     fd_set ifdset, ofdset, efdset;
    203     double timeout;
    204     struct timeval tv, *tvp;
    205     long seconds;
    206     int imax, omax, emax, max;
    207     int n;
    208 
    209     /* convert arguments */
    210     if (!PyArg_UnpackTuple(args, "select", 3, 4,
    211                           &ifdlist, &ofdlist, &efdlist, &tout))
    212         return NULL;
    213 
    214     if (tout == Py_None)
    215         tvp = (struct timeval *)0;
    216     else if (!PyNumber_Check(tout)) {
    217         PyErr_SetString(PyExc_TypeError,
    218                         "timeout must be a float or None");
    219         return NULL;
    220     }
    221     else {
    222         timeout = PyFloat_AsDouble(tout);
    223         if (timeout == -1 && PyErr_Occurred())
    224             return NULL;
    225         if (timeout > (double)LONG_MAX) {
    226             PyErr_SetString(PyExc_OverflowError,
    227                             "timeout period too long");
    228             return NULL;
    229         }
    230         seconds = (long)timeout;
    231         timeout = timeout - (double)seconds;
    232         tv.tv_sec = seconds;
    233         tv.tv_usec = (long)(timeout * 1E6);
    234         tvp = &tv;
    235     }
    236 
    237 
    238 #ifdef SELECT_USES_HEAP
    239     /* Allocate memory for the lists */
    240     rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
    241     wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
    242     efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 1);
    243     if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) {
    244         if (rfd2obj) PyMem_DEL(rfd2obj);
    245         if (wfd2obj) PyMem_DEL(wfd2obj);
    246         if (efd2obj) PyMem_DEL(efd2obj);
    247         return PyErr_NoMemory();
    248     }
    249 #endif /* SELECT_USES_HEAP */
    250     /* Convert sequences to fd_sets, and get maximum fd number
    251      * propagates the Python exception set in seq2set()
    252      */
    253     rfd2obj[0].sentinel = -1;
    254     wfd2obj[0].sentinel = -1;
    255     efd2obj[0].sentinel = -1;
    256     if ((imax=seq2set(ifdlist, &ifdset, rfd2obj)) < 0)
    257         goto finally;
    258     if ((omax=seq2set(ofdlist, &ofdset, wfd2obj)) < 0)
    259         goto finally;
    260     if ((emax=seq2set(efdlist, &efdset, efd2obj)) < 0)
    261         goto finally;
    262     max = imax;
    263     if (omax > max) max = omax;
    264     if (emax > max) max = emax;
    265 
    266     Py_BEGIN_ALLOW_THREADS
    267     n = select(max, &ifdset, &ofdset, &efdset, tvp);
    268     Py_END_ALLOW_THREADS
    269 
    270 #ifdef MS_WINDOWS
    271     if (n == SOCKET_ERROR) {
    272         PyErr_SetExcFromWindowsErr(SelectError, WSAGetLastError());
    273     }
    274 #else
    275     if (n < 0) {
    276         PyErr_SetFromErrno(SelectError);
    277     }
    278 #endif
    279     else {
    280         /* any of these three calls can raise an exception.  it's more
    281            convenient to test for this after all three calls... but
    282            is that acceptable?
    283         */
    284         ifdlist = set2list(&ifdset, rfd2obj);
    285         ofdlist = set2list(&ofdset, wfd2obj);
    286         efdlist = set2list(&efdset, efd2obj);
    287         if (PyErr_Occurred())
    288             ret = NULL;
    289         else
    290             ret = PyTuple_Pack(3, ifdlist, ofdlist, efdlist);
    291 
    292         Py_DECREF(ifdlist);
    293         Py_DECREF(ofdlist);
    294         Py_DECREF(efdlist);
    295     }
    296 
    297   finally:
    298     reap_obj(rfd2obj);
    299     reap_obj(wfd2obj);
    300     reap_obj(efd2obj);
    301 #ifdef SELECT_USES_HEAP
    302     PyMem_DEL(rfd2obj);
    303     PyMem_DEL(wfd2obj);
    304     PyMem_DEL(efd2obj);
    305 #endif /* SELECT_USES_HEAP */
    306     return ret;
    307 }
    308 
    309 #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
    310 /*
    311  * poll() support
    312  */
    313 
    314 typedef struct {
    315     PyObject_HEAD
    316     PyObject *dict;
    317     int ufd_uptodate;
    318     int ufd_len;
    319     struct pollfd *ufds;
    320     int poll_running;
    321 } pollObject;
    322 
    323 static PyTypeObject poll_Type;
    324 
    325 /* Update the malloc'ed array of pollfds to match the dictionary
    326    contained within a pollObject.  Return 1 on success, 0 on an error.
    327 */
    328 
    329 static int
    330 update_ufd_array(pollObject *self)
    331 {
    332     Py_ssize_t i, pos;
    333     PyObject *key, *value;
    334     struct pollfd *old_ufds = self->ufds;
    335 
    336     self->ufd_len = PyDict_Size(self->dict);
    337     PyMem_RESIZE(self->ufds, struct pollfd, self->ufd_len);
    338     if (self->ufds == NULL) {
    339         self->ufds = old_ufds;
    340         PyErr_NoMemory();
    341         return 0;
    342     }
    343 
    344     i = pos = 0;
    345     while (PyDict_Next(self->dict, &pos, &key, &value)) {
    346         assert(i < self->ufd_len);
    347         /* Never overflow */
    348         self->ufds[i].fd = (int)PyInt_AsLong(key);
    349         self->ufds[i].events = (short)(unsigned short)PyInt_AsLong(value);
    350         i++;
    351     }
    352     assert(i == self->ufd_len);
    353     self->ufd_uptodate = 1;
    354     return 1;
    355 }
    356 
    357 static int
    358 ushort_converter(PyObject *obj, void *ptr)
    359 {
    360     unsigned long uval;
    361 
    362     uval = PyLong_AsUnsignedLong(obj);
    363     if (uval == (unsigned long)-1 && PyErr_Occurred())
    364         return 0;
    365     if (uval > USHRT_MAX) {
    366         PyErr_SetString(PyExc_OverflowError,
    367                         "Python int too large for C unsigned short");
    368         return 0;
    369     }
    370 
    371     *(unsigned short *)ptr = Py_SAFE_DOWNCAST(uval, unsigned long, unsigned short);
    372     return 1;
    373 }
    374 
    375 PyDoc_STRVAR(poll_register_doc,
    376 "register(fd [, eventmask] ) -> None\n\n\
    377 Register a file descriptor with the polling object.\n\
    378 fd -- either an integer, or an object with a fileno() method returning an\n\
    379       int.\n\
    380 events -- an optional bitmask describing the type of events to check for");
    381 
    382 static PyObject *
    383 poll_register(pollObject *self, PyObject *args)
    384 {
    385     PyObject *o, *key, *value;
    386     int fd;
    387     unsigned short events = POLLIN | POLLPRI | POLLOUT;
    388     int err;
    389 
    390     if (!PyArg_ParseTuple(args, "O|O&:register", &o, ushort_converter, &events))
    391         return NULL;
    392 
    393     fd = PyObject_AsFileDescriptor(o);
    394     if (fd == -1) return NULL;
    395 
    396     /* Add entry to the internal dictionary: the key is the
    397        file descriptor, and the value is the event mask. */
    398     key = PyInt_FromLong(fd);
    399     if (key == NULL)
    400         return NULL;
    401     value = PyInt_FromLong(events);
    402     if (value == NULL) {
    403         Py_DECREF(key);
    404         return NULL;
    405     }
    406     err = PyDict_SetItem(self->dict, key, value);
    407     Py_DECREF(key);
    408     Py_DECREF(value);
    409     if (err < 0)
    410         return NULL;
    411 
    412     self->ufd_uptodate = 0;
    413 
    414     Py_INCREF(Py_None);
    415     return Py_None;
    416 }
    417 
    418 PyDoc_STRVAR(poll_modify_doc,
    419 "modify(fd, eventmask) -> None\n\n\
    420 Modify an already registered file descriptor.\n\
    421 fd -- either an integer, or an object with a fileno() method returning an\n\
    422       int.\n\
    423 events -- an optional bitmask describing the type of events to check for");
    424 
    425 static PyObject *
    426 poll_modify(pollObject *self, PyObject *args)
    427 {
    428     PyObject *o, *key, *value;
    429     int fd;
    430     unsigned short events;
    431     int err;
    432 
    433     if (!PyArg_ParseTuple(args, "OO&:modify", &o, ushort_converter, &events))
    434         return NULL;
    435 
    436     fd = PyObject_AsFileDescriptor(o);
    437     if (fd == -1) return NULL;
    438 
    439     /* Modify registered fd */
    440     key = PyInt_FromLong(fd);
    441     if (key == NULL)
    442         return NULL;
    443     if (PyDict_GetItem(self->dict, key) == NULL) {
    444         errno = ENOENT;
    445         PyErr_SetFromErrno(PyExc_IOError);
    446         return NULL;
    447     }
    448     value = PyInt_FromLong(events);
    449     if (value == NULL) {
    450         Py_DECREF(key);
    451         return NULL;
    452     }
    453     err = PyDict_SetItem(self->dict, key, value);
    454     Py_DECREF(key);
    455     Py_DECREF(value);
    456     if (err < 0)
    457         return NULL;
    458 
    459     self->ufd_uptodate = 0;
    460 
    461     Py_INCREF(Py_None);
    462     return Py_None;
    463 }
    464 
    465 
    466 PyDoc_STRVAR(poll_unregister_doc,
    467 "unregister(fd) -> None\n\n\
    468 Remove a file descriptor being tracked by the polling object.");
    469 
    470 static PyObject *
    471 poll_unregister(pollObject *self, PyObject *o)
    472 {
    473     PyObject *key;
    474     int fd;
    475 
    476     fd = PyObject_AsFileDescriptor( o );
    477     if (fd == -1)
    478         return NULL;
    479 
    480     /* Check whether the fd is already in the array */
    481     key = PyInt_FromLong(fd);
    482     if (key == NULL)
    483         return NULL;
    484 
    485     if (PyDict_DelItem(self->dict, key) == -1) {
    486         Py_DECREF(key);
    487         /* This will simply raise the KeyError set by PyDict_DelItem
    488            if the file descriptor isn't registered. */
    489         return NULL;
    490     }
    491 
    492     Py_DECREF(key);
    493     self->ufd_uptodate = 0;
    494 
    495     Py_INCREF(Py_None);
    496     return Py_None;
    497 }
    498 
    499 PyDoc_STRVAR(poll_poll_doc,
    500 "poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
    501 Polls the set of registered file descriptors, returning a list containing \n\
    502 any descriptors that have events or errors to report.");
    503 
    504 static PyObject *
    505 poll_poll(pollObject *self, PyObject *args)
    506 {
    507     PyObject *result_list = NULL, *tout = NULL;
    508     int timeout = 0, poll_result, i, j;
    509     PyObject *value = NULL, *num = NULL;
    510 
    511     if (!PyArg_UnpackTuple(args, "poll", 0, 1, &tout)) {
    512         return NULL;
    513     }
    514 
    515     /* Check values for timeout */
    516     if (tout == NULL || tout == Py_None)
    517         timeout = -1;
    518     else if (!PyNumber_Check(tout)) {
    519         PyErr_SetString(PyExc_TypeError,
    520                         "timeout must be an integer or None");
    521         return NULL;
    522     }
    523     else {
    524         tout = PyNumber_Int(tout);
    525         if (!tout)
    526             return NULL;
    527         timeout = _PyInt_AsInt(tout);
    528         Py_DECREF(tout);
    529         if (timeout == -1 && PyErr_Occurred())
    530             return NULL;
    531     }
    532 
    533     /* Avoid concurrent poll() invocation, issue 8865 */
    534     if (self->poll_running) {
    535         PyErr_SetString(PyExc_RuntimeError,
    536                         "concurrent poll() invocation");
    537         return NULL;
    538     }
    539 
    540     /* Ensure the ufd array is up to date */
    541     if (!self->ufd_uptodate)
    542         if (update_ufd_array(self) == 0)
    543             return NULL;
    544 
    545     self->poll_running = 1;
    546 
    547     /* call poll() */
    548     Py_BEGIN_ALLOW_THREADS
    549     poll_result = poll(self->ufds, self->ufd_len, timeout);
    550     Py_END_ALLOW_THREADS
    551 
    552     self->poll_running = 0;
    553 
    554     if (poll_result < 0) {
    555         PyErr_SetFromErrno(SelectError);
    556         return NULL;
    557     }
    558 
    559     /* build the result list */
    560 
    561     result_list = PyList_New(poll_result);
    562     if (!result_list)
    563         return NULL;
    564     else {
    565         for (i = 0, j = 0; j < poll_result; j++) {
    566             /* skip to the next fired descriptor */
    567             while (!self->ufds[i].revents) {
    568                 i++;
    569             }
    570             /* if we hit a NULL return, set value to NULL
    571                and break out of loop; code at end will
    572                clean up result_list */
    573             value = PyTuple_New(2);
    574             if (value == NULL)
    575                 goto error;
    576             num = PyInt_FromLong(self->ufds[i].fd);
    577             if (num == NULL) {
    578                 Py_DECREF(value);
    579                 goto error;
    580             }
    581             PyTuple_SET_ITEM(value, 0, num);
    582 
    583             /* The &0xffff is a workaround for AIX.  'revents'
    584                is a 16-bit short, and IBM assigned POLLNVAL
    585                to be 0x8000, so the conversion to int results
    586                in a negative number. See SF bug #923315. */
    587             num = PyInt_FromLong(self->ufds[i].revents & 0xffff);
    588             if (num == NULL) {
    589                 Py_DECREF(value);
    590                 goto error;
    591             }
    592             PyTuple_SET_ITEM(value, 1, num);
    593             if ((PyList_SetItem(result_list, j, value)) == -1) {
    594                 Py_DECREF(value);
    595                 goto error;
    596             }
    597             i++;
    598         }
    599     }
    600     return result_list;
    601 
    602   error:
    603     Py_DECREF(result_list);
    604     return NULL;
    605 }
    606 
    607 static PyMethodDef poll_methods[] = {
    608     {"register",        (PyCFunction)poll_register,
    609      METH_VARARGS,  poll_register_doc},
    610     {"modify",          (PyCFunction)poll_modify,
    611      METH_VARARGS,  poll_modify_doc},
    612     {"unregister",      (PyCFunction)poll_unregister,
    613      METH_O,        poll_unregister_doc},
    614     {"poll",            (PyCFunction)poll_poll,
    615      METH_VARARGS,  poll_poll_doc},
    616     {NULL,              NULL}           /* sentinel */
    617 };
    618 
    619 static pollObject *
    620 newPollObject(void)
    621 {
    622     pollObject *self;
    623     self = PyObject_New(pollObject, &poll_Type);
    624     if (self == NULL)
    625         return NULL;
    626     /* ufd_uptodate is a Boolean, denoting whether the
    627        array pointed to by ufds matches the contents of the dictionary. */
    628     self->ufd_uptodate = 0;
    629     self->ufds = NULL;
    630     self->poll_running = 0;
    631     self->dict = PyDict_New();
    632     if (self->dict == NULL) {
    633         Py_DECREF(self);
    634         return NULL;
    635     }
    636     return self;
    637 }
    638 
    639 static void
    640 poll_dealloc(pollObject *self)
    641 {
    642     if (self->ufds != NULL)
    643         PyMem_DEL(self->ufds);
    644     Py_XDECREF(self->dict);
    645     PyObject_Del(self);
    646 }
    647 
    648 static PyObject *
    649 poll_getattr(pollObject *self, char *name)
    650 {
    651     return Py_FindMethod(poll_methods, (PyObject *)self, name);
    652 }
    653 
    654 static PyTypeObject poll_Type = {
    655     /* The ob_type field must be initialized in the module init function
    656      * to be portable to Windows without using C++. */
    657     PyVarObject_HEAD_INIT(NULL, 0)
    658     "select.poll",              /*tp_name*/
    659     sizeof(pollObject),         /*tp_basicsize*/
    660     0,                          /*tp_itemsize*/
    661     /* methods */
    662     (destructor)poll_dealloc, /*tp_dealloc*/
    663     0,                          /*tp_print*/
    664     (getattrfunc)poll_getattr, /*tp_getattr*/
    665     0,                      /*tp_setattr*/
    666     0,                          /*tp_compare*/
    667     0,                          /*tp_repr*/
    668     0,                          /*tp_as_number*/
    669     0,                          /*tp_as_sequence*/
    670     0,                          /*tp_as_mapping*/
    671     0,                          /*tp_hash*/
    672 };
    673 
    674 PyDoc_STRVAR(poll_doc,
    675 "Returns a polling object, which supports registering and\n\
    676 unregistering file descriptors, and then polling them for I/O events.");
    677 
    678 static PyObject *
    679 select_poll(PyObject *self, PyObject *unused)
    680 {
    681     return (PyObject *)newPollObject();
    682 }
    683 
    684 #ifdef __APPLE__
    685 /*
    686  * On some systems poll() sets errno on invalid file descriptors. We test
    687  * for this at runtime because this bug may be fixed or introduced between
    688  * OS releases.
    689  */
    690 static int select_have_broken_poll(void)
    691 {
    692     int poll_test;
    693     int filedes[2];
    694 
    695     struct pollfd poll_struct = { 0, POLLIN|POLLPRI|POLLOUT, 0 };
    696 
    697     /* Create a file descriptor to make invalid */
    698     if (pipe(filedes) < 0) {
    699         return 1;
    700     }
    701     poll_struct.fd = filedes[0];
    702     close(filedes[0]);
    703     close(filedes[1]);
    704     poll_test = poll(&poll_struct, 1, 0);
    705     if (poll_test < 0) {
    706         return 1;
    707     } else if (poll_test == 0 && poll_struct.revents != POLLNVAL) {
    708         return 1;
    709     }
    710     return 0;
    711 }
    712 #endif /* __APPLE__ */
    713 
    714 #endif /* HAVE_POLL */
    715 
    716 #ifdef HAVE_EPOLL
    717 /* **************************************************************************
    718  *                      epoll interface for Linux 2.6
    719  *
    720  * Written by Christian Heimes
    721  * Inspired by Twisted's _epoll.pyx and select.poll()
    722  */
    723 
    724 #ifdef HAVE_SYS_EPOLL_H
    725 #include <sys/epoll.h>
    726 #endif
    727 
    728 typedef struct {
    729     PyObject_HEAD
    730     SOCKET epfd;                        /* epoll control file descriptor */
    731 } pyEpoll_Object;
    732 
    733 static PyTypeObject pyEpoll_Type;
    734 #define pyepoll_CHECK(op) (PyObject_TypeCheck((op), &pyEpoll_Type))
    735 
    736 static PyObject *
    737 pyepoll_err_closed(void)
    738 {
    739     PyErr_SetString(PyExc_ValueError, "I/O operation on closed epoll fd");
    740     return NULL;
    741 }
    742 
    743 static int
    744 pyepoll_internal_close(pyEpoll_Object *self)
    745 {
    746     int save_errno = 0;
    747     if (self->epfd >= 0) {
    748         int epfd = self->epfd;
    749         self->epfd = -1;
    750         Py_BEGIN_ALLOW_THREADS
    751         if (close(epfd) < 0)
    752             save_errno = errno;
    753         Py_END_ALLOW_THREADS
    754     }
    755     return save_errno;
    756 }
    757 
    758 static PyObject *
    759 newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
    760 {
    761     pyEpoll_Object *self;
    762 
    763     if (sizehint == -1) {
    764         sizehint = FD_SETSIZE-1;
    765     }
    766     else if (sizehint < 1) {
    767         PyErr_Format(PyExc_ValueError,
    768                      "sizehint must be greater zero, got %d",
    769                      sizehint);
    770         return NULL;
    771     }
    772 
    773     assert(type != NULL && type->tp_alloc != NULL);
    774     self = (pyEpoll_Object *) type->tp_alloc(type, 0);
    775     if (self == NULL)
    776         return NULL;
    777 
    778     if (fd == -1) {
    779         Py_BEGIN_ALLOW_THREADS
    780         self->epfd = epoll_create(sizehint);
    781         Py_END_ALLOW_THREADS
    782     }
    783     else {
    784         self->epfd = fd;
    785     }
    786     if (self->epfd < 0) {
    787         Py_DECREF(self);
    788         PyErr_SetFromErrno(PyExc_IOError);
    789         return NULL;
    790     }
    791     return (PyObject *)self;
    792 }
    793 
    794 
    795 static PyObject *
    796 pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
    797 {
    798     int sizehint = -1;
    799     static char *kwlist[] = {"sizehint", NULL};
    800 
    801     if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:epoll", kwlist,
    802                                      &sizehint))
    803         return NULL;
    804 
    805     return newPyEpoll_Object(type, sizehint, -1);
    806 }
    807 
    808 
    809 static void
    810 pyepoll_dealloc(pyEpoll_Object *self)
    811 {
    812     (void)pyepoll_internal_close(self);
    813     Py_TYPE(self)->tp_free(self);
    814 }
    815 
    816 static PyObject*
    817 pyepoll_close(pyEpoll_Object *self)
    818 {
    819     errno = pyepoll_internal_close(self);
    820     if (errno < 0) {
    821         PyErr_SetFromErrno(PyExc_IOError);
    822         return NULL;
    823     }
    824     Py_RETURN_NONE;
    825 }
    826 
    827 PyDoc_STRVAR(pyepoll_close_doc,
    828 "close() -> None\n\
    829 \n\
    830 Close the epoll control file descriptor. Further operations on the epoll\n\
    831 object will raise an exception.");
    832 
    833 static PyObject*
    834 pyepoll_get_closed(pyEpoll_Object *self)
    835 {
    836     if (self->epfd < 0)
    837         Py_RETURN_TRUE;
    838     else
    839         Py_RETURN_FALSE;
    840 }
    841 
    842 static PyObject*
    843 pyepoll_fileno(pyEpoll_Object *self)
    844 {
    845     if (self->epfd < 0)
    846         return pyepoll_err_closed();
    847     return PyInt_FromLong(self->epfd);
    848 }
    849 
    850 PyDoc_STRVAR(pyepoll_fileno_doc,
    851 "fileno() -> int\n\
    852 \n\
    853 Return the epoll control file descriptor.");
    854 
    855 static PyObject*
    856 pyepoll_fromfd(PyObject *cls, PyObject *args)
    857 {
    858     SOCKET fd;
    859 
    860     if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
    861         return NULL;
    862 
    863     return newPyEpoll_Object((PyTypeObject*)cls, -1, fd);
    864 }
    865 
    866 PyDoc_STRVAR(pyepoll_fromfd_doc,
    867 "fromfd(fd) -> epoll\n\
    868 \n\
    869 Create an epoll object from a given control fd.");
    870 
    871 static PyObject *
    872 pyepoll_internal_ctl(int epfd, int op, PyObject *pfd, unsigned int events)
    873 {
    874     struct epoll_event ev;
    875     int result;
    876     int fd;
    877 
    878     if (epfd < 0)
    879         return pyepoll_err_closed();
    880 
    881     fd = PyObject_AsFileDescriptor(pfd);
    882     if (fd == -1) {
    883         return NULL;
    884     }
    885 
    886     switch(op) {
    887         case EPOLL_CTL_ADD:
    888         case EPOLL_CTL_MOD:
    889         ev.events = events;
    890         ev.data.fd = fd;
    891         Py_BEGIN_ALLOW_THREADS
    892         result = epoll_ctl(epfd, op, fd, &ev);
    893         Py_END_ALLOW_THREADS
    894         break;
    895         case EPOLL_CTL_DEL:
    896         /* In kernel versions before 2.6.9, the EPOLL_CTL_DEL
    897          * operation required a non-NULL pointer in event, even
    898          * though this argument is ignored. */
    899         Py_BEGIN_ALLOW_THREADS
    900         result = epoll_ctl(epfd, op, fd, &ev);
    901         if (errno == EBADF) {
    902             /* fd already closed */
    903             result = 0;
    904             errno = 0;
    905         }
    906         Py_END_ALLOW_THREADS
    907         break;
    908         default:
    909         result = -1;
    910         errno = EINVAL;
    911     }
    912 
    913     if (result < 0) {
    914         PyErr_SetFromErrno(PyExc_IOError);
    915         return NULL;
    916     }
    917     Py_RETURN_NONE;
    918 }
    919 
    920 static PyObject *
    921 pyepoll_register(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
    922 {
    923     PyObject *pfd;
    924     unsigned int events = EPOLLIN | EPOLLOUT | EPOLLPRI;
    925     static char *kwlist[] = {"fd", "eventmask", NULL};
    926 
    927     if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|I:register", kwlist,
    928                                      &pfd, &events)) {
    929         return NULL;
    930     }
    931 
    932     return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_ADD, pfd, events);
    933 }
    934 
    935 PyDoc_STRVAR(pyepoll_register_doc,
    936 "register(fd[, eventmask]) -> None\n\
    937 \n\
    938 Registers a new fd or raises an IOError if the fd is already registered.\n\
    939 fd is the target file descriptor of the operation.\n\
    940 events is a bit set composed of the various EPOLL constants; the default\n\
    941 is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\
    942 \n\
    943 The epoll interface supports all file descriptors that support poll.");
    944 
    945 static PyObject *
    946 pyepoll_modify(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
    947 {
    948     PyObject *pfd;
    949     unsigned int events;
    950     static char *kwlist[] = {"fd", "eventmask", NULL};
    951 
    952     if (!PyArg_ParseTupleAndKeywords(args, kwds, "OI:modify", kwlist,
    953                                      &pfd, &events)) {
    954         return NULL;
    955     }
    956 
    957     return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_MOD, pfd, events);
    958 }
    959 
    960 PyDoc_STRVAR(pyepoll_modify_doc,
    961 "modify(fd, eventmask) -> None\n\
    962 \n\
    963 fd is the target file descriptor of the operation\n\
    964 events is a bit set composed of the various EPOLL constants");
    965 
    966 static PyObject *
    967 pyepoll_unregister(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
    968 {
    969     PyObject *pfd;
    970     static char *kwlist[] = {"fd", NULL};
    971 
    972     if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:unregister", kwlist,
    973                                      &pfd)) {
    974         return NULL;
    975     }
    976 
    977     return pyepoll_internal_ctl(self->epfd, EPOLL_CTL_DEL, pfd, 0);
    978 }
    979 
    980 PyDoc_STRVAR(pyepoll_unregister_doc,
    981 "unregister(fd) -> None\n\
    982 \n\
    983 fd is the target file descriptor of the operation.");
    984 
    985 static PyObject *
    986 pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
    987 {
    988     double dtimeout = -1.;
    989     int timeout;
    990     int maxevents = -1;
    991     int nfds, i;
    992     PyObject *elist = NULL, *etuple = NULL;
    993     struct epoll_event *evs = NULL;
    994     static char *kwlist[] = {"timeout", "maxevents", NULL};
    995 
    996     if (self->epfd < 0)
    997         return pyepoll_err_closed();
    998 
    999     if (!PyArg_ParseTupleAndKeywords(args, kwds, "|di:poll", kwlist,
   1000                                      &dtimeout, &maxevents)) {
   1001         return NULL;
   1002     }
   1003 
   1004     if (dtimeout < 0) {
   1005         timeout = -1;
   1006     }
   1007     else if (dtimeout * 1000.0 > INT_MAX) {
   1008         PyErr_SetString(PyExc_OverflowError,
   1009                         "timeout is too large");
   1010         return NULL;
   1011     }
   1012     else {
   1013         timeout = (int)(dtimeout * 1000.0);
   1014     }
   1015 
   1016     if (maxevents == -1) {
   1017         maxevents = FD_SETSIZE-1;
   1018     }
   1019     else if (maxevents < 1) {
   1020         PyErr_Format(PyExc_ValueError,
   1021                      "maxevents must be greater than 0, got %d",
   1022                      maxevents);
   1023         return NULL;
   1024     }
   1025 
   1026     evs = PyMem_New(struct epoll_event, maxevents);
   1027     if (evs == NULL) {
   1028         Py_DECREF(self);
   1029         PyErr_NoMemory();
   1030         return NULL;
   1031     }
   1032 
   1033     Py_BEGIN_ALLOW_THREADS
   1034     nfds = epoll_wait(self->epfd, evs, maxevents, timeout);
   1035     Py_END_ALLOW_THREADS
   1036     if (nfds < 0) {
   1037         PyErr_SetFromErrno(PyExc_IOError);
   1038         goto error;
   1039     }
   1040 
   1041     elist = PyList_New(nfds);
   1042     if (elist == NULL) {
   1043         goto error;
   1044     }
   1045 
   1046     for (i = 0; i < nfds; i++) {
   1047         etuple = Py_BuildValue("iI", evs[i].data.fd, evs[i].events);
   1048         if (etuple == NULL) {
   1049             Py_CLEAR(elist);
   1050             goto error;
   1051         }
   1052         PyList_SET_ITEM(elist, i, etuple);
   1053     }
   1054 
   1055     error:
   1056     PyMem_Free(evs);
   1057     return elist;
   1058 }
   1059 
   1060 PyDoc_STRVAR(pyepoll_poll_doc,
   1061 "poll([timeout=-1[, maxevents=-1]]) -> [(fd, events), (...)]\n\
   1062 \n\
   1063 Wait for events on the epoll file descriptor for a maximum time of timeout\n\
   1064 in seconds (as float). -1 makes poll wait indefinitely.\n\
   1065 Up to maxevents are returned to the caller.");
   1066 
   1067 static PyMethodDef pyepoll_methods[] = {
   1068     {"fromfd",          (PyCFunction)pyepoll_fromfd,
   1069      METH_VARARGS | METH_CLASS, pyepoll_fromfd_doc},
   1070     {"close",           (PyCFunction)pyepoll_close,     METH_NOARGS,
   1071      pyepoll_close_doc},
   1072     {"fileno",          (PyCFunction)pyepoll_fileno,    METH_NOARGS,
   1073      pyepoll_fileno_doc},
   1074     {"modify",          (PyCFunction)pyepoll_modify,
   1075      METH_VARARGS | METH_KEYWORDS,      pyepoll_modify_doc},
   1076     {"register",        (PyCFunction)pyepoll_register,
   1077      METH_VARARGS | METH_KEYWORDS,      pyepoll_register_doc},
   1078     {"unregister",      (PyCFunction)pyepoll_unregister,
   1079      METH_VARARGS | METH_KEYWORDS,      pyepoll_unregister_doc},
   1080     {"poll",            (PyCFunction)pyepoll_poll,
   1081      METH_VARARGS | METH_KEYWORDS,      pyepoll_poll_doc},
   1082     {NULL,      NULL},
   1083 };
   1084 
   1085 static PyGetSetDef pyepoll_getsetlist[] = {
   1086     {"closed", (getter)pyepoll_get_closed, NULL,
   1087      "True if the epoll handler is closed"},
   1088     {0},
   1089 };
   1090 
   1091 PyDoc_STRVAR(pyepoll_doc,
   1092 "select.epoll([sizehint=-1])\n\
   1093 \n\
   1094 Returns an epolling object\n\
   1095 \n\
   1096 sizehint must be a positive integer or -1 for the default size. The\n\
   1097 sizehint is used to optimize internal data structures. It doesn't limit\n\
   1098 the maximum number of monitored events.");
   1099 
   1100 static PyTypeObject pyEpoll_Type = {
   1101     PyVarObject_HEAD_INIT(NULL, 0)
   1102     "select.epoll",                                     /* tp_name */
   1103     sizeof(pyEpoll_Object),                             /* tp_basicsize */
   1104     0,                                                  /* tp_itemsize */
   1105     (destructor)pyepoll_dealloc,                        /* tp_dealloc */
   1106     0,                                                  /* tp_print */
   1107     0,                                                  /* tp_getattr */
   1108     0,                                                  /* tp_setattr */
   1109     0,                                                  /* tp_compare */
   1110     0,                                                  /* tp_repr */
   1111     0,                                                  /* tp_as_number */
   1112     0,                                                  /* tp_as_sequence */
   1113     0,                                                  /* tp_as_mapping */
   1114     0,                                                  /* tp_hash */
   1115     0,                                                  /* tp_call */
   1116     0,                                                  /* tp_str */
   1117     PyObject_GenericGetAttr,                            /* tp_getattro */
   1118     0,                                                  /* tp_setattro */
   1119     0,                                                  /* tp_as_buffer */
   1120     Py_TPFLAGS_DEFAULT,                                 /* tp_flags */
   1121     pyepoll_doc,                                        /* tp_doc */
   1122     0,                                                  /* tp_traverse */
   1123     0,                                                  /* tp_clear */
   1124     0,                                                  /* tp_richcompare */
   1125     0,                                                  /* tp_weaklistoffset */
   1126     0,                                                  /* tp_iter */
   1127     0,                                                  /* tp_iternext */
   1128     pyepoll_methods,                                    /* tp_methods */
   1129     0,                                                  /* tp_members */
   1130     pyepoll_getsetlist,                                 /* tp_getset */
   1131     0,                                                  /* tp_base */
   1132     0,                                                  /* tp_dict */
   1133     0,                                                  /* tp_descr_get */
   1134     0,                                                  /* tp_descr_set */
   1135     0,                                                  /* tp_dictoffset */
   1136     0,                                                  /* tp_init */
   1137     0,                                                  /* tp_alloc */
   1138     pyepoll_new,                                        /* tp_new */
   1139     0,                                                  /* tp_free */
   1140 };
   1141 
   1142 #endif /* HAVE_EPOLL */
   1143 
   1144 #ifdef HAVE_KQUEUE
   1145 /* **************************************************************************
   1146  *                      kqueue interface for BSD
   1147  *
   1148  * Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
   1149  * All rights reserved.
   1150  *
   1151  * Redistribution and use in source and binary forms, with or without
   1152  * modification, are permitted provided that the following conditions
   1153  * are met:
   1154  * 1. Redistributions of source code must retain the above copyright
   1155  *    notice, this list of conditions and the following disclaimer.
   1156  * 2. Redistributions in binary form must reproduce the above copyright
   1157  *    notice, this list of conditions and the following disclaimer in the
   1158  *    documentation and/or other materials provided with the distribution.
   1159  *
   1160  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   1161  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   1162  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   1163  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   1164  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   1165  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   1166  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   1167  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   1168  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   1169  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   1170  * SUCH DAMAGE.
   1171  */
   1172 
   1173 #ifdef HAVE_SYS_EVENT_H
   1174 #include <sys/event.h>
   1175 #endif
   1176 
   1177 PyDoc_STRVAR(kqueue_event_doc,
   1178 "kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)\n\
   1179 \n\
   1180 This object is the equivalent of the struct kevent for the C API.\n\
   1181 \n\
   1182 See the kqueue manpage for more detailed information about the meaning\n\
   1183 of the arguments.\n\
   1184 \n\
   1185 One minor note: while you might hope that udata could store a\n\
   1186 reference to a python object, it cannot, because it is impossible to\n\
   1187 keep a proper reference count of the object once it's passed into the\n\
   1188 kernel. Therefore, I have restricted it to only storing an integer.  I\n\
   1189 recommend ignoring it and simply using the 'ident' field to key off\n\
   1190 of. You could also set up a dictionary on the python side to store a\n\
   1191 udata->object mapping.");
   1192 
   1193 typedef struct {
   1194     PyObject_HEAD
   1195     struct kevent e;
   1196 } kqueue_event_Object;
   1197 
   1198 static PyTypeObject kqueue_event_Type;
   1199 
   1200 #define kqueue_event_Check(op) (PyObject_TypeCheck((op), &kqueue_event_Type))
   1201 
   1202 typedef struct {
   1203     PyObject_HEAD
   1204     SOCKET kqfd;                /* kqueue control fd */
   1205 } kqueue_queue_Object;
   1206 
   1207 static PyTypeObject kqueue_queue_Type;
   1208 
   1209 #define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type))
   1210 
   1211 #if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P)
   1212 #   error uintptr_t does not match void *!
   1213 #elif (SIZEOF_UINTPTR_T == SIZEOF_LONG_LONG)
   1214 #   define T_UINTPTRT         T_ULONGLONG
   1215 #   define T_INTPTRT          T_LONGLONG
   1216 #   define PyLong_AsUintptr_t PyLong_AsUnsignedLongLong
   1217 #   define UINTPTRT_FMT_UNIT  "K"
   1218 #   define INTPTRT_FMT_UNIT   "L"
   1219 #elif (SIZEOF_UINTPTR_T == SIZEOF_LONG)
   1220 #   define T_UINTPTRT         T_ULONG
   1221 #   define T_INTPTRT          T_LONG
   1222 #   define PyLong_AsUintptr_t PyLong_AsUnsignedLong
   1223 #   define UINTPTRT_FMT_UNIT  "k"
   1224 #   define INTPTRT_FMT_UNIT   "l"
   1225 #elif (SIZEOF_UINTPTR_T == SIZEOF_INT)
   1226 #   define T_UINTPTRT         T_UINT
   1227 #   define T_INTPTRT          T_INT
   1228 #   define PyLong_AsUintptr_t PyLong_AsUnsignedLong
   1229 #   define UINTPTRT_FMT_UNIT  "I"
   1230 #   define INTPTRT_FMT_UNIT   "i"
   1231 #else
   1232 #   error uintptr_t does not match int, long, or long long!
   1233 #endif
   1234 
   1235 /*
   1236  * kevent is not standard and its members vary across BSDs.
   1237  */
   1238 #if !defined(__OpenBSD__)
   1239 #   define IDENT_TYPE	T_UINTPTRT
   1240 #   define IDENT_CAST	Py_intptr_t
   1241 #   define DATA_TYPE	T_INTPTRT
   1242 #   define DATA_FMT_UNIT INTPTRT_FMT_UNIT
   1243 #   define IDENT_AsType	PyLong_AsUintptr_t
   1244 #else
   1245 #   define IDENT_TYPE	T_UINT
   1246 #   define IDENT_CAST	int
   1247 #   define DATA_TYPE	T_INT
   1248 #   define DATA_FMT_UNIT "i"
   1249 #   define IDENT_AsType	PyLong_AsUnsignedLong
   1250 #endif
   1251 
   1252 /* Unfortunately, we can't store python objects in udata, because
   1253  * kevents in the kernel can be removed without warning, which would
   1254  * forever lose the refcount on the object stored with it.
   1255  */
   1256 
   1257 #define KQ_OFF(x) offsetof(kqueue_event_Object, x)
   1258 static struct PyMemberDef kqueue_event_members[] = {
   1259     {"ident",           IDENT_TYPE,     KQ_OFF(e.ident)},
   1260     {"filter",          T_SHORT,        KQ_OFF(e.filter)},
   1261     {"flags",           T_USHORT,       KQ_OFF(e.flags)},
   1262     {"fflags",          T_UINT,         KQ_OFF(e.fflags)},
   1263     {"data",            DATA_TYPE,      KQ_OFF(e.data)},
   1264     {"udata",           T_UINTPTRT,     KQ_OFF(e.udata)},
   1265     {NULL} /* Sentinel */
   1266 };
   1267 #undef KQ_OFF
   1268 
   1269 static PyObject *
   1270 
   1271 kqueue_event_repr(kqueue_event_Object *s)
   1272 {
   1273     char buf[1024];
   1274     PyOS_snprintf(
   1275         buf, sizeof(buf),
   1276         "<select.kevent ident=%zu filter=%d flags=0x%x fflags=0x%x "
   1277         "data=0x%zd udata=%p>",
   1278         (size_t)(s->e.ident), s->e.filter, s->e.flags,
   1279         s->e.fflags, (Py_ssize_t)(s->e.data), s->e.udata);
   1280     return PyString_FromString(buf);
   1281 }
   1282 
   1283 static int
   1284 kqueue_event_init(kqueue_event_Object *self, PyObject *args, PyObject *kwds)
   1285 {
   1286     PyObject *pfd;
   1287     static char *kwlist[] = {"ident", "filter", "flags", "fflags",
   1288                              "data", "udata", NULL};
   1289     static char *fmt = "O|hHI" DATA_FMT_UNIT UINTPTRT_FMT_UNIT ":kevent";
   1290 
   1291     EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */
   1292 
   1293     if (!PyArg_ParseTupleAndKeywords(args, kwds, fmt, kwlist,
   1294         &pfd, &(self->e.filter), &(self->e.flags),
   1295         &(self->e.fflags), &(self->e.data), &(self->e.udata))) {
   1296         return -1;
   1297     }
   1298 
   1299     if (PyLong_Check(pfd)
   1300 #if IDENT_TYPE == T_UINT
   1301 	&& PyLong_AsUnsignedLong(pfd) <= UINT_MAX
   1302 #endif
   1303     ) {
   1304         self->e.ident = IDENT_AsType(pfd);
   1305     }
   1306     else {
   1307         self->e.ident = PyObject_AsFileDescriptor(pfd);
   1308     }
   1309     if (PyErr_Occurred()) {
   1310         return -1;
   1311     }
   1312     return 0;
   1313 }
   1314 
   1315 static PyObject *
   1316 kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
   1317                          int op)
   1318 {
   1319     Py_intptr_t result = 0;
   1320 
   1321     if (!kqueue_event_Check(o)) {
   1322         if (op == Py_EQ || op == Py_NE) {
   1323             PyObject *res = op == Py_EQ ? Py_False : Py_True;
   1324             Py_INCREF(res);
   1325             return res;
   1326         }
   1327         PyErr_Format(PyExc_TypeError,
   1328             "can't compare %.200s to %.200s",
   1329             Py_TYPE(s)->tp_name, Py_TYPE(o)->tp_name);
   1330         return NULL;
   1331     }
   1332     if (((result = (IDENT_CAST)(s->e.ident - o->e.ident)) == 0) &&
   1333         ((result = s->e.filter - o->e.filter) == 0) &&
   1334         ((result = s->e.flags - o->e.flags) == 0) &&
   1335         ((result = (int)(s->e.fflags - o->e.fflags)) == 0) &&
   1336         ((result = s->e.data - o->e.data) == 0) &&
   1337         ((result = s->e.udata - o->e.udata) == 0)
   1338        ) {
   1339         result = 0;
   1340     }
   1341 
   1342     switch (op) {
   1343         case Py_EQ:
   1344         result = (result == 0);
   1345         break;
   1346         case Py_NE:
   1347         result = (result != 0);
   1348         break;
   1349         case Py_LE:
   1350         result = (result <= 0);
   1351         break;
   1352         case Py_GE:
   1353         result = (result >= 0);
   1354         break;
   1355         case Py_LT:
   1356         result = (result < 0);
   1357         break;
   1358         case Py_GT:
   1359         result = (result > 0);
   1360         break;
   1361     }
   1362     return PyBool_FromLong((long)result);
   1363 }
   1364 
   1365 static PyTypeObject kqueue_event_Type = {
   1366     PyVarObject_HEAD_INIT(NULL, 0)
   1367     "select.kevent",                                    /* tp_name */
   1368     sizeof(kqueue_event_Object),                        /* tp_basicsize */
   1369     0,                                                  /* tp_itemsize */
   1370     0,                                                  /* tp_dealloc */
   1371     0,                                                  /* tp_print */
   1372     0,                                                  /* tp_getattr */
   1373     0,                                                  /* tp_setattr */
   1374     0,                                                  /* tp_compare */
   1375     (reprfunc)kqueue_event_repr,                        /* tp_repr */
   1376     0,                                                  /* tp_as_number */
   1377     0,                                                  /* tp_as_sequence */
   1378     0,                                                  /* tp_as_mapping */
   1379     0,                                                  /* tp_hash */
   1380     0,                                                  /* tp_call */
   1381     0,                                                  /* tp_str */
   1382     0,                                                  /* tp_getattro */
   1383     0,                                                  /* tp_setattro */
   1384     0,                                                  /* tp_as_buffer */
   1385     Py_TPFLAGS_DEFAULT,                                 /* tp_flags */
   1386     kqueue_event_doc,                                   /* tp_doc */
   1387     0,                                                  /* tp_traverse */
   1388     0,                                                  /* tp_clear */
   1389     (richcmpfunc)kqueue_event_richcompare,              /* tp_richcompare */
   1390     0,                                                  /* tp_weaklistoffset */
   1391     0,                                                  /* tp_iter */
   1392     0,                                                  /* tp_iternext */
   1393     0,                                                  /* tp_methods */
   1394     kqueue_event_members,                               /* tp_members */
   1395     0,                                                  /* tp_getset */
   1396     0,                                                  /* tp_base */
   1397     0,                                                  /* tp_dict */
   1398     0,                                                  /* tp_descr_get */
   1399     0,                                                  /* tp_descr_set */
   1400     0,                                                  /* tp_dictoffset */
   1401     (initproc)kqueue_event_init,                        /* tp_init */
   1402     0,                                                  /* tp_alloc */
   1403     0,                                                  /* tp_new */
   1404     0,                                                  /* tp_free */
   1405 };
   1406 
   1407 static PyObject *
   1408 kqueue_queue_err_closed(void)
   1409 {
   1410     PyErr_SetString(PyExc_ValueError, "I/O operation on closed kqueue fd");
   1411     return NULL;
   1412 }
   1413 
   1414 static int
   1415 kqueue_queue_internal_close(kqueue_queue_Object *self)
   1416 {
   1417     int save_errno = 0;
   1418     if (self->kqfd >= 0) {
   1419         int kqfd = self->kqfd;
   1420         self->kqfd = -1;
   1421         Py_BEGIN_ALLOW_THREADS
   1422         if (close(kqfd) < 0)
   1423             save_errno = errno;
   1424         Py_END_ALLOW_THREADS
   1425     }
   1426     return save_errno;
   1427 }
   1428 
   1429 static PyObject *
   1430 newKqueue_Object(PyTypeObject *type, SOCKET fd)
   1431 {
   1432     kqueue_queue_Object *self;
   1433     assert(type != NULL && type->tp_alloc != NULL);
   1434     self = (kqueue_queue_Object *) type->tp_alloc(type, 0);
   1435     if (self == NULL) {
   1436         return NULL;
   1437     }
   1438 
   1439     if (fd == -1) {
   1440         Py_BEGIN_ALLOW_THREADS
   1441         self->kqfd = kqueue();
   1442         Py_END_ALLOW_THREADS
   1443     }
   1444     else {
   1445         self->kqfd = fd;
   1446     }
   1447     if (self->kqfd < 0) {
   1448         Py_DECREF(self);
   1449         PyErr_SetFromErrno(PyExc_IOError);
   1450         return NULL;
   1451     }
   1452     return (PyObject *)self;
   1453 }
   1454 
   1455 static PyObject *
   1456 kqueue_queue_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
   1457 {
   1458 
   1459     if ((args != NULL && PyObject_Size(args)) ||
   1460                     (kwds != NULL && PyObject_Size(kwds))) {
   1461         PyErr_SetString(PyExc_ValueError,
   1462                         "select.kqueue doesn't accept arguments");
   1463         return NULL;
   1464     }
   1465 
   1466     return newKqueue_Object(type, -1);
   1467 }
   1468 
   1469 static void
   1470 kqueue_queue_dealloc(kqueue_queue_Object *self)
   1471 {
   1472     kqueue_queue_internal_close(self);
   1473     Py_TYPE(self)->tp_free(self);
   1474 }
   1475 
   1476 static PyObject*
   1477 kqueue_queue_close(kqueue_queue_Object *self)
   1478 {
   1479     errno = kqueue_queue_internal_close(self);
   1480     if (errno < 0) {
   1481         PyErr_SetFromErrno(PyExc_IOError);
   1482         return NULL;
   1483     }
   1484     Py_RETURN_NONE;
   1485 }
   1486 
   1487 PyDoc_STRVAR(kqueue_queue_close_doc,
   1488 "close() -> None\n\
   1489 \n\
   1490 Close the kqueue control file descriptor. Further operations on the kqueue\n\
   1491 object will raise an exception.");
   1492 
   1493 static PyObject*
   1494 kqueue_queue_get_closed(kqueue_queue_Object *self)
   1495 {
   1496     if (self->kqfd < 0)
   1497         Py_RETURN_TRUE;
   1498     else
   1499         Py_RETURN_FALSE;
   1500 }
   1501 
   1502 static PyObject*
   1503 kqueue_queue_fileno(kqueue_queue_Object *self)
   1504 {
   1505     if (self->kqfd < 0)
   1506         return kqueue_queue_err_closed();
   1507     return PyInt_FromLong(self->kqfd);
   1508 }
   1509 
   1510 PyDoc_STRVAR(kqueue_queue_fileno_doc,
   1511 "fileno() -> int\n\
   1512 \n\
   1513 Return the kqueue control file descriptor.");
   1514 
   1515 static PyObject*
   1516 kqueue_queue_fromfd(PyObject *cls, PyObject *args)
   1517 {
   1518     SOCKET fd;
   1519 
   1520     if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
   1521         return NULL;
   1522 
   1523     return newKqueue_Object((PyTypeObject*)cls, fd);
   1524 }
   1525 
   1526 PyDoc_STRVAR(kqueue_queue_fromfd_doc,
   1527 "fromfd(fd) -> kqueue\n\
   1528 \n\
   1529 Create a kqueue object from a given control fd.");
   1530 
   1531 static PyObject *
   1532 kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
   1533 {
   1534     int nevents = 0;
   1535     int gotevents = 0;
   1536     int nchanges = 0;
   1537     int i = 0;
   1538     PyObject *otimeout = NULL;
   1539     PyObject *ch = NULL;
   1540     PyObject *it = NULL, *ei = NULL;
   1541     PyObject *result = NULL;
   1542     struct kevent *evl = NULL;
   1543     struct kevent *chl = NULL;
   1544     struct timespec timeoutspec;
   1545     struct timespec *ptimeoutspec;
   1546 
   1547     if (self->kqfd < 0)
   1548         return kqueue_queue_err_closed();
   1549 
   1550     if (!PyArg_ParseTuple(args, "Oi|O:control", &ch, &nevents, &otimeout))
   1551         return NULL;
   1552 
   1553     if (nevents < 0) {
   1554         PyErr_Format(PyExc_ValueError,
   1555             "Length of eventlist must be 0 or positive, got %d",
   1556             nevents);
   1557         return NULL;
   1558     }
   1559 
   1560     if (otimeout == Py_None || otimeout == NULL) {
   1561         ptimeoutspec = NULL;
   1562     }
   1563     else if (PyNumber_Check(otimeout)) {
   1564         double timeout;
   1565         long seconds;
   1566 
   1567         timeout = PyFloat_AsDouble(otimeout);
   1568         if (timeout == -1 && PyErr_Occurred())
   1569             return NULL;
   1570         if (timeout > (double)LONG_MAX) {
   1571             PyErr_SetString(PyExc_OverflowError,
   1572                             "timeout period too long");
   1573             return NULL;
   1574         }
   1575         if (timeout < 0) {
   1576             PyErr_SetString(PyExc_ValueError,
   1577                             "timeout must be positive or None");
   1578             return NULL;
   1579         }
   1580 
   1581         seconds = (long)timeout;
   1582         timeout = timeout - (double)seconds;
   1583         timeoutspec.tv_sec = seconds;
   1584         timeoutspec.tv_nsec = (long)(timeout * 1E9);
   1585         ptimeoutspec = &timeoutspec;
   1586     }
   1587     else {
   1588         PyErr_Format(PyExc_TypeError,
   1589             "timeout argument must be an number "
   1590             "or None, got %.200s",
   1591             Py_TYPE(otimeout)->tp_name);
   1592         return NULL;
   1593     }
   1594 
   1595     if (ch != NULL && ch != Py_None) {
   1596         it = PyObject_GetIter(ch);
   1597         if (it == NULL) {
   1598             PyErr_SetString(PyExc_TypeError,
   1599                             "changelist is not iterable");
   1600             return NULL;
   1601         }
   1602         nchanges = PyObject_Size(ch);
   1603         if (nchanges < 0) {
   1604             goto error;
   1605         }
   1606 
   1607         chl = PyMem_New(struct kevent, nchanges);
   1608         if (chl == NULL) {
   1609             PyErr_NoMemory();
   1610             goto error;
   1611         }
   1612         i = 0;
   1613         while ((ei = PyIter_Next(it)) != NULL) {
   1614             if (!kqueue_event_Check(ei)) {
   1615                 Py_DECREF(ei);
   1616                 PyErr_SetString(PyExc_TypeError,
   1617                     "changelist must be an iterable of "
   1618                     "select.kevent objects");
   1619                 goto error;
   1620             } else {
   1621                 chl[i++] = ((kqueue_event_Object *)ei)->e;
   1622             }
   1623             Py_DECREF(ei);
   1624         }
   1625     }
   1626     Py_CLEAR(it);
   1627 
   1628     /* event list */
   1629     if (nevents) {
   1630         evl = PyMem_New(struct kevent, nevents);
   1631         if (evl == NULL) {
   1632             PyErr_NoMemory();
   1633             goto error;
   1634         }
   1635     }
   1636 
   1637     Py_BEGIN_ALLOW_THREADS
   1638     gotevents = kevent(self->kqfd, chl, nchanges,
   1639                        evl, nevents, ptimeoutspec);
   1640     Py_END_ALLOW_THREADS
   1641 
   1642     if (gotevents == -1) {
   1643         PyErr_SetFromErrno(PyExc_OSError);
   1644         goto error;
   1645     }
   1646 
   1647     result = PyList_New(gotevents);
   1648     if (result == NULL) {
   1649         goto error;
   1650     }
   1651 
   1652     for (i = 0; i < gotevents; i++) {
   1653         kqueue_event_Object *ch;
   1654 
   1655         ch = PyObject_New(kqueue_event_Object, &kqueue_event_Type);
   1656         if (ch == NULL) {
   1657             goto error;
   1658         }
   1659         ch->e = evl[i];
   1660         PyList_SET_ITEM(result, i, (PyObject *)ch);
   1661     }
   1662     PyMem_Free(chl);
   1663     PyMem_Free(evl);
   1664     return result;
   1665 
   1666     error:
   1667     PyMem_Free(chl);
   1668     PyMem_Free(evl);
   1669     Py_XDECREF(result);
   1670     Py_XDECREF(it);
   1671     return NULL;
   1672 }
   1673 
   1674 PyDoc_STRVAR(kqueue_queue_control_doc,
   1675 "control(changelist, max_events[, timeout=None]) -> eventlist\n\
   1676 \n\
   1677 Calls the kernel kevent function.\n\
   1678 - changelist must be a list of kevent objects describing the changes\n\
   1679   to be made to the kernel's watch list or None.\n\
   1680 - max_events lets you specify the maximum number of events that the\n\
   1681   kernel will return.\n\
   1682 - timeout is the maximum time to wait in seconds, or else None,\n\
   1683   to wait forever. timeout accepts floats for smaller timeouts, too.");
   1684 
   1685 
   1686 static PyMethodDef kqueue_queue_methods[] = {
   1687     {"fromfd",          (PyCFunction)kqueue_queue_fromfd,
   1688      METH_VARARGS | METH_CLASS, kqueue_queue_fromfd_doc},
   1689     {"close",           (PyCFunction)kqueue_queue_close,        METH_NOARGS,
   1690      kqueue_queue_close_doc},
   1691     {"fileno",          (PyCFunction)kqueue_queue_fileno,       METH_NOARGS,
   1692      kqueue_queue_fileno_doc},
   1693     {"control",         (PyCFunction)kqueue_queue_control,
   1694      METH_VARARGS ,     kqueue_queue_control_doc},
   1695     {NULL,      NULL},
   1696 };
   1697 
   1698 static PyGetSetDef kqueue_queue_getsetlist[] = {
   1699     {"closed", (getter)kqueue_queue_get_closed, NULL,
   1700      "True if the kqueue handler is closed"},
   1701     {0},
   1702 };
   1703 
   1704 PyDoc_STRVAR(kqueue_queue_doc,
   1705 "Kqueue syscall wrapper.\n\
   1706 \n\
   1707 For example, to start watching a socket for input:\n\
   1708 >>> kq = kqueue()\n\
   1709 >>> sock = socket()\n\
   1710 >>> sock.connect((host, port))\n\
   1711 >>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_ADD)], 0)\n\
   1712 \n\
   1713 To wait one second for it to become writeable:\n\
   1714 >>> kq.control(None, 1, 1000)\n\
   1715 \n\
   1716 To stop listening:\n\
   1717 >>> kq.control([kevent(sock, KQ_FILTER_WRITE, KQ_EV_DELETE)], 0)");
   1718 
   1719 static PyTypeObject kqueue_queue_Type = {
   1720     PyVarObject_HEAD_INIT(NULL, 0)
   1721     "select.kqueue",                                    /* tp_name */
   1722     sizeof(kqueue_queue_Object),                        /* tp_basicsize */
   1723     0,                                                  /* tp_itemsize */
   1724     (destructor)kqueue_queue_dealloc,                   /* tp_dealloc */
   1725     0,                                                  /* tp_print */
   1726     0,                                                  /* tp_getattr */
   1727     0,                                                  /* tp_setattr */
   1728     0,                                                  /* tp_compare */
   1729     0,                                                  /* tp_repr */
   1730     0,                                                  /* tp_as_number */
   1731     0,                                                  /* tp_as_sequence */
   1732     0,                                                  /* tp_as_mapping */
   1733     0,                                                  /* tp_hash */
   1734     0,                                                  /* tp_call */
   1735     0,                                                  /* tp_str */
   1736     0,                                                  /* tp_getattro */
   1737     0,                                                  /* tp_setattro */
   1738     0,                                                  /* tp_as_buffer */
   1739     Py_TPFLAGS_DEFAULT,                                 /* tp_flags */
   1740     kqueue_queue_doc,                                   /* tp_doc */
   1741     0,                                                  /* tp_traverse */
   1742     0,                                                  /* tp_clear */
   1743     0,                                                  /* tp_richcompare */
   1744     0,                                                  /* tp_weaklistoffset */
   1745     0,                                                  /* tp_iter */
   1746     0,                                                  /* tp_iternext */
   1747     kqueue_queue_methods,                               /* tp_methods */
   1748     0,                                                  /* tp_members */
   1749     kqueue_queue_getsetlist,                            /* tp_getset */
   1750     0,                                                  /* tp_base */
   1751     0,                                                  /* tp_dict */
   1752     0,                                                  /* tp_descr_get */
   1753     0,                                                  /* tp_descr_set */
   1754     0,                                                  /* tp_dictoffset */
   1755     0,                                                  /* tp_init */
   1756     0,                                                  /* tp_alloc */
   1757     kqueue_queue_new,                                   /* tp_new */
   1758     0,                                                  /* tp_free */
   1759 };
   1760 
   1761 #endif /* HAVE_KQUEUE */
   1762 /* ************************************************************************ */
   1763 
   1764 PyDoc_STRVAR(select_doc,
   1765 "select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\
   1766 \n\
   1767 Wait until one or more file descriptors are ready for some kind of I/O.\n\
   1768 The first three arguments are sequences of file descriptors to be waited for:\n\
   1769 rlist -- wait until ready for reading\n\
   1770 wlist -- wait until ready for writing\n\
   1771 xlist -- wait for an ``exceptional condition''\n\
   1772 If only one kind of condition is required, pass [] for the other lists.\n\
   1773 A file descriptor is either a socket or file object, or a small integer\n\
   1774 gotten from a fileno() method call on one of those.\n\
   1775 \n\
   1776 The optional 4th argument specifies a timeout in seconds; it may be\n\
   1777 a floating point number to specify fractions of seconds.  If it is absent\n\
   1778 or None, the call will never time out.\n\
   1779 \n\
   1780 The return value is a tuple of three lists corresponding to the first three\n\
   1781 arguments; each contains the subset of the corresponding file descriptors\n\
   1782 that are ready.\n\
   1783 \n\
   1784 *** IMPORTANT NOTICE ***\n\
   1785 On Windows and OpenVMS, only sockets are supported; on Unix, all file\n\
   1786 descriptors can be used.");
   1787 
   1788 static PyMethodDef select_methods[] = {
   1789     {"select",          select_select,  METH_VARARGS,   select_doc},
   1790 #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
   1791     {"poll",            select_poll,    METH_NOARGS,    poll_doc},
   1792 #endif /* HAVE_POLL */
   1793     {0,         0},     /* sentinel */
   1794 };
   1795 
   1796 PyDoc_STRVAR(module_doc,
   1797 "This module supports asynchronous I/O on multiple file descriptors.\n\
   1798 \n\
   1799 *** IMPORTANT NOTICE ***\n\
   1800 On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors.");
   1801 
   1802 PyMODINIT_FUNC
   1803 initselect(void)
   1804 {
   1805     PyObject *m;
   1806     m = Py_InitModule3("select", select_methods, module_doc);
   1807     if (m == NULL)
   1808         return;
   1809 
   1810     SelectError = PyErr_NewException("select.error", NULL, NULL);
   1811     Py_INCREF(SelectError);
   1812     PyModule_AddObject(m, "error", SelectError);
   1813 
   1814 #ifdef PIPE_BUF
   1815 #ifdef HAVE_BROKEN_PIPE_BUF
   1816 #undef PIPE_BUF
   1817 #define PIPE_BUF 512
   1818 #endif
   1819     PyModule_AddIntConstant(m, "PIPE_BUF", PIPE_BUF);
   1820 #endif
   1821 
   1822 #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL)
   1823 #ifdef __APPLE__
   1824     if (select_have_broken_poll()) {
   1825         if (PyObject_DelAttrString(m, "poll") == -1) {
   1826             PyErr_Clear();
   1827         }
   1828     } else {
   1829 #else
   1830     {
   1831 #endif
   1832         Py_TYPE(&poll_Type) = &PyType_Type;
   1833         PyModule_AddIntConstant(m, "POLLIN", POLLIN);
   1834         PyModule_AddIntConstant(m, "POLLPRI", POLLPRI);
   1835         PyModule_AddIntConstant(m, "POLLOUT", POLLOUT);
   1836         PyModule_AddIntConstant(m, "POLLERR", POLLERR);
   1837         PyModule_AddIntConstant(m, "POLLHUP", POLLHUP);
   1838         PyModule_AddIntConstant(m, "POLLNVAL", POLLNVAL);
   1839 
   1840 #ifdef POLLRDNORM
   1841         PyModule_AddIntConstant(m, "POLLRDNORM", POLLRDNORM);
   1842 #endif
   1843 #ifdef POLLRDBAND
   1844         PyModule_AddIntConstant(m, "POLLRDBAND", POLLRDBAND);
   1845 #endif
   1846 #ifdef POLLWRNORM
   1847         PyModule_AddIntConstant(m, "POLLWRNORM", POLLWRNORM);
   1848 #endif
   1849 #ifdef POLLWRBAND
   1850         PyModule_AddIntConstant(m, "POLLWRBAND", POLLWRBAND);
   1851 #endif
   1852 #ifdef POLLMSG
   1853         PyModule_AddIntConstant(m, "POLLMSG", POLLMSG);
   1854 #endif
   1855     }
   1856 #endif /* HAVE_POLL */
   1857 
   1858 #ifdef HAVE_EPOLL
   1859     Py_TYPE(&pyEpoll_Type) = &PyType_Type;
   1860     if (PyType_Ready(&pyEpoll_Type) < 0)
   1861         return;
   1862 
   1863     Py_INCREF(&pyEpoll_Type);
   1864     PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type);
   1865 
   1866     PyModule_AddIntConstant(m, "EPOLLIN", EPOLLIN);
   1867     PyModule_AddIntConstant(m, "EPOLLOUT", EPOLLOUT);
   1868     PyModule_AddIntConstant(m, "EPOLLPRI", EPOLLPRI);
   1869     PyModule_AddIntConstant(m, "EPOLLERR", EPOLLERR);
   1870     PyModule_AddIntConstant(m, "EPOLLHUP", EPOLLHUP);
   1871     PyModule_AddIntConstant(m, "EPOLLET", EPOLLET);
   1872 #ifdef EPOLLONESHOT
   1873     /* Kernel 2.6.2+ */
   1874     PyModule_AddIntConstant(m, "EPOLLONESHOT", EPOLLONESHOT);
   1875 #endif
   1876     /* PyModule_AddIntConstant(m, "EPOLL_RDHUP", EPOLLRDHUP); */
   1877 #ifdef EPOLLRDNORM
   1878     PyModule_AddIntConstant(m, "EPOLLRDNORM", EPOLLRDNORM);
   1879 #endif
   1880 #ifdef EPOLLRDBAND
   1881     PyModule_AddIntConstant(m, "EPOLLRDBAND", EPOLLRDBAND);
   1882 #endif
   1883 #ifdef EPOLLWRNORM
   1884     PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM);
   1885 #endif
   1886 #ifdef EPOLLWRBAND
   1887     PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
   1888 #endif
   1889 #ifdef EPOLLMSG
   1890     PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
   1891 #endif
   1892 #endif /* HAVE_EPOLL */
   1893 
   1894 #ifdef HAVE_KQUEUE
   1895     kqueue_event_Type.tp_new = PyType_GenericNew;
   1896     Py_TYPE(&kqueue_event_Type) = &PyType_Type;
   1897     if(PyType_Ready(&kqueue_event_Type) < 0)
   1898         return;
   1899 
   1900     Py_INCREF(&kqueue_event_Type);
   1901     PyModule_AddObject(m, "kevent", (PyObject *)&kqueue_event_Type);
   1902 
   1903     Py_TYPE(&kqueue_queue_Type) = &PyType_Type;
   1904     if(PyType_Ready(&kqueue_queue_Type) < 0)
   1905         return;
   1906     Py_INCREF(&kqueue_queue_Type);
   1907     PyModule_AddObject(m, "kqueue", (PyObject *)&kqueue_queue_Type);
   1908 
   1909     /* event filters */
   1910     PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ);
   1911     PyModule_AddIntConstant(m, "KQ_FILTER_WRITE", EVFILT_WRITE);
   1912     PyModule_AddIntConstant(m, "KQ_FILTER_AIO", EVFILT_AIO);
   1913     PyModule_AddIntConstant(m, "KQ_FILTER_VNODE", EVFILT_VNODE);
   1914     PyModule_AddIntConstant(m, "KQ_FILTER_PROC", EVFILT_PROC);
   1915 #ifdef EVFILT_NETDEV
   1916     PyModule_AddIntConstant(m, "KQ_FILTER_NETDEV", EVFILT_NETDEV);
   1917 #endif
   1918     PyModule_AddIntConstant(m, "KQ_FILTER_SIGNAL", EVFILT_SIGNAL);
   1919     PyModule_AddIntConstant(m, "KQ_FILTER_TIMER", EVFILT_TIMER);
   1920 
   1921     /* event flags */
   1922     PyModule_AddIntConstant(m, "KQ_EV_ADD", EV_ADD);
   1923     PyModule_AddIntConstant(m, "KQ_EV_DELETE", EV_DELETE);
   1924     PyModule_AddIntConstant(m, "KQ_EV_ENABLE", EV_ENABLE);
   1925     PyModule_AddIntConstant(m, "KQ_EV_DISABLE", EV_DISABLE);
   1926     PyModule_AddIntConstant(m, "KQ_EV_ONESHOT", EV_ONESHOT);
   1927     PyModule_AddIntConstant(m, "KQ_EV_CLEAR", EV_CLEAR);
   1928 
   1929     PyModule_AddIntConstant(m, "KQ_EV_SYSFLAGS", EV_SYSFLAGS);
   1930     PyModule_AddIntConstant(m, "KQ_EV_FLAG1", EV_FLAG1);
   1931 
   1932     PyModule_AddIntConstant(m, "KQ_EV_EOF", EV_EOF);
   1933     PyModule_AddIntConstant(m, "KQ_EV_ERROR", EV_ERROR);
   1934 
   1935     /* READ WRITE filter flag */
   1936     PyModule_AddIntConstant(m, "KQ_NOTE_LOWAT", NOTE_LOWAT);
   1937 
   1938     /* VNODE filter flags  */
   1939     PyModule_AddIntConstant(m, "KQ_NOTE_DELETE", NOTE_DELETE);
   1940     PyModule_AddIntConstant(m, "KQ_NOTE_WRITE", NOTE_WRITE);
   1941     PyModule_AddIntConstant(m, "KQ_NOTE_EXTEND", NOTE_EXTEND);
   1942     PyModule_AddIntConstant(m, "KQ_NOTE_ATTRIB", NOTE_ATTRIB);
   1943     PyModule_AddIntConstant(m, "KQ_NOTE_LINK", NOTE_LINK);
   1944     PyModule_AddIntConstant(m, "KQ_NOTE_RENAME", NOTE_RENAME);
   1945     PyModule_AddIntConstant(m, "KQ_NOTE_REVOKE", NOTE_REVOKE);
   1946 
   1947     /* PROC filter flags  */
   1948     PyModule_AddIntConstant(m, "KQ_NOTE_EXIT", NOTE_EXIT);
   1949     PyModule_AddIntConstant(m, "KQ_NOTE_FORK", NOTE_FORK);
   1950     PyModule_AddIntConstant(m, "KQ_NOTE_EXEC", NOTE_EXEC);
   1951     PyModule_AddIntConstant(m, "KQ_NOTE_PCTRLMASK", NOTE_PCTRLMASK);
   1952     PyModule_AddIntConstant(m, "KQ_NOTE_PDATAMASK", NOTE_PDATAMASK);
   1953 
   1954     PyModule_AddIntConstant(m, "KQ_NOTE_TRACK", NOTE_TRACK);
   1955     PyModule_AddIntConstant(m, "KQ_NOTE_CHILD", NOTE_CHILD);
   1956     PyModule_AddIntConstant(m, "KQ_NOTE_TRACKERR", NOTE_TRACKERR);
   1957 
   1958     /* NETDEV filter flags */
   1959 #ifdef EVFILT_NETDEV
   1960     PyModule_AddIntConstant(m, "KQ_NOTE_LINKUP", NOTE_LINKUP);
   1961     PyModule_AddIntConstant(m, "KQ_NOTE_LINKDOWN", NOTE_LINKDOWN);
   1962     PyModule_AddIntConstant(m, "KQ_NOTE_LINKINV", NOTE_LINKINV);
   1963 #endif
   1964 
   1965 #endif /* HAVE_KQUEUE */
   1966 }
   1967