@@ -156,7 +156,6 @@ import Data.Default
156
156
import Data.Foldable (toList )
157
157
import Data.HashSet (HashSet )
158
158
import qualified Data.HashSet as HSet
159
- import Data.IORef.Extra (atomicModifyIORef'_ )
160
159
import Data.String (fromString )
161
160
import Data.Text (pack )
162
161
import Debug.Trace.Flags (userTracingEnabled )
@@ -190,7 +189,7 @@ data ShakeExtras = ShakeExtras
190
189
lspEnv :: Maybe (LSP. LanguageContextEnv Config )
191
190
,debouncer :: Debouncer NormalizedUri
192
191
,logger :: Logger
193
- ,globals :: IORef (HMap. HashMap TypeRep Dynamic )
192
+ ,globals :: TVar (HMap. HashMap TypeRep Dynamic )
194
193
,state :: Values
195
194
,diagnostics :: STMDiagnosticStore
196
195
,hiddenDiagnostics :: STMDiagnosticStore
@@ -211,15 +210,15 @@ data ShakeExtras = ShakeExtras
211
210
-> IO ()
212
211
,ideNc :: IORef NameCache
213
212
-- | A mapping of module name to known target (or candidate targets, if missing)
214
- ,knownTargetsVar :: IORef (Hashed KnownTargets )
213
+ ,knownTargetsVar :: TVar (Hashed KnownTargets )
215
214
-- | A mapping of exported identifiers for local modules. Updated on kick
216
- ,exportsMap :: IORef ExportsMap
215
+ ,exportsMap :: TVar ExportsMap
217
216
-- | A work queue for actions added via 'runInShakeSession'
218
217
,actionQueue :: ActionQueue
219
218
,clientCapabilities :: ClientCapabilities
220
219
, hiedb :: HieDb -- ^ Use only to read.
221
220
, hiedbWriter :: HieDbWriter -- ^ use to write
222
- , persistentKeys :: IORef (HMap. HashMap Key GetStalePersistent )
221
+ , persistentKeys :: TVar (HMap. HashMap Key GetStalePersistent )
223
222
-- ^ Registery for functions that compute/get "stale" results for the rule
224
223
-- (possibly from disk)
225
224
, vfs :: VFSHandle
@@ -259,7 +258,7 @@ getPluginConfig plugin = do
259
258
addPersistentRule :: IdeRule k v => k -> (NormalizedFilePath -> IdeAction (Maybe (v ,PositionDelta ,TextDocumentVersion ))) -> Rules ()
260
259
addPersistentRule k getVal = do
261
260
ShakeExtras {persistentKeys} <- getShakeExtrasRules
262
- void $ liftIO $ atomicModifyIORef'_ persistentKeys $ HMap. insert (Key k) (fmap (fmap (first3 toDyn)) . getVal)
261
+ void $ liftIO $ atomically $ modifyTVar' persistentKeys $ HMap. insert (Key k) (fmap (fmap (first3 toDyn)) . getVal)
263
262
264
263
class Typeable a => IsIdeGlobal a where
265
264
@@ -283,15 +282,15 @@ addIdeGlobal x = do
283
282
284
283
addIdeGlobalExtras :: IsIdeGlobal a => ShakeExtras -> a -> IO ()
285
284
addIdeGlobalExtras ShakeExtras {globals} x@ (typeOf -> ty) =
286
- void $ liftIO $ atomicModifyIORef'_ globals $ \ mp -> case HMap. lookup ty mp of
285
+ void $ liftIO $ atomically $ modifyTVar' globals $ \ mp -> case HMap. lookup ty mp of
287
286
Just _ -> error $ " Internal error, addIdeGlobalExtras, got the same type twice for " ++ show ty
288
287
Nothing -> HMap. insert ty (toDyn x) mp
289
288
290
289
291
290
getIdeGlobalExtras :: forall a . IsIdeGlobal a => ShakeExtras -> IO a
292
291
getIdeGlobalExtras ShakeExtras {globals} = do
293
292
let typ = typeRep (Proxy :: Proxy a )
294
- x <- HMap. lookup (typeRep (Proxy :: Proxy a )) <$> readIORef globals
293
+ x <- HMap. lookup (typeRep (Proxy :: Proxy a )) <$> readTVarIO globals
295
294
case x of
296
295
Just x
297
296
| Just x <- fromDynamic x -> pure x
@@ -334,7 +333,7 @@ lastValueIO s@ShakeExtras{positionMapping,persistentKeys,state} k file = do
334
333
| IdeTesting testing <- ideTesting s -- Don't read stale persistent values in tests
335
334
, testing = pure Nothing
336
335
| otherwise = do
337
- pmap <- readIORef persistentKeys
336
+ pmap <- readTVarIO persistentKeys
338
337
mv <- runMaybeT $ do
339
338
liftIO $ Logger. logDebug (logger s) $ T. pack $ " LOOKUP UP PERSISTENT FOR: " ++ show k
340
339
f <- MaybeT $ pure $ HMap. lookup (Key k) pmap
@@ -478,7 +477,7 @@ getValues state key file = do
478
477
knownTargets :: Action (Hashed KnownTargets )
479
478
knownTargets = do
480
479
ShakeExtras {knownTargetsVar} <- getShakeExtras
481
- liftIO $ readIORef knownTargetsVar
480
+ liftIO $ readTVarIO knownTargetsVar
482
481
483
482
-- | Seq the result stored in the Shake value. This only
484
483
-- evaluates the value to WHNF not NF. We take care of the latter
@@ -509,25 +508,25 @@ shakeOpen lspEnv defaultConfig logger debouncer
509
508
us <- mkSplitUniqSupply ' r'
510
509
ideNc <- newIORef (initNameCache us knownKeyNames)
511
510
shakeExtras <- do
512
- globals <- newIORef HMap. empty
511
+ globals <- newTVarIO HMap. empty
513
512
state <- STM. newIO
514
513
diagnostics <- STM. newIO
515
514
hiddenDiagnostics <- STM. newIO
516
515
publishedDiagnostics <- STM. newIO
517
516
positionMapping <- STM. newIO
518
- knownTargetsVar <- newIORef $ hashed HMap. empty
517
+ knownTargetsVar <- newTVarIO $ hashed HMap. empty
519
518
let restartShakeSession = shakeRestart ideState
520
- persistentKeys <- newIORef HMap. empty
519
+ persistentKeys <- newTVarIO HMap. empty
521
520
indexPending <- newTVarIO HMap. empty
522
521
indexCompleted <- newTVarIO 0
523
522
indexProgressToken <- newVar Nothing
524
523
let hiedbWriter = HieDbWriter {.. }
525
- exportsMap <- newIORef mempty
524
+ exportsMap <- newTVarIO mempty
526
525
-- lazily initialize the exports map with the contents of the hiedb
527
526
_ <- async $ do
528
527
logDebug logger " Initializing exports map from hiedb"
529
528
em <- createExportsMapHieDb hiedb
530
- atomicModifyIORef'_ exportsMap (<> em)
529
+ atomically $ modifyTVar' exportsMap (<> em)
531
530
logDebug logger $ " Done initializing exports map from hiedb (" <> pack(show (ExportsMap. size em)) <> " )"
532
531
533
532
progress <- do
0 commit comments