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:
parent
97c81ef5b0
commit
d83f1e6d61
|
@ -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))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
Loading…
Reference in New Issue