> 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

Reply via email to