[pypy-svn] r32908 - in pypy/dist/pypy/objspace: . cclp test

auc at codespeak.net auc at codespeak.net
Thu Oct 5 13:57:26 CEST 2006


Author: auc
Date: Thu Oct  5 13:57:24 2006
New Revision: 32908

Modified:
   pypy/dist/pypy/objspace/cclp/scheduler.py
   pypy/dist/pypy/objspace/logic.py
   pypy/dist/pypy/objspace/test/test_logicobjspace.py
Log:
translatable sched stats (mainly)


Modified: pypy/dist/pypy/objspace/cclp/scheduler.py
==============================================================================
--- pypy/dist/pypy/objspace/cclp/scheduler.py	(original)
+++ pypy/dist/pypy/objspace/cclp/scheduler.py	Thu Oct  5 13:57:24 2006
@@ -1,6 +1,7 @@
 from pypy.rpython.objectmodel import we_are_translated
 from pypy.interpreter.error import OperationError
 from pypy.interpreter import gateway
+from pypy.objspace.std.listobject import W_ListObject
 
 from pypy.objspace.cclp.types import W_Var, W_FailedValue, aliases
 from pypy.objspace.cclp.misc import w, v, ClonableCoroutine
@@ -23,14 +24,6 @@
         self._traced = {} # thread -> vars
         w("MAIN THREAD = ", str(id(self._main)))
 
-    def get_threads(self):
-        threads = [self._head]
-        curr = self._head._next
-        while curr != self._head:
-            threads.append(curr)
-            curr = curr._next
-        return threads
-
     def _init_blocked(self):
         self._blocked = {} # thread set
         # variables suspension lists
@@ -136,7 +129,6 @@
         current = ClonableCoroutine.w_getcurrent(self.space)
         assert isinstance(current, ClonableCoroutine)
         while (to_be_run in self._blocked) \
-                  or to_be_run.is_dead() \
                   or (to_be_run == current):
             
             to_be_run = to_be_run._next
@@ -150,7 +142,7 @@
             if to_be_run == sentinel:
                 if not dont_pass:
                     return current
-                w(str(sched_all(self.space)))
+                w(str(sched_info(self.space)))
                 ## we RESET sched state so as to keep being usable beyond that
                 self._init_head(self._main)
                 self._init_blocked()
@@ -273,7 +265,61 @@
             if self.space.is_true(self.space.is_free(w_var)):
                 self.space.bind(w_var, failed_value)
 
+    def w_threads(self):
+        s = self.space
+        thl = [s.newint(id(self._head))]
+        assert isinstance(self._head, ClonableCoroutine)
+        curr = self._head._next
+        while curr != self._head:
+            assert isinstance(curr, ClonableCoroutine)
+            thl.append(s.newint(id(curr)))
+            curr = curr._next
+        w_t = W_ListObject(thl)
+        return w_t
+
+    def w_blocked(self):
+        s = self.space
+        w_b = W_ListObject([s.newint(id(th))
+                            for th in self._blocked.keys()])
+        return w_b
+
+    def w_blocked_on(self):
+        s = self.space
+        si = s.setitem
+        w_bo = s.newdict()
+        for var, thl in self._blocked_on.items():
+            w_l = W_ListObject([s.newint(id(th))
+                                for th in thl])
+            si(w_bo, s.wrap(str(var)), w_l)
+        return w_bo
+
+    def w_blocked_byneed(self):
+        s = self.space
+        si = s.setitem
+        w_bb = s.newdict()
+        for var, thl in self._blocked_byneed.items():
+            w_l = W_ListObject([s.newint(id(th))
+                                for th in thl])
+            si(w_bb, s.wrap(str(var)), w_l)
+        return w_bb
+
+    def w_space_accounting(self):
+        s = self.space
+        si = s.setitem
+        w_a = s.newdict()
+        for sp, thc in self._per_space_live_threads.items():
+            si(w_a, s.newint(id(sp)), s.newint(thc))
+        return w_a
+
+    def w_asking(self):
+        s = self.space
+        si = s.setitem
+        w_a = s.newdict()
+        for th, sp in self._asking.items():
+            si(w_a, s.newint(id(th)), s.newint(id(sp)))
+        return w_a
 
+        
 #-- Misc --------------------------------------------------
 def reset_scheduler(space):
     "garbage collection of threads might pose some problems"
@@ -282,46 +328,19 @@
 app_reset_scheduler = gateway.interp2app(reset_scheduler)
 
 def sched_info(space):
-    sched = scheduler[0]
-    w_ret = space.newdict()
-    if not we_are_translated(): # XXX and otherwise, WTF ???
-        space.setitem(w_ret, space.wrap('switches'), space.wrap(sched._switch_count))
-        space.setitem(w_ret, space.wrap('threads'),
-                      space.wrap([id(th) for th in sched.get_threads()]))
-        space.setitem(w_ret, space.wrap('blocked'),
-                      space.wrap([id(th) for th in sched._blocked.keys()]))
-        space.setitem(w_ret, space.wrap('blocked_on'),
-                      space.wrap([id(th) for th in sched._blocked_on.keys()]))
-        space.setitem(w_ret, space.wrap('blocked_byneed'),
-                      space.wrap([id(th) for th in sched._blocked_byneed.keys()]))
-    return w_ret
-app_sched_info = gateway.interp2app(sched_info)
-
-def sched_all(space):
     s = scheduler[0]
     si = space.setitem
     sw = space.wrap
     w_ret = space.newdict()
-    if not we_are_translated():
-        si(w_ret, sw('threads'),
-           sw([id(th) for th in s.get_threads()]))
-        si(w_ret, sw('blocked_on'),
-           sw([(id(var),  [id(th) for th in thl])
-               for var, thl in s._blocked_on.items()]))
-        si(w_ret, sw('blocked_byneed'),
-           sw([(id(var), [id(th) for th in thl])
-               for var, thl in s._blocked_byneed.items()]))
-        si(w_ret, sw('traced'),
-           sw([(id(th), [id(var) for var in lvar])
-               for th, lvar in s._traced.items()]))
-        si(w_ret, sw('space_accounting'),
-           sw([(id(spc), count)
-               for spc, count in s._per_space_live_threads.items()]))
-        si(w_ret, sw('asking'),
-           sw([(id(th), id(spc))
-               for th, spc in s._asking.items()]))
+    si(w_ret, sw('switches'), space.newint(s._switch_count))
+    si(w_ret, sw('threads'), s.w_threads())
+    si(w_ret, sw('blocked'), s.w_blocked())
+    si(w_ret, sw('blocked_on'), s.w_blocked_on())
+    si(w_ret, sw('blocked_byneed'), s.w_blocked_byneed())
+    si(w_ret, sw('space_accounting'), s.w_space_accounting())
+    si(w_ret, sw('asking'), s.w_asking())
     return w_ret
-app_sched_all = gateway.interp2app(sched_all)        
+app_sched_info = gateway.interp2app(sched_info)        
 
 def schedule(space):
     "useful til we get preemtive scheduling deep into the vm"

Modified: pypy/dist/pypy/objspace/logic.py
==============================================================================
--- pypy/dist/pypy/objspace/logic.py	(original)
+++ pypy/dist/pypy/objspace/logic.py	Thu Oct  5 13:57:24 2006
@@ -10,14 +10,14 @@
 
 #-- MISC ----------------------------------------------------
 
-from pypy.objspace.cclp.misc import app_interp_id, app_switch_debug_info
+from pypy.objspace.cclp.misc import app_interp_id, app_switch_debug_info, app_is_interpreted
 
 #-- THREADING/COROUTINING -----------------------------------
 
 from pypy.objspace.cclp.thread import app_future, app_stacklet, app_this_thread
 
 from pypy.objspace.cclp.scheduler import Scheduler,  app_sched_info, \
-     app_schedule, app_reset_scheduler, app_sched_all
+     app_schedule, app_reset_scheduler
 
 from pypy.objspace.cclp.global_state import scheduler
 
@@ -251,8 +251,6 @@
                   space.wrap(app_wait_needed))
     space.setitem(space.builtin.w_dict, space.wrap('sched_info'),
                   space.wrap(app_sched_info))
-    space.setitem(space.builtin.w_dict, space.wrap('sched_all'),
-                  space.wrap(app_sched_all))
     space.setitem(space.builtin.w_dict, space.wrap('schedule'),
                   space.wrap(app_schedule))
     space.setitem(space.builtin.w_dict, space.wrap('this_thread'),
@@ -272,6 +270,8 @@
                   space.wrap(app_interp_id))
     space.setitem(space.builtin.w_dict, space.wrap('switch_debug_info'),
                   space.wrap(app_switch_debug_info))
+    space.setitem(space.builtin.w_dict, space.wrap('is_interpreted'),
+                  space.wrap(app_is_interpreted))
 
     #-- path to the applevel modules --
     import pypy.objspace.constraint

Modified: pypy/dist/pypy/objspace/test/test_logicobjspace.py
==============================================================================
--- pypy/dist/pypy/objspace/test/test_logicobjspace.py	(original)
+++ pypy/dist/pypy/objspace/test/test_logicobjspace.py	Thu Oct  5 13:57:24 2006
@@ -1,5 +1,10 @@
-from pypy.conftest import gettestobjspace
-from py.test import skip
+try:
+    from pypy.conftest import gettestobjspace
+    from py.test import skip
+except ImportError:
+    pass
+    # we might be called from _test_logic_build
+    # if not, check your paths
 
 
 class AppTest_Logic(object):
@@ -703,10 +708,10 @@
         s = newspace(quux, X)
         stacklet(asker, s)
         unify(X, 42)
-        assert len(sched_all()['asking']) == 1
+        assert len(sched_info()['asking']) == 1
         schedule() # allow quux exit
         schedule() # allow asker exit
-        assert len(sched_all()['asking']) == 0
+        assert len(sched_info()['asking']) == 0
 
     def test_ask_choose(self):
 
@@ -747,14 +752,14 @@
         stacklet(asker, s)
 
         schedule()
-
-        assert len(sched_all()['asking']) == 1
-        assert sched_all()['space_accounting'][0][1] == 0 
+        assert len(sched_info()['asking']) == 1
+        mainspace = sched_info()['space_accounting'].keys()[0]
+        assert sched_info()['space_accounting'][mainspace] == 0 
 
         assert X == 'done'
         schedule()
         #XXX
-        #assert len(sched_all()['threads']) == 1
+        #assert len(sched_info()['threads']) == 1
 
 
     def test_tell_ask_choose_commit(self):
@@ -800,7 +805,23 @@
                                              ('room B', 'day 2 PM')])
 
         #XXX who's still stuck there ?
-        #assert len(sched_all()['threads']) == 1
+        #assert len(sched_info()['threads']) == 1
+
+    def test_recomputing_tell_ask_choose_commit(self):
+        skip("interpreted clone support still missing")
+        if is_interpreted():
+            skip("interpreted clone support still missing")
+        from problem import conference_scheduling
+        from constraint import solver
+        import sys
+
+        s = newspace(conference_scheduling)
+
+        sols = set()
+        for sol in solver.solve_recomputing(s, sys.maxint):
+            sols.add(tuple(sol))
+            print sol
+        assert len(sols) == 64
 
     def test_logic_program(self):
         



More information about the Pypy-commit mailing list