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

rxe at codespeak.net rxe at codespeak.net
Fri Dec 9 18:10:36 CET 2005


Author: rxe
Date: Fri Dec  9 18:10:35 2005
New Revision: 20957

Modified:
   pypy/dist/pypy/translator/c/test/test_tasklets.py
Log:
Channels work!



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 18:10:35 2005
@@ -39,7 +39,6 @@
     s_list_of_strings.listdef.resize()
     t = TranslationContext()
     t.buildannotator().build_types(entry_point, [s_list_of_strings])
-    t.view()
     t.buildrtyper().specialize()
     backend_optimizations(t)
     cbuilder = CStandaloneBuilder(t, entry_point, gcpolicy=gcpolicy)
@@ -64,9 +63,11 @@
         self.resumable = resumable
 
     def suspend(self):
+        # we suspend ourself
         self.caller = self.caller.switch()  
         
     def resume(self):
+        # the caller resumes me
         self.resumable = self.resumable.switch()  
         self.alive = self.resumable is not None
     
@@ -75,7 +76,6 @@
         Resumable.__init__(self, fn)
         self.name = name
         self.blocked = 0
-        self.data = -1
         
         # propogates round suspend-resume to tell scheduler in run()
         # XXX too late to think this thru
@@ -107,16 +107,26 @@
             t = self.queue.pop(0)
             t.data = value
             t.blocked = 0
+            t.remove = False
             scheduler.run_immediately(t)
             scheduler.schedule()
+
+            # resuming
+            t = getcurrent()
+            assert t.blocked == 0
             
         else:
             t = getcurrent()
             assert isinstance(t, Tasklet)
+            t.data = value
             # let it wait for a receiver to come along
             self.queue.append(t)
             t.blocked = 1
             schedule_remove()
+
+            # resuming
+            assert t == getcurrent()
+            assert t.blocked == 0
     
     def receive(self):
         self.balance -= 1
@@ -124,17 +134,25 @@
         if self.balance >= 0:
             t = self.queue.pop(0)
             t.blocked = 0
+            t.remove = False
             data = t.data
             scheduler.add_tasklet(t)
             return data
         else:
-            # block until ready
+            # queue ourself
             t = getcurrent()
             assert isinstance(t, Tasklet)
             self.queue.append(t)
+
+            # block until send has reenabled me
             t.blocked = -1
             schedule_remove()
-            return -1 # never reached
+
+            # resuming
+            assert t == getcurrent()
+            assert t.blocked == 0
+
+            return t.data
     
 class Scheduler(object):
     def __init__(self):
@@ -155,6 +173,7 @@
             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)
@@ -299,30 +318,70 @@
     res = wrap_stackless_function(f)
     assert res == '1'
 
-def test_channels():
+def test_channel1():
     ch = Channel()
         
     def f1(name):
         for ii in range(5):
             ch.send(ii)
-        debug("done sending")
             
     def f2(name):
-        for ii in range(5):
-            data = ch.receive()
-            debug("done receiving")
-##        while True:
-##            data = ch.receive()
-##            if data == 42:
-##                break
-##            debug("received")
+        #while True:
+        for ii in range(6):
+            globals.count += ch.receive()
 
     def f():
         start_tasklet(Tasklet("f2", f2))
         start_tasklet(Tasklet("f1", f1))
         run()
+        return (globals.count == 10)
+
+    res = wrap_stackless_function(f)
+    assert res == '1'
+
+def test_channel2():
+    ch = Channel()
+        
+    def f1(name):
+        for ii in range(5):
+            ch.send(ii)
+            
+    def f2(name):
+        #while True:
+        for ii in range(6):
+            res = ch.receive()
+            globals.count += res
+            
+    def f():
+        start_tasklet(Tasklet("f1", f1))
+        start_tasklet(Tasklet("f2", f2))
+        run()
+        return (globals.count == 10)
+
+    res = wrap_stackless_function(f)
+    assert res == '1'
+
+
+def test_channel3():
+    ch = Channel()
+        
+    def f1(name):
+        for ii in range(5):
+            ch.send(ii)
+            
+    def f2(name):
+        #while True:
+        for ii in range(16):
+            res = ch.receive()
+            globals.count += res
+            
+    def f():
+        start_tasklet(Tasklet("f1x", f1))
+        start_tasklet(Tasklet("f1xx", f1))
+        start_tasklet(Tasklet("f1xxx", f1))
+        start_tasklet(Tasklet("f2", f2))
+        run()
+        return (globals.count == 30)
 
-        return 0
-    
     res = wrap_stackless_function(f)
     assert res == '1'



More information about the Pypy-commit mailing list