@@ -100,7 +100,7 @@ computeToPreserve db dirtySet = do
100
100
updateDirty :: Monad m => Focus. Focus KeyDetails m ()
101
101
updateDirty = Focus. adjust $ \ (KeyDetails status rdeps) ->
102
102
let status'
103
- | Running _ x _ <- status = Dirty x
103
+ | Running _ x <- status = Dirty x
104
104
| Clean x <- status = Dirty (Just x)
105
105
| otherwise = status
106
106
in KeyDetails status' rdeps
@@ -156,7 +156,6 @@ data FirstTime = FirstTime | NotFirstTime
156
156
builderOne' :: FirstTime -> Key -> Database -> Stack -> Key -> IO BuildContinue
157
157
builderOne' firstTime parentKey db@ Database {.. } stack kid = do
158
158
traceEvent (" builderOne: " ++ show kid) return ()
159
- barrier <- newEmptyMVar
160
159
-- join is used to register the async
161
160
join $ atomicallyNamed " builder" $ do
162
161
-- Spawn the id if needed
@@ -167,23 +166,28 @@ builderOne' firstTime parentKey db@Database {..} stack kid = do
167
166
NotFirstTime -> return ()
168
167
status <- SMap. lookup kid databaseValues
169
168
current <- readTVar databaseStep
169
+ let revisit =
170
+ case firstTime of
171
+ FirstTime -> pure . pure $ BCContinue $ do
172
+ br <- builderOne' NotFirstTime parentKey db stack kid
173
+ case br of
174
+ BCContinue ioR -> ioR
175
+ BCStop k r -> pure $ Right (k, r)
176
+ NotFirstTime -> retry
170
177
case (viewToRun current . keyStatus) =<< status of
171
178
Nothing -> do
172
- SMap. focus (updateStatus $ Running current Nothing barrier) kid databaseValues
173
- let register = spawnRefresh1 db stack kid barrier Nothing refresh
174
- $ atomicallyNamed " builderOne rollback" $ SMap. delete kid databaseValues
175
- return $ register >> return (BCContinue $ readMVar barrier)
176
- Just (Dirty _) -> case firstTime of
177
- FirstTime -> pure . pure $ BCContinue $ do
178
- br <- builderOne' NotFirstTime parentKey db stack kid
179
- case br of
180
- BCContinue ioR -> ioR
181
- BCStop k r -> pure $ Right (k, r)
182
- NotFirstTime -> retry
183
- Just (Clean r) -> pure . pure $ BCStop kid r
184
- Just (Running _step _s wait)
179
+ SMap. focus (updateStatus $ Running current Nothing ) kid databaseValues
180
+ let register barrier = do
181
+ spawnRefresh1 db stack kid barrier Nothing refresh
182
+ $ atomicallyNamed " builderOne rollback" $ SMap. delete kid databaseValues
183
+ return $ do
184
+ barrier <- newEmptyMVar
185
+ register barrier >> return (BCContinue $ readMVar barrier)
186
+ Just (Dirty _) -> revisit
187
+ Just (Running _step _s)
185
188
| memberStack kid stack -> throw $ StackException stack
186
- | otherwise -> pure . pure $ BCContinue $ readMVar wait
189
+ | otherwise -> revisit
190
+ Just (Clean r) -> pure . pure $ BCStop kid r
187
191
188
192
-- Original spawnRefresh1 implementation moved below to use the abstraction
189
193
@@ -248,7 +252,7 @@ upSweep db@Database {..} stack key childtKey = mask $ \restore -> do
248
252
case viewDirty current $ maybe (Dirty Nothing ) keyStatus status of
249
253
-- if it is still dirty, we update it and propogate further
250
254
(Dirty s) -> do
251
- SMap. focus (updateStatus $ Running current s barrier ) key databaseValues
255
+ SMap. focus (updateStatus $ Running current s) key databaseValues
252
256
-- if it is clean, other event update it, so it is fine.
253
257
return $ spawnRefresh1 db stack key barrier s (\ db stack key s -> restore $ do
254
258
result <- refresh db stack key s
0 commit comments