[Pkg-haskell-commits] [SCM] haskell-testpack branch, master, updated. debian/1.0.2-1-4-gb0d6b36
John Goerzen
jgoerzen at complete.org
Fri Apr 23 15:05:11 UTC 2010
The following commit has been merged in the master branch:
commit f93ff8cae6be4f17c99525d4651d376a19ceefac
Author: John Goerzen <jgoerzen at complete.org>
Date: Tue Dec 27 03:04:11 2005 +0100
Internal updating of Logger
Use MVar instead of IORef and Data.Map instead of FiniteMap
diff --git a/MissingH/Logging/Logger.hs b/MissingH/Logging/Logger.hs
index 2a4afa0..a96cfb8 100644
--- a/MissingH/Logging/Logger.hs
+++ b/MissingH/Logging/Logger.hs
@@ -179,9 +179,9 @@ import qualified MissingH.Logging.Handler(handle)
import MissingH.Logging.Handler.Simple
import IO
import System.IO.Unsafe
-import Data.IORef
+import Control.Concurrent.MVar
import Data.List(map)
-import Data.FiniteMap
+import Data.Map as Map
import qualified Control.Exception
---------------------------------------------------------------------------
-- Basic logger types
@@ -193,7 +193,7 @@ data Logger = Logger { level :: Priority,
name :: String}
-type LogTree = FiniteMap String Logger
+type LogTree = Map String Logger
{- | This is the base class for the various log handlers. They should
all adhere to this class. -}
@@ -220,12 +220,12 @@ placeholder = Logger {level = WARNING, handlers = [], name = ""}
{-# NOINLINE logTree #-}
-logTree :: IORef LogTree
+logTree :: MVar LogTree
-- note: only kick up tree if handled locally
logTree =
unsafePerformIO $ do
h <- streamHandler stderr DEBUG
- newIORef (unitFM rootLoggerName (Logger
+ newMVar (Map.singleton rootLoggerName (Logger
{level = WARNING,
name = "",
handlers = [HandlerT h]}))
@@ -241,17 +241,6 @@ componentsOfName name =
in
rootLoggerName : joinComp (split "." name) []
-createLoggers :: [String] -> IO ()
-createLoggers [] = return ()
-createLoggers (x:xs) =
- do
- lt <- readIORef logTree
- if elemFM x lt
- then createLoggers xs
- else do
- modifyIORef logTree (\a -> addToFM a x (placeholder {name = x}))
- createLoggers xs
-
---------------------------------------------------------------------------
-- Logging With Location
---------------------------------------------------------------------------
@@ -328,21 +317,23 @@ emergencyM s = logM s EMERGENCY
-- no connected handlers.
getLogger :: String -> IO Logger
-getLogger lname =
- do
- --putStrLn lname
- lt <- readIORef logTree
- --putStrLn (show (keysFM lt))
- case lookupFM lt lname of
- Just x -> return x
+getLogger lname = modifyMVar logTree $ \lt ->
+ case Map.lookup lname lt of
+ Just x -> return (lt, x)
Nothing -> do
--print "Missed it."
-- Add it. Then call myself to retrieve it.
- createLoggers (componentsOfName lname)
+ newlt <- createLoggers (componentsOfName lname) lt
--putStrLn "createLoggers done"
- getLogger lname
+ logger <- getLogger lname
+ return (newlt, logger)
+ where createLoggers :: [String] -> LogTree -> IO ()
+ createLoggers [] lt = return lt
+ createLoggers (x:xs) lt =
+ if Map.member x lt
+ then createLoggers xs lt
+ else createLoggers xs (Map.insert x (placeholder {name=x}) lt)
-
-- | Returns the root logger.
getRootLogger :: IO Logger
@@ -412,7 +403,7 @@ setLevel p l = l{level = p}
-- account any changes you may have made.
saveGlobalLogger :: Logger -> IO ()
-saveGlobalLogger l = modifyIORef logTree (\a -> addToFM a (name l) l)
+saveGlobalLogger l = modifyMVar_ logTree (\lt -> Map.insert (name l) l lt)
{- | Helps you make changes on the given logger. Takes a function
that makes changes and writes those changes back to the global
@@ -426,9 +417,8 @@ updateGlobalLogger :: String -- ^ Logger name
-> (Logger -> Logger) -- ^ Function to call
-> IO ()
updateGlobalLogger ln func =
- do
- l <- getLogger ln
- saveGlobalLogger (func l)
+ do l <- getLogger ln
+ saveGlobalLogger (func l)
{- | Traps exceptions that may occur, logging them, then passing them on.
--
haskell-testpack
More information about the Pkg-haskell-commits
mailing list