@@ -890,17 +890,25 @@ cdef class BlockValuesRefs:
890
890
"""
891
891
cdef:
892
892
public list referenced_blocks
893
+ public int clear_counter
893
894
894
895
def __cinit__(self , blk: Block | None = None ) -> None:
895
896
if blk is not None:
896
897
self.referenced_blocks = [weakref.ref(blk)]
897
898
else:
898
899
self.referenced_blocks = []
900
+ self.clear_counter = 500 # set reasonably high
899
901
900
- def _clear_dead_references(self ) -> None:
901
- self.referenced_blocks = [
902
- ref for ref in self .referenced_blocks if ref() is not None
903
- ]
902
+ def _clear_dead_references(self , force = False ) -> None:
903
+ if force or len(self.referenced_blocks ) > self.clear_counter:
904
+ self.referenced_blocks = [
905
+ ref for ref in self .referenced_blocks if ref() is not None
906
+ ]
907
+ nr_of_refs = len (self .referenced_blocks)
908
+ if nr_of_refs < self.clear_counter // 2:
909
+ self.clear_counter = self .clear_counter // 2
910
+ elif nr_of_refs > self.clear_counter:
911
+ self.clear_counter = self .clear_counter * 2
904
912
905
913
def add_reference(self , blk: Block ) -> None:
906
914
"""Adds a new reference to our reference collection.
@@ -934,6 +942,6 @@ cdef class BlockValuesRefs:
934
942
-------
935
943
bool
936
944
"""
937
- self._clear_dead_references()
945
+ self._clear_dead_references(force = True )
938
946
# Checking for more references than block pointing to itself
939
947
return len(self.referenced_blocks ) > 1
0 commit comments