summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJose A Ortega Ruiz <jao@gnu.org>2010-02-14 18:56:47 +0100
committerJose A Ortega Ruiz <jao@gnu.org>2010-02-14 18:56:47 +0100
commit47a5cdddfb46734e5d3449863c9f124dce2f7fbd (patch)
tree513603d121796c2ed25e88e34f8df95c56933511
parent75e97337a0f68caacbfa7ddadcf040c6f3f889df (diff)
downloadxmobar-47a5cdddfb46734e5d3449863c9f124dce2f7fbd.tar.gz
xmobar-47a5cdddfb46734e5d3449863c9f124dce2f7fbd.tar.bz2
Protect against IO failres in MBox
Ignore-this: cd42eea2c51ae7fa959319be6463da14 darcs-hash:20100214175647-748be-5b24058b89f149b5d4a454eea8ff5933469f9482.gz
-rw-r--r--Plugins/MBox.hs17
-rw-r--r--Plugins/Monitors/Common.hs1
-rw-r--r--Plugins/Monitors/Top.hs10
3 files changed, 14 insertions, 14 deletions
diff --git a/Plugins/MBox.hs b/Plugins/MBox.hs
index 276d50a..8ca0e76 100644
--- a/Plugins/MBox.hs
+++ b/Plugins/MBox.hs
@@ -15,11 +15,11 @@
module Plugins.MBox (MBox(..)) where
import Prelude hiding (catch)
-import System.IO
import Plugins
import Control.Monad
import Control.Concurrent.STM
+import Control.Exception (SomeException, handle, evaluate)
import System.Directory
import System.FilePath
@@ -45,9 +45,9 @@ instance Exec MBox where
ev = [Modify, Create]
i <- initINotify
- zipWithM_ (\f v -> addWatch i ev f (handle v)) fs vs
+ zipWithM_ (\f v -> addWatch i ev f (handleNotification v)) fs vs
- forM (zip fs vs) $ \(f, v) -> do
+ forM_ (zip fs vs) $ \(f, v) -> do
exists <- doesFileExist f
n <- if exists then countMails f else return 0
atomically $ writeTVar v (f, n)
@@ -61,12 +61,13 @@ showC m n c =
where msg = m ++ show n
countMails :: FilePath -> IO Int
-countMails f = do
- txt <- readFileSafe f
- return $ length . filter (isPrefixOf "From ") . lines $ txt
+countMails f =
+ handle ((\_ -> evaluate 0) :: SomeException -> IO Int)
+ (do txt <- readFileSafe f
+ evaluate $! length . filter (isPrefixOf "From ") . lines $ txt)
-handle :: TVar (FilePath, Int) -> Event -> IO ()
-handle v _ = do
+handleNotification :: TVar (FilePath, Int) -> Event -> IO ()
+handleNotification v _ = do
(p, _) <- atomically $ readTVar v
n <- countMails p
atomically $ writeTVar v (p, n)
diff --git a/Plugins/Monitors/Common.hs b/Plugins/Monitors/Common.hs
index 2d35a71..c99a40f 100644
--- a/Plugins/Monitors/Common.hs
+++ b/Plugins/Monitors/Common.hs
@@ -53,7 +53,6 @@ module Plugins.Monitors.Common (
import Control.Concurrent
import Control.Monad.Reader
-import Control.Monad (zipWithM)
import qualified Data.ByteString.Lazy.Char8 as B
import Data.IORef
import qualified Data.Map as Map
diff --git a/Plugins/Monitors/Top.hs b/Plugins/Monitors/Top.hs
index 78ceee9..7e9f072 100644
--- a/Plugins/Monitors/Top.hs
+++ b/Plugins/Monitors/Top.hs
@@ -102,8 +102,8 @@ type Meminfo = (String, Int)
meminfo :: [String] -> Meminfo
meminfo fs = (n, r)
- where n = processName fs
- r = pageSize * (read (fs!!23))
+ where !n = processName fs
+ !r = pageSize * (read (fs!!23))
meminfos :: IO [Meminfo]
meminfos = handleProcesses ("", 0) meminfo
@@ -132,9 +132,9 @@ type TimesRef = IORef Times
timeEntry :: [String] -> TimeEntry
timeEntry fs = (p, (n, t))
- where p = read (head fs)
- n = processName fs
- t = read (fs!!13) + read (fs!!14)
+ where !p = read (head fs)
+ !n = processName fs
+ !t = read (fs!!13) + read (fs!!14)
timeEntries :: IO [TimeEntry]
timeEntries = handleProcesses (0, ("", 0)) timeEntry