@@ -55,6 +55,8 @@ data MergingRun m h = MergingRun {
55
55
, mergeNumEntries :: ! NumEntries
56
56
-- | The number of currently /unspent/ credits
57
57
, mergeUnspentCredits :: ! (UnspentCreditsVar (PrimState m ))
58
+ -- | The total number of spent credits.
59
+ , mergeSpentCredits :: ! (SpentCreditsVar (PrimState m ))
58
60
-- | The total number of performed merging steps.
59
61
, mergeStepsPerformed :: ! (TotalStepsVar (PrimState m ))
60
62
-- | A variable that caches knowledge about whether the merge has been
@@ -77,8 +79,12 @@ newtype UnspentCreditsVar s = UnspentCreditsVar {
77
79
getUnspentCreditsVar :: PrimVar s Int
78
80
}
79
81
82
+ newtype SpentCreditsVar s = SpentCreditsVar {
83
+ getSpentCreditsVar :: PrimVar s Int
84
+ }
85
+
80
86
newtype TotalStepsVar s = TotalStepsVar {
81
- getTotalStepsVar :: PrimVar s Int
87
+ getTotalStepsVar :: PrimVar s Int
82
88
}
83
89
84
90
data MergingRunState m h =
@@ -88,14 +94,8 @@ data MergingRunState m h =
88
94
| OngoingMerge
89
95
! (V. Vector (Ref (Run m h )))
90
96
-- ^ Input runs
91
- ! (SpentCreditsVar (PrimState m ))
92
- -- ^ The total number of spent credits.
93
97
! (Merge m h )
94
98
95
- newtype SpentCreditsVar s = SpentCreditsVar {
96
- getSpentCreditsVar :: PrimVar s Int
97
- }
98
-
99
99
data MergeKnownCompleted = MergeKnownCompleted | MergeMaybeCompleted
100
100
deriving stock (Show , Eq , Read )
101
101
@@ -139,9 +139,8 @@ new hfs hbio resolve caching alloc mergeType runPaths inputRuns =
139
139
<$> Merge. new hfs hbio caching alloc mergeType resolve runPaths runs
140
140
let numInputRuns = NumRuns $ V. length runs
141
141
let numInputEntries = V. foldMap' Run. size runs
142
- spentCreditsVar <- SpentCreditsVar <$> newPrimVar 0
143
142
unsafeNew numInputRuns numInputEntries MergeMaybeCompleted $
144
- OngoingMerge runs spentCreditsVar merge
143
+ OngoingMerge runs merge
145
144
146
145
{-# SPECIALISE newCompleted ::
147
146
NumRuns
@@ -176,6 +175,7 @@ unsafeNew ::
176
175
-> m (Ref (MergingRun m h ))
177
176
unsafeNew mergeNumRuns mergeNumEntries knownCompleted state = do
178
177
mergeUnspentCredits <- UnspentCreditsVar <$> newPrimVar 0
178
+ mergeSpentCredits <- SpentCreditsVar <$> newPrimVar 0
179
179
mergeStepsPerformed <- TotalStepsVar <$> newPrimVar 0
180
180
case state of
181
181
OngoingMerge {} -> assert (knownCompleted == MergeMaybeCompleted ) (pure () )
@@ -187,6 +187,7 @@ unsafeNew mergeNumRuns mergeNumEntries knownCompleted state = do
187
187
mergeNumRuns
188
188
, mergeNumEntries
189
189
, mergeUnspentCredits
190
+ , mergeSpentCredits
190
191
, mergeStepsPerformed
191
192
, mergeKnownCompleted
192
193
, mergeState
@@ -196,7 +197,7 @@ unsafeNew mergeNumRuns mergeNumEntries knownCompleted state = do
196
197
finalise var = withMVar var $ \ case
197
198
CompletedMerge r ->
198
199
releaseRef r
199
- OngoingMerge rs _ m -> do
200
+ OngoingMerge rs m -> do
200
201
V. forM_ rs releaseRef
201
202
Merge. abort m
202
203
@@ -211,8 +212,8 @@ duplicateRuns (DeRef mr) =
211
212
-- We take the references while holding the MVar to make sure the MergingRun
212
213
-- does not get completed concurrently before we are done.
213
214
withMVar (mergeState mr) $ \ case
214
- CompletedMerge r -> V. singleton <$> dupRef r
215
- OngoingMerge rs _ _ -> withActionRegistry $ \ reg ->
215
+ CompletedMerge r -> V. singleton <$> dupRef r
216
+ OngoingMerge rs _ -> withActionRegistry $ \ reg ->
216
217
V. mapM (\ r -> withRollback reg (dupRef r) releaseRef) rs
217
218
218
219
{- ------------------------------------------------------------------------------
@@ -314,7 +315,8 @@ supplyCredits (Credits c) creditsThresh (DeRef MergingRun {..}) = do
314
315
isMergeDone <-
315
316
bracketOnError (takeAllUnspentCredits mergeUnspentCredits)
316
317
(putBackUnspentCredits mergeUnspentCredits)
317
- (stepMerge mergeState mergeStepsPerformed)
318
+ (stepMerge mergeSpentCredits mergeStepsPerformed
319
+ mergeState)
318
320
when isMergeDone $ completeMerge mergeState mergeKnownCompleted
319
321
else if unspentCredits' >= getCreditThreshold creditsThresh then do
320
322
-- We can do some merging work without finishing the merge immediately
@@ -329,7 +331,8 @@ supplyCredits (Credits c) creditsThresh (DeRef MergingRun {..}) = do
329
331
(tryTakeUnspentCredits mergeUnspentCredits creditsThresh (Credits unspentCredits'))
330
332
(mapM_ (putBackUnspentCredits mergeUnspentCredits)) $ \ case
331
333
Nothing -> pure False
332
- Just c' -> stepMerge mergeState mergeStepsPerformed c'
334
+ Just c' -> stepMerge mergeSpentCredits mergeStepsPerformed
335
+ mergeState c'
333
336
334
337
-- If we just finished the merge, then we convert the output of the
335
338
-- merge into a new run. i.e., we complete the merge.
@@ -427,20 +430,24 @@ takeAllUnspentCredits (UnspentCreditsVar !unspentCreditsVar) = do
427
430
casLoop prev'
428
431
429
432
{-# SPECIALISE stepMerge ::
430
- StrictMVar IO (MergingRunState IO h)
433
+ SpentCreditsVar RealWorld
431
434
-> TotalStepsVar RealWorld
435
+ -> StrictMVar IO (MergingRunState IO h)
432
436
-> Credits
433
437
-> IO Bool #-}
434
438
stepMerge ::
435
439
(MonadMVar m , MonadMask m , MonadSTM m , MonadST m )
436
- => StrictMVar m ( MergingRunState m h )
440
+ => SpentCreditsVar ( PrimState m )
437
441
-> TotalStepsVar (PrimState m )
442
+ -> StrictMVar m (MergingRunState m h )
438
443
-> Credits
439
444
-> m Bool
440
- stepMerge mergeVar (TotalStepsVar totalStepsVar) (Credits c) =
445
+ stepMerge (SpentCreditsVar spentCreditsVar)
446
+ (TotalStepsVar totalStepsVar)
447
+ mergeVar (Credits c) =
441
448
withMVar mergeVar $ \ case
442
449
CompletedMerge {} -> pure False
443
- (OngoingMerge _rs ( SpentCreditsVar spentCreditsVar) m) -> do
450
+ (OngoingMerge _rs m) -> do
444
451
totalSteps <- readPrimVar totalStepsVar
445
452
spentCredits <- readPrimVar spentCreditsVar
446
453
@@ -486,7 +493,7 @@ completeMerge ::
486
493
completeMerge mergeVar mergeKnownCompletedVar = do
487
494
modifyMVarMasked_ mergeVar $ \ case
488
495
mrs@ CompletedMerge {} -> pure $! mrs
489
- (OngoingMerge rs _spentCreditsVar m) -> do
496
+ (OngoingMerge rs m) -> do
490
497
-- first try to complete the merge before performing other side effects,
491
498
-- in case the completion fails
492
499
r <- Merge. complete m
@@ -509,7 +516,8 @@ expectCompleted (DeRef MergingRun {..}) = do
509
516
when (knownCompleted == MergeMaybeCompleted ) $ do
510
517
totalSteps <- readPrimVar (getTotalStepsVar mergeStepsPerformed)
511
518
let ! credits = Credits (unNumEntries mergeNumEntries - totalSteps)
512
- isMergeDone <- stepMerge mergeState mergeStepsPerformed credits
519
+ isMergeDone <- stepMerge mergeSpentCredits mergeStepsPerformed
520
+ mergeState credits
513
521
when isMergeDone $ completeMerge mergeState mergeKnownCompleted
514
522
-- TODO: can we think of a check to see if we did not do too much work
515
523
-- here?
0 commit comments