Author: Armin Rigo <[email protected]>
Branch:
Changeset: r73208:30c2d0b47ea9
Date: 2014-08-30 16:13 +0200
http://bitbucket.org/pypy/pypy/changeset/30c2d0b47ea9/
Log: Add change_current_fraction()
diff --git a/rpython/jit/metainterp/counter.py
b/rpython/jit/metainterp/counter.py
--- a/rpython/jit/metainterp/counter.py
+++ b/rpython/jit/metainterp/counter.py
@@ -136,6 +136,34 @@
return True
tick._always_inline_ = True
+ def change_current_fraction(self, hash, new_fraction):
+ """Change the value stored for 'hash' to be the given 'new_fraction',
+ which should be a float equal to or slightly lower than 1.0.
+ """
+ p_entry = self.timetable[self._get_index(hash)]
+ subhash = self._get_subhash(hash)
+
+ # find in 'n' the index that will be overwritten: the first within
+ # range(5) that contains either the right subhash, or a null time
+ # (or, if there isn't any, then just n == 4 will do).
+ n = 0
+ while n < 4 and (p_entry.subhashes[n] != subhash and
+ float(p_entry.times[n]) != 0.0):
+ n += 1
+
+ # move one step to the right all elements [n - 1, n - 2, ..., 0],
+ # (this overwrites the old item at index 'n')
+ while n > 0:
+ n -= 1
+ p_entry.subhashes[n + 1] = p_entry.subhashes[n]
+ p_entry.times[n + 1] = p_entry.times[n]
+
+ # insert the new hash at index 0. This is a good approximation,
+ # because change_current_fraction() should be used for
+ # new_fraction == value close to 1.0.
+ p_entry.subhashes[0] = rffi.cast(rffi.USHORT, subhash)
+ p_entry.times[0] = r_singlefloat(new_fraction)
+
def reset(self, hash):
p_entry = self.timetable[self._get_index(hash)]
subhash = self._get_subhash(hash)
diff --git a/rpython/jit/metainterp/test/test_counter.py
b/rpython/jit/metainterp/test/test_counter.py
--- a/rpython/jit/metainterp/test/test_counter.py
+++ b/rpython/jit/metainterp/test/test_counter.py
@@ -106,3 +106,25 @@
assert jc.lookup_chain(104) is d3
assert d3.next is d4
assert d4.next is None
+
+
+def test_change_current_fraction():
+ jc = JitCounter()
+ incr = jc.compute_threshold(8)
+ # change_current_fraction() with a fresh new hash
+ jc.change_current_fraction(index2hash(jc, 104), 0.95)
+ r = jc.tick(index2hash(jc, 104), incr)
+ assert r is True
+ # change_current_fraction() with an already-existing hash
+ r = jc.tick(index2hash(jc, 104), incr)
+ assert r is False
+ jc.change_current_fraction(index2hash(jc, 104), 0.95)
+ r = jc.tick(index2hash(jc, 104), incr)
+ assert r is True
+ # change_current_fraction() with a smaller incr
+ incr = jc.compute_threshold(32)
+ jc.change_current_fraction(index2hash(jc, 104), 0.95)
+ r = jc.tick(index2hash(jc, 104), incr)
+ assert r is False
+ r = jc.tick(index2hash(jc, 104), incr)
+ assert r is True
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit