Merged revisions 76108 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r76108 | antoine.pitrou | 2009-11-04 20:25:14 +0100 (mer., 04 nov. 2009) | 6 lines

  Issue #7211: Allow 64-bit values for the `ident` and `data` fields of kevent
  objects on 64-bit systems.  Patch by Michael Broghton.

  I will revert this checkin if it causes problems on our BSD buildbots.
........
This commit is contained in:
Antoine Pitrou 2009-11-04 21:10:38 +00:00
parent 97c81ef5b0
commit d83f1e6d61
4 changed files with 58 additions and 13 deletions

View File

@ -71,6 +71,17 @@ class TestKQueue(unittest.TestCase):
self.assertEqual(ev, ev) self.assertEqual(ev, ev)
self.assertNotEqual(ev, other) self.assertNotEqual(ev, other)
bignum = sys.maxsize * 2 + 1
ev = select.kevent(bignum, 1, 2, 3, sys.maxsize, 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, sys.maxsize)
self.assertEqual(ev.udata, bignum)
self.assertEqual(ev, ev)
self.assertNotEqual(ev, other)
def test_queue_event(self): def test_queue_event(self):
serverSocket = socket.socket() serverSocket = socket.socket()
serverSocket.bind(('127.0.0.1', 0)) serverSocket.bind(('127.0.0.1', 0))

View File

@ -95,6 +95,7 @@ Terrence Brannon
Dave Brennan Dave Brennan
Tom Bridgman Tom Bridgman
Richard Brodie Richard Brodie
Michael Broghton
Daniel Brotsky Daniel Brotsky
Jean Brouwers Jean Brouwers
Gary S. Brown Gary S. Brown

View File

@ -123,6 +123,9 @@ C-API
Library Library
------- -------
- Issue #7211: Allow 64-bit values for the `ident` and `data` fields of kevent
objects on 64-bit systems. Patch by Michael Broghton.
- Issue #6896: mailbox.Maildir now invalidates its internal cache each time - Issue #6896: mailbox.Maildir now invalidates its internal cache each time
a modification is done through it. This fixes inconsistencies and test a modification is done through it. This fixes inconsistencies and test
failures on systems with slightly bogus mtime behaviour. failures on systems with slightly bogus mtime behaviour.

View File

@ -1199,6 +1199,30 @@ static PyTypeObject kqueue_queue_Type;
#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type)) #define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type))
#if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P)
# error uintptr_t does not match void *!
#elif (SIZEOF_UINTPTR_T == SIZEOF_LONG_LONG)
# define T_UINTPTRT T_ULONGLONG
# define T_INTPTRT T_LONGLONG
# define PyLong_AsUintptr_t PyLong_AsUnsignedLongLong
# define UINTPTRT_FMT_UNIT "K"
# define INTPTRT_FMT_UNIT "L"
#elif (SIZEOF_UINTPTR_T == SIZEOF_LONG)
# define T_UINTPTRT T_ULONG
# define T_INTPTRT T_LONG
# define PyLong_AsUintptr_t PyLong_AsUnsignedLong
# define UINTPTRT_FMT_UNIT "k"
# define INTPTRT_FMT_UNIT "l"
#elif (SIZEOF_UINTPTR_T == SIZEOF_INT)
# define T_UINTPTRT T_UINT
# define T_INTPTRT T_INT
# define PyLong_AsUintptr_t PyLong_AsUnsignedLong
# define UINTPTRT_FMT_UNIT "I"
# define INTPTRT_FMT_UNIT "i"
#else
# error uintptr_t does not match int, long, or long long!
#endif
/* Unfortunately, we can't store python objects in udata, because /* Unfortunately, we can't store python objects in udata, because
* kevents in the kernel can be removed without warning, which would * kevents in the kernel can be removed without warning, which would
* forever lose the refcount on the object stored with it. * forever lose the refcount on the object stored with it.
@ -1206,12 +1230,12 @@ static PyTypeObject kqueue_queue_Type;
#define KQ_OFF(x) offsetof(kqueue_event_Object, x) #define KQ_OFF(x) offsetof(kqueue_event_Object, x)
static struct PyMemberDef kqueue_event_members[] = { static struct PyMemberDef kqueue_event_members[] = {
{"ident", T_UINT, KQ_OFF(e.ident)}, {"ident", T_UINTPTRT, KQ_OFF(e.ident)},
{"filter", T_SHORT, KQ_OFF(e.filter)}, {"filter", T_SHORT, KQ_OFF(e.filter)},
{"flags", T_USHORT, KQ_OFF(e.flags)}, {"flags", T_USHORT, KQ_OFF(e.flags)},
{"fflags", T_UINT, KQ_OFF(e.fflags)}, {"fflags", T_UINT, KQ_OFF(e.fflags)},
{"data", T_INT, KQ_OFF(e.data)}, {"data", T_INTPTRT, KQ_OFF(e.data)},
{"udata", T_INT, KQ_OFF(e.udata)}, {"udata", T_UINTPTRT, KQ_OFF(e.udata)},
{NULL} /* Sentinel */ {NULL} /* Sentinel */
}; };
#undef KQ_OFF #undef KQ_OFF
@ -1222,11 +1246,11 @@ kqueue_event_repr(kqueue_event_Object *s)
char buf[1024]; char buf[1024];
PyOS_snprintf( PyOS_snprintf(
buf, sizeof(buf), buf, sizeof(buf),
"<select.kevent ident=%lu filter=%d flags=0x%x fflags=0x%x " "<select.kevent ident=%zu filter=%d flags=0x%x fflags=0x%x "
"data=0x%lx udata=%p>", "data=0x%zd udata=%p>",
(unsigned long)(s->e.ident), s->e.filter, s->e.flags, (size_t)(s->e.ident), s->e.filter, s->e.flags,
s->e.fflags, (long)(s->e.data), s->e.udata); s->e.fflags, (Py_ssize_t)(s->e.data), s->e.udata);
return PyBytes_FromString(buf); return PyUnicode_FromString(buf);
} }
static int static int
@ -1235,17 +1259,23 @@ kqueue_event_init(kqueue_event_Object *self, PyObject *args, PyObject *kwds)
PyObject *pfd; PyObject *pfd;
static char *kwlist[] = {"ident", "filter", "flags", "fflags", static char *kwlist[] = {"ident", "filter", "flags", "fflags",
"data", "udata", NULL}; "data", "udata", NULL};
static char *fmt = "O|hhi" INTPTRT_FMT_UNIT UINTPTRT_FMT_UNIT ":kevent";
EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */ EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|hhiii:kevent", kwlist, if (!PyArg_ParseTupleAndKeywords(args, kwds, fmt, kwlist,
&pfd, &(self->e.filter), &(self->e.flags), &pfd, &(self->e.filter), &(self->e.flags),
&(self->e.fflags), &(self->e.data), &(self->e.udata))) { &(self->e.fflags), &(self->e.data), &(self->e.udata))) {
return -1; return -1;
} }
self->e.ident = PyObject_AsFileDescriptor(pfd); if (PyLong_Check(pfd)) {
if (self->e.ident == -1) { self->e.ident = PyLong_AsUintptr_t(pfd);
}
else {
self->e.ident = PyObject_AsFileDescriptor(pfd);
}
if (PyErr_Occurred()) {
return -1; return -1;
} }
return 0; return 0;
@ -1255,7 +1285,7 @@ static PyObject *
kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o, kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
int op) int op)
{ {
int result = 0; Py_intptr_t result = 0;
if (!kqueue_event_Check(o)) { if (!kqueue_event_Check(o)) {
if (op == Py_EQ || op == Py_NE) { if (op == Py_EQ || op == Py_NE) {
@ -1298,7 +1328,7 @@ kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o,
result = (result > 0); result = (result > 0);
break; break;
} }
return PyBool_FromLong(result); return PyBool_FromLong((long)result);
} }
static PyTypeObject kqueue_event_Type = { static PyTypeObject kqueue_event_Type = {