Index: Lib/test/test_kqueue.py =================================================================== --- Lib/test/test_kqueue.py (revision 75796) +++ Lib/test/test_kqueue.py (working copy) @@ -7,6 +7,7 @@ import select import sys import unittest +import platform from test import support if not hasattr(select, "kqueue"): @@ -71,6 +72,20 @@ self.assertEqual(ev, ev) self.assertNotEqual(ev, other) + if platform.architecture()[0] == '64bit': + bignum = (1<<64) - 1 + else: + bignum = (1<<32) - 1 + ev = select.kevent(bignum, 1, 2, 3, bignum>>1, bignum) + self.assertEqual(ev.ident, bignum) + self.assertEqual(ev.filter, 1) + self.assertEqual(ev.flags, 2) + self.assertEqual(ev.fflags, 3) + self.assertEqual(ev.data, bignum>>1) + self.assertEqual(ev.udata, bignum) + self.assertEqual(ev, ev) + self.assertNotEqual(ev, other) + def test_queue_event(self): serverSocket = socket.socket() serverSocket.bind(('127.0.0.1', 0)) Index: Modules/selectmodule.c =================================================================== --- Modules/selectmodule.c (revision 75796) +++ Modules/selectmodule.c (working copy) @@ -1199,6 +1199,10 @@ #define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type)) +#if defined(SIZEOF_VOID_P) && SIZEOF_VOID_P == 8 +# define KQUEUE_USES_LONG_LONG +#endif + /* Unfortunately, we can't store python objects in udata, because * kevents in the kernel can be removed without warning, which would * forever lose the refcount on the object stored with it. @@ -1206,12 +1210,21 @@ #define KQ_OFF(x) offsetof(kqueue_event_Object, x) static struct PyMemberDef kqueue_event_members[] = { - {"ident", T_UINT, KQ_OFF(e.ident)}, - {"filter", T_SHORT, KQ_OFF(e.filter)}, - {"flags", T_USHORT, KQ_OFF(e.flags)}, - {"fflags", T_UINT, KQ_OFF(e.fflags)}, - {"data", T_INT, KQ_OFF(e.data)}, - {"udata", T_INT, KQ_OFF(e.udata)}, +#if defined(KQUEUE_USES_LONG_LONG) + {"ident", T_ULONGLONG, KQ_OFF(e.ident)}, +#else + {"ident", T_UINT, KQ_OFF(e.ident)}, +#endif + {"filter", T_SHORT, KQ_OFF(e.filter)}, + {"flags", T_USHORT, KQ_OFF(e.flags)}, + {"fflags", T_UINT, KQ_OFF(e.fflags)}, +#if defined(KQUEUE_USES_LONG_LONG) + {"data", T_LONGLONG, KQ_OFF(e.data)}, + {"udata", T_ULONGLONG, KQ_OFF(e.udata)}, +#else + {"data", T_INT, KQ_OFF(e.data)}, + {"udata", T_INT, KQ_OFF(e.udata)}, +#endif {NULL} /* Sentinel */ }; #undef KQ_OFF @@ -1222,11 +1235,11 @@ char buf[1024]; PyOS_snprintf( buf, sizeof(buf), - "", - (unsigned long)(s->e.ident), s->e.filter, s->e.flags, - s->e.fflags, (long)(s->e.data), s->e.udata); - return PyBytes_FromString(buf); + "", + (size_t)(s->e.ident), s->e.filter, s->e.flags, + s->e.fflags, (ssize_t)(s->e.data), s->e.udata); + return PyUnicode_FromString(buf); } static int @@ -1237,15 +1250,24 @@ "data", "udata", NULL}; EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */ - + +#if defined(KQUEUE_USES_LONG_LONG) + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|hhiLK:kevent", kwlist, +#else if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|hhiii:kevent", kwlist, +#endif &pfd, &(self->e.filter), &(self->e.flags), &(self->e.fflags), &(self->e.data), &(self->e.udata))) { return -1; } - - self->e.ident = PyObject_AsFileDescriptor(pfd); - if (self->e.ident == -1) { + +#if defined(KQUEUE_USES_LONG_LONG) + if (PyLong_Check(pfd)) + self->e.ident = PyLong_AsUnsignedLongLong(pfd); + else +#endif + self->e.ident = PyObject_AsFileDescriptor(pfd); + if (PyErr_Occurred()) { return -1; } return 0; @@ -1255,7 +1277,7 @@ kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o, int op) { - int result = 0; + long long result = 0; if (!kqueue_event_Check(o)) { if (op == Py_EQ || op == Py_NE) { @@ -1298,7 +1320,7 @@ result = (result > 0); break; } - return PyBool_FromLong(result); + return PyBool_FromLong((long)result); } static PyTypeObject kqueue_event_Type = {