Author: Armin Rigo <ar...@tunes.org>
Branch: py3.5
Changeset: r90483:dd216e917dc6
Date: 2017-03-02 15:22 +0100
http://bitbucket.org/pypy/pypy/changeset/dd216e917dc6/

Log:    Trying to fix kqueue

diff --git a/pypy/module/select/interp_kqueue.py 
b/pypy/module/select/interp_kqueue.py
--- a/pypy/module/select/interp_kqueue.py
+++ b/pypy/module/select/interp_kqueue.py
@@ -1,8 +1,10 @@
+import errno
 from pypy.interpreter.baseobjspace import W_Root
 from pypy.interpreter.error import oefmt
 from pypy.interpreter.error import exception_from_saved_errno, wrap_oserror
 from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
 from pypy.interpreter.typedef import TypeDef, generic_new_descr, GetSetProperty
+from pypy.interpreter import timeutils
 from rpython.rlib._rsocket_rffi import socketclose_no_errno
 from rpython.rlib.rarithmetic import r_uint
 from rpython.rlib import rposix
@@ -50,6 +52,12 @@
     ("tv_nsec", rffi.LONG),
 ])
 
+def fill_timespec(time_float, timespec_ptr):
+    sec = int(time_float)
+    nsec = int(1e9 * (time_float - sec))
+    rffi.setintfield(timespec_ptr, 'c_tv_sec', sec)
+    rffi.setintfield(timespec_ptr, 'c_tv_nsec', nsec)
+
 
 symbol_map = {
     "KQ_FILTER_READ": "EVFILT_READ",
@@ -180,13 +188,11 @@
                             raise oefmt(space.w_ValueError,
                                         "Timeout must be None or >= 0, got %s",
                                         str(_timeout))
-                        XXX   # fix test_select_signal.py first, for PEP475!
-                        sec = int(_timeout)
-                        nsec = int(1e9 * (_timeout - sec))
-                        rffi.setintfield(timeout, 'c_tv_sec', sec)
-                        rffi.setintfield(timeout, 'c_tv_nsec', nsec)
+                        fill_timespec(_timeout, ptimeout)
+                        timeout_at = timeutils.monotonic(space) + _timeout
                         ptimeout = timeout
                     else:
+                        timeout_at = 0.0
                         ptimeout = lltype.nullptr(timespec)
 
                     if not space.is_w(w_changelist, space.w_None):
@@ -204,29 +210,40 @@
                     else:
                         pchangelist = lltype.nullptr(rffi.CArray(kevent))
 
-                    nfds = syscall_kevent(self.kqfd,
-                                          pchangelist,
-                                          changelist_len,
-                                          eventlist,
-                                          max_events,
-                                          ptimeout)
-                    if nfds < 0:
-                        raise exception_from_saved_errno(space, 
space.w_OSError)
-                    else:
-                        elist_w = [None] * nfds
-                        for i in xrange(nfds):
+                    while True:
+                        nfds = syscall_kevent(self.kqfd,
+                                              pchangelist,
+                                              changelist_len,
+                                              eventlist,
+                                              max_events,
+                                              ptimeout)
+                        if nfds >= 0:
+                            break
+                        if rposix.get_saved_errno() != errno.EINTR:
+                            raise exception_from_saved_errno(space,
+                                                             space.w_OSError)
+                        space.getexecutioncontext().checksignals()
+                        if ptimeout:
+                            _timeout = (timeout_at -
+                                        timeutils.monotonic(space))
+                            if _timeout < 0.0:
+                                _timeout = 0.0
+                            fill_timespec(_timeout, ptimeout)
 
-                            evt = eventlist[i]
+                    elist_w = [None] * nfds
+                    for i in xrange(nfds):
 
-                            w_event = W_Kevent(space)
-                            w_event.ident = evt.c_ident
-                            w_event.filter = evt.c_filter
-                            w_event.flags = evt.c_flags
-                            w_event.fflags = evt.c_fflags
-                            w_event.data = evt.c_data
-                            w_event.udata = evt.c_udata
+                        evt = eventlist[i]
 
-                            elist_w[i] = w_event
+                        w_event = W_Kevent(space)
+                        w_event.ident = evt.c_ident
+                        w_event.filter = evt.c_filter
+                        w_event.flags = evt.c_flags
+                        w_event.fflags = evt.c_fflags
+                        w_event.data = evt.c_data
+                        w_event.udata = evt.c_udata
+
+                        elist_w[i] = w_event
 
                     return space.newlist(elist_w)
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to