[pypy-svn] r20936 - pypy/dist/pypy/translator/c/test

rxe at codespeak.net rxe at codespeak.net
Fri Dec 9 14:59:09 CET 2005


Author: rxe
Date: Fri Dec  9 14:59:09 2005
New Revision: 20936

Modified:
   pypy/dist/pypy/translator/c/test/test_tasklets.py
Log:
Add start_tasklet_now() and test.



Modified: pypy/dist/pypy/translator/c/test/test_tasklets.py
==============================================================================
--- pypy/dist/pypy/translator/c/test/test_tasklets.py	(original)
+++ pypy/dist/pypy/translator/c/test/test_tasklets.py	Fri Dec  9 14:59:09 2005
@@ -10,7 +10,7 @@
 debug_flag = True
 
 # count of loops in tests (set lower to speed up)
-loops = 1000
+loops = 10
     
 def debug(s):
     if debug_flag:
@@ -95,24 +95,27 @@
 
 class Channel:
     def __init__(self):
-        self.balance = 0
         self.queue = []
+        self.balance = 0
 
     def send(self, value):
         self.balance += 1
-        if self.balance < 0:
+        if self.balance <= 0:
             t = self.queue.pop(0)
             t.data = value
             t.blocked = 0
+
+            # XXX Wrong - should run immediately
+            scheduler.add_tasklet(t)
+            scheduler.schedule()
+            
         else:
             t = getcurrent()
-            # Remove the tasklet from the list of running tasklets.
-            #XXX dont need this - t.remove()
-
             # let it wait for a receiver to come along
             self.queue.append((t, value))
             t.blocked = 1
-            scheduler.schedule()
+            scheduler.schedule_remove()
+
     
     def receive(self):
         self.balance -= 1
@@ -127,27 +130,39 @@
         t = getcurrent()
         self.queue.append(t)
         t.blocked = -1
-        scheduler.schedule()
+        scheduler.schedule_remove()
 
 class Scheduler(object):
     def __init__(self):
         self.runnables = []
         self.current_tasklet = None
+        self.immediately_schedule = None
 
     def add_tasklet(self, tasklet):
         self.runnables.append(tasklet)
 
+    def run_immediately(self, tasklet):
+        self.immediately_schedule = tasklet
+
     def run(self):            
         while self.runnables:
             runnables = self.runnables
             self.runnables = []
+            count = 0
             for t in runnables:
                 assert self.current_tasklet is None
                 self.current_tasklet = t
                 if t.resume():
                     self.runnables.append(self.current_tasklet)
                 self.current_tasklet = None
+                count += 1
 
+                if self.immediately_schedule:
+                    self.runnables = [self.immediately_schedule] \
+                                     + runnables[count:] + self.runnables
+                    self.immediately_schedule = None
+                    break
+                
     def schedule(self, remove=False):
         assert self.current_tasklet is not None
         self.current_tasklet.suspend_and_remove(remove)
@@ -160,6 +175,11 @@
     tasklet.set_resumable(res)
     scheduler.add_tasklet(tasklet)
 
+def start_tasklet_now(tasklet):
+    res = tasklet.start()
+    tasklet.set_resumable(res)
+    scheduler.run_immediately(tasklet)
+        
 def schedule():
     scheduler.schedule()
 
@@ -243,3 +263,36 @@
 
     res = wrap_stackless_function(f)
     assert res == '1'
+
+def test_run_immediately():
+    globals.intermediate = 0
+    globals.count = 0
+    def simple(name):
+        for ii in range(20):
+            globals.count += 1
+            schedule()
+
+    def run_immediately(name):
+        globals.intermediate = globals.count
+        schedule()
+    
+    def simple2(name):
+        for ii in range(20):
+            globals.count += 1
+            if ii == 10:
+                start_tasklet_now(Tasklet("intermediate", run_immediately))
+            schedule()
+
+    def f():
+        start_tasklet(Tasklet("simple2", simple2))
+        for ii in range(loops):
+            start_tasklet(Tasklet("T%s" % ii, simple))        
+        run()
+        total_expected = (loops + 1) * 20
+        return (globals.intermediate == total_expected / 2 + 1 and
+                globals.count == total_expected)
+
+    res = wrap_stackless_function(f)
+    assert res == '1'
+
+        



More information about the Pypy-commit mailing list