[pypy-commit] pypy sched_yield: sched_yield posix attribute
nanjekye
pypy.commits at gmail.com
Sun Oct 29 09:49:43 EDT 2017
Author: Joannah Nanjekye <nanjekyejoannah at gmail.com>
Branch: sched_yield
Changeset: r92873:f06ed6b90651
Date: 2017-10-27 19:57 +0300
http://bitbucket.org/pypy/pypy/changeset/f06ed6b90651/
Log: sched_yield posix attribute
diff --git a/pypy/module/posix/__init__.py b/pypy/module/posix/__init__.py
--- a/pypy/module/posix/__init__.py
+++ b/pypy/module/posix/__init__.py
@@ -237,6 +237,9 @@
if getattr(rposix, _name) is not None:
interpleveldefs[_name] = 'space.wrap(%d)' % getattr(rposix, _name)
+ if hasattr(rposix, 'sched_yield'):
+ interpleveldefs['sched_yield'] = 'interp_posix.sched_yield'
+
for _name in ["O_CLOEXEC"]:
if getattr(rposix, _name) is not None:
interpleveldefs[_name] = 'space.wrap(%d)' % getattr(rposix, _name)
diff --git a/pypy/module/posix/interp_posix.py b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -2468,3 +2468,13 @@
wrap_oserror(space, e, eintr_retry=True)
else:
return space.newint(s)
+
+def sched_yield(space):
+ """ Voluntarily relinquish the CPU"""
+ while True:
+ try:
+ res = rposix.sched_yield()
+ except OSError as e:
+ wrap_oserror(space, e, eintr_retry=True)
+ else:
+ return space.newint(res)
diff --git a/pypy/module/posix/test/test_posix2.py b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -975,6 +975,12 @@
assert isinstance(high, int) == True
assert high > low
+ if hasattr(rposix, 'sched_yield'):
+ def test_sched_yield(self):
+ os = self.posix
+ #Always suceeds on Linux
+ os.sched_yield()
+
def test_write_buffer(self):
os = self.posix
fd = os.open(self.path2 + 'test_write_buffer',
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -1851,6 +1851,8 @@
rffi.INT, save_err=rffi.RFFI_FULL_ERRNO_ZERO)
c_sched_get_priority_min = external('sched_get_priority_min', [rffi.INT],
rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO)
+ if not _WIN32:
+ c_sched_yield = external('sched_yield', [], rffi.INT)
@enforceargs(int)
def sched_get_priority_max(policy):
@@ -1860,9 +1862,9 @@
def sched_get_priority_min(policy):
return handle_posix_error('sched_get_priority_min', c_sched_get_priority_min(policy))
-
-
-
+ def sched_yield():
+ return handle_posix_error('sched_yield', c_sched_yield())
+
#___________________________________________________________________
c_chroot = external('chroot', [rffi.CCHARP], rffi.INT,
diff --git a/rpython/rlib/test/test_rposix.py b/rpython/rlib/test/test_rposix.py
--- a/rpython/rlib/test/test_rposix.py
+++ b/rpython/rlib/test/test_rposix.py
@@ -810,4 +810,9 @@
assert isinstance(low, int) == True
assert isinstance(high, int) == True
assert high > low
+
+ at rposix_requires('sched_yield')
+def test_sched_yield():
+ if sys.platform != 'win32':
+ rposix.sched_yield()
More information about the pypy-commit
mailing list