From d77faaf48f1469cb212937e37fcf8c3a35fa3c22 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 16 Jul 2009 07:18:07 +0000 Subject: #5910: fix kqueue for calls with more than one event. --- Lib/test/test_kqueue.py | 16 ++++++++++++++++ Modules/selectmodule.c | 7 ++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_kqueue.py b/Lib/test/test_kqueue.py index 901295b..a0ab860 100644 --- a/Lib/test/test_kqueue.py +++ b/Lib/test/test_kqueue.py @@ -162,6 +162,22 @@ class TestKQueue(unittest.TestCase): server.close() serverSocket.close() + def testPair(self): + kq = select.kqueue() + a, b = socket.socketpair() + + a.send(b'foo') + event1 = select.kevent(a, select.KQ_FILTER_READ, select.KQ_EV_ADD | select.KQ_EV_ENABLE) + event2 = select.kevent(b, select.KQ_FILTER_READ, select.KQ_EV_ADD | select.KQ_EV_ENABLE) + r = kq.control([event1, event2], 1, 1) + self.assertTrue(r) + self.assertFalse(r[0].flags & select.KQ_EV_ERROR) + self.assertEquals(b.recv(r[0].data), b'foo') + + a.close() + b.close() + kq.close() + def test_main(): test_support.run_unittest(TestKQueue) diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index d8a68c5..c52a5f9 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -1487,7 +1487,7 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args) if (nevents < 0) { PyErr_Format(PyExc_ValueError, "Length of eventlist must be 0 or positive, got %d", - nchanges); + nevents); return NULL; } @@ -1545,6 +1545,7 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args) PyErr_NoMemory(); return NULL; } + i = 0; while ((ei = PyIter_Next(it)) != NULL) { if (!kqueue_event_Check(ei)) { Py_DECREF(ei); @@ -1553,7 +1554,7 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args) "select.kevent objects"); goto error; } else { - chl[i] = ((kqueue_event_Object *)ei)->e; + chl[i++] = ((kqueue_event_Object *)ei)->e; } Py_DECREF(ei); } @@ -1584,7 +1585,7 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args) goto error; } - for (i=0; i < gotevents; i++) { + for (i = 0; i < gotevents; i++) { kqueue_event_Object *ch; ch = PyObject_New(kqueue_event_Object, &kqueue_event_Type); -- cgit v0.12