summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrea Rossato <andrea.rossato@ing.unitn.it>2007-10-11 22:30:29 +0200
committerAndrea Rossato <andrea.rossato@ing.unitn.it>2007-10-11 22:30:29 +0200
commit7064cb084ea05f13a54ec7cfb2956f5ade5458ba (patch)
treef6dd4a50bf3e64dec5afb416a118a047ef574da9
parented885c39e52be7a81163fcdddd9fd00e30c6eb8a (diff)
downloadxmobar-7064cb084ea05f13a54ec7cfb2956f5ade5458ba.tar.gz
xmobar-7064cb084ea05f13a54ec7cfb2956f5ade5458ba.tar.bz2
The MVar is needed to avoid a race condition
As Spencer noted the checker thread may be throwing an exception immediately, thus producing a race condition. darcs-hash:20071011203029-d6583-64a79e4be3cf1ab97c7ba2ee36db08166c9003d4.gz
-rw-r--r--Xmobar.hs9
1 files changed, 5 insertions, 4 deletions
diff --git a/Xmobar.hs b/Xmobar.hs
index ac7ca40..e8091a7 100644
--- a/Xmobar.hs
+++ b/Xmobar.hs
@@ -70,11 +70,12 @@ runX c d w f = runReaderT f (XConf d w c)
-- | The event loop
eventLoop :: Config -> [(Maybe ThreadId, TVar String)] -> Display -> Window -> IO ()
-eventLoop c v d w = block $ do
+eventLoop c v d w = do
+ b <- newEmptyMVar
tv <- atomically $ newTVar []
- t <- myThreadId
- forkIO $ checker t tv ""
- go tv
+ t <- forkIO (block $ do putMVar b (); go tv)
+ takeMVar b
+ checker t tv ""
where
-- interrupt the drawing thread every time a var is updated
checker t tvar ov = do