[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