Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit