summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2020-01-23 23:03:34 -0500
committerJoe Crayne <joe@jerkface.net>2020-01-24 03:01:54 -0500
commitb7d05c1aa9fe88880eca5ee3f6a20ac16c9e6137 (patch)
tree24ebb2d7a9909cd23de2e297c87773eb1a02c99d
parent5f2252d21c9996fe6b23654e53c613817ae3b292 (diff)
More efficient hashThreadId.
-rw-r--r--lifted-concurrent/src/Control/Concurrent/Lifted/Instrument.hs17
1 files changed, 10 insertions, 7 deletions
diff --git a/lifted-concurrent/src/Control/Concurrent/Lifted/Instrument.hs b/lifted-concurrent/src/Control/Concurrent/Lifted/Instrument.hs
index b4a67583..d886f939 100644
--- a/lifted-concurrent/src/Control/Concurrent/Lifted/Instrument.hs
+++ b/lifted-concurrent/src/Control/Concurrent/Lifted/Instrument.hs
@@ -1,5 +1,7 @@
1{-# LANGUAGE FlexibleContexts #-} 1{-# LANGUAGE FlexibleContexts #-}
2{-# LANGUAGE RankNTypes #-} 2{-# LANGUAGE MagicHash #-}
3{-# LANGUAGE RankNTypes #-}
4{-# LANGUAGE UnliftedFFITypes #-}
3module Control.Concurrent.Lifted.Instrument 5module Control.Concurrent.Lifted.Instrument
4 ( module Control.Concurrent.Lifted 6 ( module Control.Concurrent.Lifted
5 , forkLabeled 7 , forkLabeled
@@ -17,6 +19,9 @@ import qualified Control.Concurrent.Lifted as Raw
17import Control.Concurrent.Lifted hiding (fork,forkOS) 19import Control.Concurrent.Lifted hiding (fork,forkOS)
18import Control.Exception (fromException) 20import Control.Exception (fromException)
19import Control.Monad.Trans.Control 21import Control.Monad.Trans.Control
22import Foreign.C.Types
23import GHC.Exts (ThreadId#)
24import GHC.Conc (ThreadId(..))
20import GHC.Stack 25import GHC.Stack
21import System.IO.Unsafe 26import System.IO.Unsafe
22import qualified Data.Map.Strict as Map 27import qualified Data.Map.Strict as Map
@@ -45,13 +50,11 @@ data GlobalState = GlobalState
45 { reportException :: String -> IO () 50 { reportException :: String -> IO ()
46 } 51 }
47 52
53foreign import ccall unsafe "rts_getThreadId" rts_getThreadId :: ThreadId# -> CInt
54
48hashThreadId :: ThreadId -> Int 55hashThreadId :: ThreadId -> Int
49hashThreadId tid = hash 0 (dropThreadIdAndSPace (show tid)) 56hashThreadId (ThreadId t) = fromIntegral (rts_getThreadId t) `mod` V.length globalMVarArray
50 where 57
51 dropThreadIdAndSPace ('T':'h':'r':'e':'a':'d':'I':'d':' ':xs) = xs
52 dropThreadIdAndSPace xs = xs
53 hash n xs = read xs `mod` 256
54
55 58
56globals :: MVar GlobalState 59globals :: MVar GlobalState
57globals = unsafePerformIO $ newMVar $ GlobalState 60globals = unsafePerformIO $ newMVar $ GlobalState