[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