Skip to content

Commit cc382b5

Browse files
committed
migrate to MVar
1 parent b958048 commit cc382b5

File tree

1 file changed

+10
-9
lines changed

1 file changed

+10
-9
lines changed

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import Data.Foldable (for_)
2222
import Data.Functor (($>))
2323
import qualified Data.HashMap.Strict as HMap
2424
import qualified Data.Text as T
25+
import Data.Tuple.Extra (dupe)
2526
import Data.Unique
2627
import Development.IDE.GHC.Orphans ()
2728
import Development.IDE.Graph hiding (ShakeValue)
@@ -31,7 +32,7 @@ import qualified Language.LSP.Server as LSP
3132
import Language.LSP.Types
3233
import qualified Language.LSP.Types as LSP
3334
import System.Time.Extra
34-
import UnliftIO.Exception (bracket_)
35+
import UnliftIO.Exception (bracket_, evaluate)
3536

3637
data ProgressEvent
3738
= KickStarted
@@ -100,11 +101,11 @@ delayedProgressReporting
100101
-> ProgressReportingStyle
101102
-> IO ProgressReporting
102103
delayedProgressReporting before after lspEnv optProgressStyle = do
103-
inProgressVar <- newVar $ InProgress 0 0 mempty
104-
progressState <- newVar NotStarted
104+
inProgressVar <- newMVar $ InProgress 0 0 mempty
105+
progressState <- newMVar NotStarted
105106
let progressUpdate event = updateStateVar $ Event event
106107
progressStop = updateStateVar StopProgress
107-
updateStateVar = modifyVar_ progressState . updateState (mRunLspT lspEnv $ lspShakeProgress inProgressVar)
108+
updateStateVar = modifyMVar_ progressState . updateState (mRunLspT lspEnv $ lspShakeProgress inProgressVar)
108109

109110
inProgress :: NormalizedFilePath -> Action a -> Action a
110111
inProgress = withProgressVar inProgressVar
@@ -116,10 +117,10 @@ delayedProgressReporting before after lspEnv optProgressStyle = do
116117
liftIO $ sleep before
117118
u <- ProgressTextToken . T.pack . show . hashUnique <$> liftIO newUnique
118119

119-
b <- liftIO newBarrier
120+
b <- liftIO newEmptyMVar
120121
void $ LSP.sendRequest LSP.SWindowWorkDoneProgressCreate
121-
LSP.WorkDoneProgressCreateParams { _token = u } $ liftIO . signalBarrier b
122-
ready <- liftIO $ waitBarrier b
122+
LSP.WorkDoneProgressCreateParams { _token = u } $ liftIO . putMVar b
123+
ready <- liftIO $ takeMVar b
123124

124125
for_ ready $ const $ bracket_ (start u) (stop u) (loop u 0)
125126
where
@@ -143,7 +144,7 @@ delayedProgressReporting before after lspEnv optProgressStyle = do
143144
loop _ _ | optProgressStyle == NoProgress =
144145
forever $ liftIO $ threadDelay maxBound
145146
loop id prev = do
146-
InProgress{..} <- liftIO $ readVar inProgress
147+
InProgress{..} <- liftIO $ readMVar inProgress
147148
liftIO $ sleep after
148149
if todo == 0 then loop id 0 else do
149150
let next = 100 * fromIntegral done / fromIntegral todo
@@ -171,7 +172,7 @@ delayedProgressReporting before after lspEnv optProgressStyle = do
171172
-- Do not remove the eta-expansion without profiling a session with at
172173
-- least 1000 modifications.
173174
where
174-
f shift = modifyVar' var $ recordProgress file shift
175+
f shift = modifyMVar var $ evaluate . dupe . recordProgress file shift
175176

176177
mRunLspT :: Applicative m => Maybe (LSP.LanguageContextEnv c ) -> LSP.LspT c m () -> m ()
177178
mRunLspT (Just lspEnv) f = LSP.runLspT lspEnv f

0 commit comments

Comments
 (0)