@@ -51,19 +51,19 @@ newDatabase databaseExtra databaseRules = do
51
51
pure Database {.. }
52
52
53
53
-- | Increment the step and mark dirty
54
- incDatabase :: Database -> Maybe [Key ] -> STM ()
54
+ incDatabase :: Database -> Maybe [Key ] -> IO ()
55
55
-- only some keys are dirty
56
56
incDatabase db (Just kk) = do
57
- modifyTVar' (databaseStep db) $ \ (Step i) -> Step $ i + 1
57
+ atomically $ modifyTVar' (databaseStep db) $ \ (Step i) -> Step $ i + 1
58
58
transitiveDirtyKeys <- transitiveDirtySet db kk
59
- for_ transitiveDirtyKeys $ \ k ->
59
+ for_ transitiveDirtyKeys $ \ k -> atomically $
60
60
SMap. focus updateDirty k (databaseValues db)
61
61
62
62
-- all keys are dirty
63
63
incDatabase db Nothing = do
64
- modifyTVar' (databaseStep db) $ \ (Step i) -> Step $ i + 1
64
+ atomically $ modifyTVar' (databaseStep db) $ \ (Step i) -> Step $ i + 1
65
65
let list = SMap. listT (databaseValues db)
66
- flip ListT. traverse_ list $ \ (k,_) -> do
66
+ atomicallyNamed " incDatabase " $ flip ListT. traverse_ list $ \ (k,_) ->
67
67
SMap. focus updateDirty k (databaseValues db)
68
68
69
69
updateDirty :: Monad m => Focus. Focus KeyDetails m ()
@@ -94,7 +94,7 @@ builder db@Database{..} keys = withRunInIO $ \(RunInIO run) -> do
94
94
-- Things that I need to force before my results are ready
95
95
toForce <- liftIO $ newTVarIO []
96
96
current <- liftIO $ readTVarIO databaseStep
97
- results <- liftIO $ atomicallyNamed " builder " $ for keys $ \ id -> do
97
+ results <- liftIO $ for keys $ \ id -> atomicallyNamed " builder " $ do
98
98
-- Spawn the id if needed
99
99
status <- SMap. lookup id databaseValues
100
100
val <- case viewDirty current $ maybe (Dirty Nothing ) keyStatus status of
@@ -215,7 +215,7 @@ updateReverseDeps
215
215
-> [Key ] -- ^ Previous direct dependencies of Id
216
216
-> HashSet Key -- ^ Current direct dependencies of Id
217
217
-> IO ()
218
- updateReverseDeps myId db prev new = uninterruptibleMask_ $ atomicallyNamed " updateReverseDeps " $ do
218
+ updateReverseDeps myId db prev new = uninterruptibleMask_ $ do
219
219
forM_ prev $ \ d ->
220
220
unless (d `HSet.member` new) $
221
221
doOne (HSet. delete myId) d
@@ -224,20 +224,20 @@ updateReverseDeps myId db prev new = uninterruptibleMask_ $ atomicallyNamed "upd
224
224
where
225
225
alterRDeps f =
226
226
Focus. adjust (onKeyReverseDeps f)
227
- doOne f id =
227
+ doOne f id = atomicallyNamed " updateReverseDeps " $
228
228
SMap. focus (alterRDeps f) id (databaseValues db)
229
229
230
230
getReverseDependencies :: Database -> Key -> STM (Maybe (HashSet Key ))
231
231
getReverseDependencies db = (fmap . fmap ) keyReverseDeps . flip SMap. lookup (databaseValues db)
232
232
233
- transitiveDirtySet :: Foldable t => Database -> t Key -> STM (HashSet Key )
233
+ transitiveDirtySet :: Foldable t => Database -> t Key -> IO (HashSet Key )
234
234
transitiveDirtySet database = flip State. execStateT HSet. empty . traverse_ loop
235
235
where
236
236
loop x = do
237
237
seen <- State. get
238
238
if x `HSet.member` seen then pure () else do
239
239
State. put (HSet. insert x seen)
240
- next <- lift $ getReverseDependencies database x
240
+ next <- lift $ atomically $ getReverseDependencies database x
241
241
traverse_ loop (maybe mempty HSet. toList next)
242
242
243
243
-- | IO extended to track created asyncs to clean them up when the thread is killed,
0 commit comments