> ok so the current bug is presenting likely because the data in the
> regions list differs from the actual data because it is mutated inside
> the loop
the _intent_ of the logic was to only use data from in front of the
cursor, and only mutate data behind it.
for idx in range(1, len(regions)):
self.fsck()
head0, prev0 = regions[idx-1]
tail0 = self.q[head0+1] + head0
assert self.q[prev0] == head0 # <-
head1, prev1 = regions[idx]
tail1 = self.q[head1+1] + head1
assert self.q[prev1] == head1
self.fsck()
if tail0 == head1:
# remove region0
assert self._calc_unused() == unused
if prev1 == head0:
assert head1 != prev0
self.q[prev0] = head1
prev1 = prev0
else:
assert self.q[head0] != prev0
self.q[prev0] = self.q[head0]
assert self._calc_unused() == unused - (tail0 - head0)
assert self.q[head1] != head0
self.q[head0] = self.q[head1] # set region0's next to
region1's next
self.q[head0+1] = tail1 - head0 # set region0's length
to region0's + region1's
assert head0 != prev1
self.q[prev1] = head0 # reseat region1 to be region0 + region1
assert self._calc_unused() == unused
self.fsck()
else:
assert tail0 < head1
assert self._calc_unused() == unused
but because it's a linked list dependencies can be arbitrarily
intertwined without regard to sorted order