From 0116acc41ee9c9e1cdca64c5a916bd85c3f85a80 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 18 May 2006 11:33:39 +0000 Subject: [PATCH] Move Eq, Ord, Show instances for ThreadId to GHC.Conc Eliminates orphans. --- Control/Concurrent.hs | 38 -------------------------------------- GHC/Conc.lhs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/Control/Concurrent.hs b/Control/Concurrent.hs index fb9747d..f05ee5a 100644 --- a/Control/Concurrent.hs +++ b/Control/Concurrent.hs @@ -169,44 +169,6 @@ implement thread-friendly I\/O, so calling standard Haskell I\/O functions blocks only the thread making the call. -} --- Thread Ids, specifically the instances of Eq and Ord for these things. --- The ThreadId type itself is defined in std/PrelConc.lhs. - --- Rather than define a new primitve, we use a little helper function --- cmp_thread in the RTS. - -#ifdef __GLASGOW_HASKELL__ -id2TSO :: ThreadId -> ThreadId# -id2TSO (ThreadId t) = t - -foreign import ccall unsafe "cmp_thread" cmp_thread :: ThreadId# -> ThreadId# -> CInt --- Returns -1, 0, 1 - -cmpThread :: ThreadId -> ThreadId -> Ordering -cmpThread t1 t2 = - case cmp_thread (id2TSO t1) (id2TSO t2) of - -1 -> LT - 0 -> EQ - _ -> GT -- must be 1 - -instance Eq ThreadId where - t1 == t2 = - case t1 `cmpThread` t2 of - EQ -> True - _ -> False - -instance Ord ThreadId where - compare = cmpThread - -foreign import ccall unsafe "rts_getThreadId" getThreadId :: ThreadId# -> Int - -instance Show ThreadId where - showsPrec d t = - showString "ThreadId " . - showsPrec d (getThreadId (id2TSO t)) - -#endif /* __GLASGOW_HASKELL__ */ - #ifndef __HUGS__ max_buff_size :: Int max_buff_size = 1 diff --git a/GHC/Conc.lhs b/GHC/Conc.lhs index 11d78b8..f3c57cc 100644 --- a/GHC/Conc.lhs +++ b/GHC/Conc.lhs @@ -99,6 +99,7 @@ import GHC.Exception ( catchException, Exception(..), AsyncException(..) ) import GHC.Pack ( packCString# ) import GHC.Ptr ( Ptr(..), plusPtr, FunPtr(..) ) import GHC.STRef +import GHC.Show ( Show(..), showString ) import Data.Typeable infixr 0 `par`, `pseq` @@ -133,6 +134,35 @@ This misfeature will hopefully be corrected at a later date. it defines 'ThreadId' as a synonym for (). -} +instance Show ThreadId where + showsPrec d t = + showString "ThreadId " . + showsPrec d (getThreadId (id2TSO t)) + +foreign import ccall unsafe "rts_getThreadId" getThreadId :: ThreadId# -> Int + +id2TSO :: ThreadId -> ThreadId# +id2TSO (ThreadId t) = t + +foreign import ccall unsafe "cmp_thread" cmp_thread :: ThreadId# -> ThreadId# -> CInt +-- Returns -1, 0, 1 + +cmpThread :: ThreadId -> ThreadId -> Ordering +cmpThread t1 t2 = + case cmp_thread (id2TSO t1) (id2TSO t2) of + -1 -> LT + 0 -> EQ + _ -> GT -- must be 1 + +instance Eq ThreadId where + t1 == t2 = + case t1 `cmpThread` t2 of + EQ -> True + _ -> False + +instance Ord ThreadId where + compare = cmpThread + {- | This sparks off a new thread to run the 'IO' computation passed as the first argument, and returns the 'ThreadId' of the newly created -- 1.7.10.4