]> granicus.if.org Git - python/commitdiff
#5910: fix kqueue for calls with more than one event.
authorGeorg Brandl <georg@python.org>
Thu, 16 Jul 2009 07:18:07 +0000 (07:18 +0000)
committerGeorg Brandl <georg@python.org>
Thu, 16 Jul 2009 07:18:07 +0000 (07:18 +0000)
Lib/test/test_kqueue.py
Modules/selectmodule.c

index 901295b0fcfb95ce5ad8c698f63ef6192fe065c2..a0ab860061962b7d2f885742bd398edea3385ee8 100644 (file)
@@ -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)
 
index d8a68c570a10dc3a34f71219d4aa5b7bdb53ad21..c52a5f971bcf044af70e6af635af6c509e33d3cd 100644 (file)
@@ -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);