-from p2pool.util import math, skiplist
+from p2pool.util import forest, math
-class WeightsSkipList(skiplist.SkipList):
+class WeightsSkipList(forest.TrackerSkipList):
# share_count, weights, total_weight
- def __init__(self, tracker):
- skiplist.SkipList.__init__(self)
- self.tracker = tracker
-
- def previous(self, element):
- return self.tracker.shares[element].previous_hash
-
def get_delta(self, element):
from p2pool.bitcoin import data as bitcoin_data
if element is None:
def finalize(self, (share_count, weights, total_weight, total_donation_weight)):
return weights, total_weight, total_donation_weight
-class CountsSkipList(skiplist.SkipList):
+class CountsSkipList(forest.TrackerSkipList):
# share_count, counts, total_count
def __init__(self, tracker, run_identifier):
- skiplist.SkipList.__init__(self)
- self.tracker = tracker
+ forest.TrackerSkipList.__init__(self, tracker)
self.run_identifier = run_identifier
- def previous(self, element):
- return self.tracker.shares[element].previous_hash
-
def get_delta(self, element):
if element is None:
raise AssertionError()
'''
import itertools
+import weakref
from p2pool.util import skiplist, variable
from p2pool.bitcoin import data as bitcoin_data
-class DistanceSkipList(skiplist.SkipList):
+class TrackerSkipList(skiplist.SkipList):
def __init__(self, tracker):
skiplist.SkipList.__init__(self)
self.tracker = tracker
+
+ self_ref = weakref.ref(self, lambda _: tracker.removed.unwatch(watch_id))
+ watch_id = self.tracker.removed.watch(lambda share: self_ref().forget_item(share.hash))
def previous(self, element):
return self.tracker.shares[element].previous_hash
-
+
+
+class DistanceSkipList(TrackerSkipList):
def get_delta(self, element):
return element, 1, self.tracker.shares[element].previous_hash
self.height_refs = {} # ref -> height, share_hash, work_inc
self.reverse_height_refs = {} # share_hash -> ref
- self.get_nth_parent_hash = DistanceSkipList(self)
-
self.added = variable.Event()
self.removed = variable.Event()
+ self.get_nth_parent_hash = DistanceSkipList(self)
+
for share in shares:
self.add(share)
-from p2pool.util import math, expiring_dict, memoize
+from p2pool.util import math
class Base(object):
def finalize(self, sol):
P = .5
def __init__(self):
- self.skips = expiring_dict.ExpiringDict(600)
+ self.skips = {}
+
+ def forget_item(self, item):
+ self.skips.pop(item, None)
- @memoize.memoize_with_backing(expiring_dict.ExpiringDict(5, get_touches=False))
def __call__(self, start, *args, **kwargs):
updates = {}
pos = start