Skip to content

Commit 7823c7d

Browse files
committed
lock-less exportsMap
1 parent baa942c commit 7823c7d

File tree

5 files changed

+11
-10
lines changed

5 files changed

+11
-10
lines changed

ghcide/session-loader/Development/IDE/Session.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ import System.IO
7373
import System.Info
7474

7575
import Control.Applicative (Alternative ((<|>)))
76-
import Control.Exception (evaluate)
7776
import Data.Void
7877

7978
import Control.Concurrent.STM (atomically)
8079
import Control.Concurrent.STM.TQueue
8180
import Data.Foldable (for_)
8281
import qualified Data.HashSet as Set
82+
import Data.IORef.Extra (atomicModifyIORef'_)
8383
import Data.Tuple (swap)
8484
import Database.SQLite.Simple
8585
import Development.IDE.Core.Tracing (withTrace)
@@ -407,7 +407,7 @@ loadSessionWithOptions SessionLoadingOptions{..} dir = do
407407
-- update exports map
408408
extras <- getShakeExtras
409409
let !exportsMap' = createExportsMap $ mapMaybe (fmap hirModIface) modIfaces
410-
liftIO $ modifyVar_ (exportsMap extras) $ evaluate . (exportsMap' <>)
410+
liftIO $ atomicModifyIORef'_ (exportsMap extras) $ (exportsMap' <>)
411411

412412
return (second Map.keys res)
413413

ghcide/src/Development/IDE/Core/OfInterest.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import Development.IDE.Graph
2727

2828
import Control.Concurrent.STM.Stats (atomically)
2929
import qualified Data.ByteString as BS
30+
import Data.IORef.Extra (atomicModifyIORef'_)
3031
import Data.Maybe (catMaybes)
3132
import Development.IDE.Core.ProgressReporting
3233
import Development.IDE.Core.RuleTypes
@@ -114,7 +115,7 @@ kick = do
114115
-- Update the exports map
115116
results <- uses GenerateCore files <* uses GetHieAst files
116117
let mguts = catMaybes results
117-
void $ liftIO $ modifyVar' exportsMap (updateExportsMapMg mguts)
118+
void $ liftIO $ atomicModifyIORef'_ exportsMap (updateExportsMapMg mguts)
118119

119120
liftIO $ progressUpdate progress KickCompleted
120121

ghcide/src/Development/IDE/Core/Shake.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ import Data.Default
156156
import Data.Foldable (toList)
157157
import Data.HashSet (HashSet)
158158
import qualified Data.HashSet as HSet
159+
import Data.IORef.Extra (atomicModifyIORef'_)
159160
import Data.String (fromString)
160161
import Data.Text (pack)
161162
import Debug.Trace.Flags (userTracingEnabled)
@@ -212,7 +213,7 @@ data ShakeExtras = ShakeExtras
212213
-- | A mapping of module name to known target (or candidate targets, if missing)
213214
,knownTargetsVar :: IORef (Hashed KnownTargets)
214215
-- | A mapping of exported identifiers for local modules. Updated on kick
215-
,exportsMap :: Var ExportsMap
216+
,exportsMap :: IORef ExportsMap
216217
-- | A work queue for actions added via 'runInShakeSession'
217218
,actionQueue :: ActionQueue
218219
,clientCapabilities :: ClientCapabilities
@@ -521,12 +522,12 @@ shakeOpen lspEnv defaultConfig logger debouncer
521522
indexCompleted <- newTVarIO 0
522523
indexProgressToken <- newVar Nothing
523524
let hiedbWriter = HieDbWriter{..}
524-
exportsMap <- newVar mempty
525+
exportsMap <- newIORef mempty
525526
-- lazily initialize the exports map with the contents of the hiedb
526527
_ <- async $ do
527528
logDebug logger "Initializing exports map from hiedb"
528529
em <- createExportsMapHieDb hiedb
529-
modifyVar' exportsMap (<> em)
530+
atomicModifyIORef'_ exportsMap (<> em)
530531
logDebug logger $ "Done initializing exports map from hiedb (" <> pack(show (ExportsMap.size em)) <> ")"
531532

532533
progress <- do

ghcide/src/Development/IDE/Plugin/CodeAction/Args.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ module Development.IDE.Plugin.CodeAction.Args
1414
)
1515
where
1616

17-
import Control.Concurrent.Extra
1817
import Control.Monad.Reader
1918
import Control.Monad.Trans.Maybe
2019
import Data.Either (fromRight)
@@ -59,7 +58,7 @@ runGhcideCodeAction state (CodeActionParams _ _ (TextDocumentIdentifier uri) _ra
5958
runRule GhcSession >>= \case
6059
Just env -> do
6160
pkgExports <- envPackageExports env
62-
localExports <- readVar (exportsMap $ shakeExtras state)
61+
localExports <- readIORef (exportsMap $ shakeExtras state)
6362
pure $ localExports <> pkgExports
6463
_ -> pure mempty
6564
caaIdeOptions <- onceIO $ runAction "GhcideCodeActions.getIdeOptions" state getIdeOptions

ghcide/src/Development/IDE/Plugin/Completions.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ module Development.IDE.Plugin.Completions
88
) where
99

1010
import Control.Concurrent.Async (concurrently)
11-
import Control.Concurrent.Extra
1211
import Control.Monad.Extra
1312
import Control.Monad.IO.Class
1413
import Control.Monad.Trans.Maybe
1514
import Data.Aeson
1615
import qualified Data.HashMap.Strict as Map
1716
import qualified Data.HashSet as Set
17+
import Data.IORef (readIORef)
1818
import Data.List (find)
1919
import Data.Maybe
2020
import qualified Data.Text as T
@@ -138,7 +138,7 @@ getCompletionsLSP ide plId
138138
-- set up the exports map including both package and project-level identifiers
139139
packageExportsMapIO <- fmap(envPackageExports . fst) <$> useWithStaleFast GhcSession npath
140140
packageExportsMap <- mapM liftIO packageExportsMapIO
141-
projectExportsMap <- liftIO $ readVar (exportsMap $ shakeExtras ide)
141+
projectExportsMap <- liftIO $ readIORef (exportsMap $ shakeExtras ide)
142142
let exportsMap = fromMaybe mempty packageExportsMap <> projectExportsMap
143143

144144
let moduleExports = getModuleExportsMap exportsMap

0 commit comments

Comments
 (0)