@@ -712,11 +712,10 @@ performMergeSteps ::
712712 -> Credits
713713 -> m Bool
714714performMergeSteps mergeVar creditsVar (Credits credits) =
715+ assert (credits >= 0 ) $
715716 withMVar mergeVar $ \ case
716717 CompletedMerge {} -> pure False
717718 OngoingMerge _rs m -> do
718- -- We have dealt with the case of credits <= 0 above,
719- -- so here we know credits is positive
720719 let stepsToDo = credits
721720 (stepsDone, stepResult) <- Merge. steps m stepsToDo
722721 assert (stepResult == MergeDone || stepsDone >= stepsToDo) (pure () )
@@ -753,8 +752,9 @@ completeMerge mergeVar mergeKnownCompletedVar = do
753752 (OngoingMerge rs m) -> do
754753 -- first try to complete the merge before performing other side effects,
755754 -- in case the completion fails
756- -- TODO: Run.fromMutable claims not to be exception safe
757- -- may need to use uninteruptible mask
755+ -- TODO: Run.fromMutable (used in Merge.complete) claims not to be
756+ -- exception safe so we should probably be using the resource registry
757+ -- and test for exception safety.
758758 r <- Merge. complete m
759759 V. forM_ rs releaseRef
760760 -- Cache the knowledge that we completed the merge
@@ -778,11 +778,13 @@ expectCompleted (DeRef MergingRun {..}) = do
778778 let totalDebt = numEntriesToTotalDebt mergeNumEntries
779779 suppliedCredits = spentCredits + unspentCredits
780780 ! credits = assert (suppliedCredits == totalDebt) $
781+ assert (unspentCredits >= 0 ) $
781782 unspentCredits
782783
783- -- TODO: what about exception safety: check if it is ok to be interrupted
784- -- between performMergeSteps and completeMerge here, and above.
785784 weFinishedMerge <- performMergeSteps mergeState mergeCreditsVar credits
785+ -- If an async exception happens before we get to perform the
786+ -- completion, then that is fine. The next 'expectCompleted' will
787+ -- complete the merge.
786788 when weFinishedMerge $ completeMerge mergeState mergeKnownCompleted
787789 withMVar mergeState $ \ case
788790 CompletedMerge r -> dupRef r -- return a fresh reference to the run
0 commit comments