Skip to content

Commit 2ed25aa

Browse files
committed
Update ghc-events to 0.13.0
As of ghc-events#55[1] most of the String fields in EventInfo have been replaced with Text. This patch updates threadscope code accordingly. This is incompatible with older ghc-events. [1]: haskell/ghc-events#55
1 parent 1ab567f commit 2ed25aa

File tree

8 files changed

+72
-50
lines changed

8 files changed

+72
-50
lines changed

Events/HECs.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import Events.SparkTree
1616
import GHC.RTS.Events
1717

1818
import Data.Array
19+
import Data.Text (Text)
1920
import qualified Data.List as L
2021

2122
#if MIN_VERSION_containers(0,5,0)
@@ -37,7 +38,7 @@ data HECs = HECs {
3738
maxXHistogram :: Int,
3839
maxYHistogram :: Timestamp,
3940
durHistogram :: [(Timestamp, Int, Timestamp)],
40-
perfNames :: IM.IntMap String
41+
perfNames :: IM.IntMap Text
4142
}
4243

4344
-----------------------------------------------------------------------------
@@ -60,7 +61,7 @@ timestampToEventIndex HECs{hecEventArray=arr} ts =
6061
mid = l + (r - l) `quot` 2
6162
tmid = evTime (arr!mid)
6263

63-
extractUserMarkers :: HECs -> [(Timestamp, String)]
64+
extractUserMarkers :: HECs -> [(Timestamp, Text)]
6465
extractUserMarkers hecs =
6566
[ (ts, mark)
6667
| (Event ts (UserMarker mark) _) <- elems (hecEventArray hecs) ]

Events/TestEvents.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE OverloadedStrings #-}
12
module Events.TestEvents (testTrace)
23
where
34

GUI/BookmarkView.hs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@ import GHC.RTS.Events (Timestamp)
1515
import Graphics.UI.Gtk
1616
import qualified Graphics.UI.Gtk.ModelView.TreeView.Compat as Compat
1717
import Numeric
18+
import Data.Text (Text)
1819

1920
---------------------------------------------------------------------------
2021

2122
-- | Abstract bookmark view object.
2223
--
2324
data BookmarkView = BookmarkView {
24-
bookmarkStore :: ListStore (Timestamp, String)
25+
bookmarkStore :: ListStore (Timestamp, Text)
2526
}
2627

2728
-- | The actions to take in response to TraceView events.
@@ -30,12 +31,12 @@ data BookmarkViewActions = BookmarkViewActions {
3031
bookmarkViewAddBookmark :: IO (),
3132
bookmarkViewRemoveBookmark :: Int -> IO (),
3233
bookmarkViewGotoBookmark :: Timestamp -> IO (),
33-
bookmarkViewEditLabel :: Int -> String -> IO ()
34+
bookmarkViewEditLabel :: Int -> Text -> IO ()
3435
}
3536

3637
---------------------------------------------------------------------------
3738

38-
bookmarkViewAdd :: BookmarkView -> Timestamp -> String -> IO ()
39+
bookmarkViewAdd :: BookmarkView -> Timestamp -> Text -> IO ()
3940
bookmarkViewAdd BookmarkView{bookmarkStore} ts label = do
4041
listStoreAppend bookmarkStore (ts, label)
4142
return ()
@@ -49,11 +50,11 @@ bookmarkViewClear :: BookmarkView -> IO ()
4950
bookmarkViewClear BookmarkView{bookmarkStore} =
5051
listStoreClear bookmarkStore
5152

52-
bookmarkViewGet :: BookmarkView -> IO [(Timestamp, String)]
53+
bookmarkViewGet :: BookmarkView -> IO [(Timestamp, Text)]
5354
bookmarkViewGet BookmarkView{bookmarkStore} =
5455
listStoreToList bookmarkStore
5556

56-
bookmarkViewSetLabel :: BookmarkView -> Int -> String -> IO ()
57+
bookmarkViewSetLabel :: BookmarkView -> Int -> Text -> IO ()
5758
bookmarkViewSetLabel BookmarkView{bookmarkStore} n label = do
5859
(ts,_) <- listStoreGetValue bookmarkStore n
5960
listStoreSetValue bookmarkStore n (ts, label)

GUI/EventsView.hs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# LANGUAGE CPP #-}
2+
{-# LANGUAGE OverloadedStrings #-}
23
module GUI.EventsView (
34
EventsView,
45
eventsViewNew,
@@ -20,6 +21,9 @@ import Control.Monad.Reader
2021
import Data.Array
2122
import Data.IORef
2223
import qualified Data.Text as T
24+
import qualified Data.Text.Lazy as TL
25+
import qualified Data.Text.Lazy.Builder as TB
26+
import qualified Data.Text.Lazy.Builder.Int as TB (decimal)
2327
import Numeric
2428

2529
-------------------------------------------------------------------------------
@@ -55,8 +59,8 @@ eventsViewNew builder EventsViewActions{..} = do
5559
stateRef <- newIORef undefined
5660

5761
let getWidget cast = builderGetObject builder cast
58-
drawArea <- getWidget castToWidget "eventsDrawingArea"
59-
vScrollbar <- getWidget castToVScrollbar "eventsVScroll"
62+
drawArea <- getWidget castToWidget ("eventsDrawingArea" :: T.Text)
63+
vScrollbar <- getWidget castToVScrollbar ("eventsVScroll" :: T.Text)
6064
adj <- get vScrollbar rangeAdjustment
6165

6266
-- make the background white
@@ -339,16 +343,14 @@ drawEvents EventsView{drawArea, adj}
339343
where
340344
showEventTime (Event time _spec _) =
341345
showFFloat (Just 6) (fromIntegral time / 1000000) "s"
342-
showEventDescr :: Event -> String
343-
showEventDescr (Event _time spec cap) =
344-
(case cap of
345-
Nothing -> ""
346-
Just c -> "HEC " ++ show c ++ ": ")
347-
++ case spec of
348-
UnknownEvent{ref} -> "unknown event; " ++ show ref
349-
Message msg -> msg
350-
UserMessage msg -> msg
351-
_ -> showEventInfo spec
346+
showEventDescr :: Event -> T.Text
347+
showEventDescr (Event _time spec cap) = TL.toStrict $ TB.toLazyText $
348+
maybe "" (\c -> "HEC " <> TB.decimal c <> ": ") cap
349+
<> case spec of
350+
UnknownEvent{ref} -> "unknown event; " <> TB.decimal ref
351+
Message msg -> TB.fromText msg
352+
UserMessage msg -> TB.fromText msg
353+
_ -> buildEventInfo spec
352354

353355
-------------------------------------------------------------------------------
354356

GUI/Main.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{-# LANGUAGE CPP #-}
22
{-# LANGUAGE TemplateHaskell #-}
3+
{-# LANGUAGE OverloadedStrings #-}
34
module GUI.Main (runGUI) where
45

56
-- Imports for GTK
@@ -16,6 +17,7 @@ import qualified Control.Concurrent.Chan as Chan
1617
import Control.Exception
1718
import Data.Array
1819
import Data.Maybe
20+
import Data.Text (Text)
1921

2022
-- Imports for ThreadScope
2123
import qualified GUI.App as App
@@ -108,7 +110,7 @@ data Event
108110

109111
| EventBookmarkAdd
110112
| EventBookmarkRemove Int
111-
| EventBookmarkEdit Int String
113+
| EventBookmarkEdit Int Text
112114

113115
| EventUserError String SomeException
114116
-- can add more specific ones if necessary

GUI/StartupInfoView.hs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
{-# LANGUAGE OverloadedStrings #-}
2+
{-# LANGUAGE ViewPatterns #-}
13
module GUI.StartupInfoView (
24
StartupInfoView,
35
startupInfoViewNew,
@@ -14,25 +16,27 @@ import Data.List
1416
import Data.Maybe
1517
import Data.Time
1618
import Data.Time.Clock.POSIX
19+
import Data.Text (Text)
20+
import qualified Data.Text as T
1721

1822
-------------------------------------------------------------------------------
1923

2024
data StartupInfoView = StartupInfoView
2125
{ labelProgName :: Label
22-
, storeProgArgs :: ListStore String
23-
, storeProgEnv :: ListStore (String, String)
26+
, storeProgArgs :: ListStore Text
27+
, storeProgEnv :: ListStore (Text, Text)
2428
, labelProgStartTime :: Label
2529
, labelProgRtsId :: Label
2630
}
2731

2832
data StartupInfoState
2933
= StartupInfoEmpty
3034
| StartupInfoLoaded
31-
{ progName :: Maybe String
32-
, progArgs :: Maybe [String]
33-
, progEnv :: Maybe [(String, String)]
35+
{ progName :: Maybe Text
36+
, progArgs :: Maybe [Text]
37+
, progEnv :: Maybe [(Text, Text)]
3438
, progStartTime :: Maybe UTCTime
35-
, progRtsId :: Maybe String
39+
, progRtsId :: Maybe Text
3640
}
3741

3842
-------------------------------------------------------------------------------
@@ -42,11 +46,11 @@ startupInfoViewNew builder = do
4246

4347
let getWidget cast = builderGetObject builder cast
4448

45-
labelProgName <- getWidget castToLabel "labelProgName"
46-
treeviewProgArgs <- getWidget castToTreeView "treeviewProgArguments"
47-
treeviewProgEnv <- getWidget castToTreeView "treeviewProgEnvironment"
48-
labelProgStartTime <- getWidget castToLabel "labelProgStartTime"
49-
labelProgRtsId <- getWidget castToLabel "labelProgRtsIdentifier"
49+
labelProgName <- getWidget castToLabel ("labelProgName" :: Text)
50+
treeviewProgArgs <- getWidget castToTreeView ("treeviewProgArguments" :: Text)
51+
treeviewProgEnv <- getWidget castToTreeView ("treeviewProgEnvironment" :: Text)
52+
labelProgStartTime <- getWidget castToLabel ("labelProgStartTime" :: Text)
53+
labelProgRtsId <- getWidget castToLabel ("labelProgRtsIdentifier" :: Text)
5054

5155
storeProgArgs <- listStoreNew []
5256
columnArgs <- treeViewColumnNew
@@ -126,7 +130,7 @@ processEvents = foldl' accum (StartupInfoLoaded Nothing Nothing Nothing Nothing
126130
accum info _ = info
127131

128132
-- convert ["foo=bar", ...] to [("foo", "bar"), ...]
129-
parseEnv env = [ (var, value) | (var, '=':value) <- map (span (/='=')) env ]
133+
parseEnv env = [ (var, value) | (var, T.drop 1 -> value) <- map (T.span (/='=')) env ]
130134

131135
updateStartupInfo :: StartupInfoView -> StartupInfoState -> IO ()
132136
updateStartupInfo StartupInfoView{..} StartupInfoLoaded{..} = do
@@ -139,8 +143,8 @@ updateStartupInfo StartupInfoView{..} StartupInfoLoaded{..} = do
139143
mapM_ (listStoreAppend storeProgEnv) (fromMaybe [] progEnv)
140144

141145
updateStartupInfo StartupInfoView{..} StartupInfoEmpty = do
142-
set labelProgName [ labelText := "" ]
143-
set labelProgStartTime [ labelText := "" ]
144-
set labelProgRtsId [ labelText := "" ]
146+
set labelProgName [ labelText := ("" :: Text) ]
147+
set labelProgStartTime [ labelText := ("" :: Text) ]
148+
set labelProgRtsId [ labelText := ("" :: Text) ]
145149
listStoreClear storeProgArgs
146150
listStoreClear storeProgEnv

GUI/Timeline/HEC.hs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE OverloadedStrings #-}
12
module GUI.Timeline.HEC (
23
renderHEC,
34
renderInstantHEC,
@@ -19,9 +20,14 @@ import qualified GHC.RTS.Events as GHC
1920
import Control.Monad
2021
import qualified Data.IntMap as IM
2122
import Data.Maybe
23+
import Data.Text (Text)
24+
import qualified Data.Text as T
25+
import qualified Data.Text.Lazy as TL
26+
import qualified Data.Text.Lazy.Builder as TB
27+
import qualified Data.Text.Lazy.Builder.Int as TB (decimal)
2228

2329
renderHEC :: ViewParameters -> Timestamp -> Timestamp
24-
-> IM.IntMap String -> (DurationTree,EventTree)
30+
-> IM.IntMap Text -> (DurationTree,EventTree)
2531
-> Render ()
2632
renderHEC params@ViewParameters{..} start end perfNames (dtree,etree) = do
2733
renderDurations params start end dtree
@@ -33,7 +39,7 @@ renderHEC params@ViewParameters{..} start end perfNames (dtree,etree) = do
3339
return ()
3440

3541
renderInstantHEC :: ViewParameters -> Timestamp -> Timestamp
36-
-> IM.IntMap String -> EventTree
42+
-> IM.IntMap Text -> EventTree
3743
-> Render ()
3844
renderInstantHEC params@ViewParameters{..} start end
3945
perfNames (EventTree ltime etime tree) = do
@@ -78,7 +84,7 @@ renderEvents :: ViewParameters
7884
-> Timestamp -- start time of this tree node
7985
-> Timestamp -- end time of this tree node
8086
-> Timestamp -> Timestamp -> Double
81-
-> IM.IntMap String -> EventNode
87+
-> IM.IntMap Text -> EventNode
8288
-> Render Bool
8389

8490
renderEvents params@ViewParameters{..} !_s !_e !startPos !endPos ewidth
@@ -200,7 +206,7 @@ drawDuration ViewParameters{..} (ThreadRun t s startTime endTime) = do
200206
-- Optionally write the reason for the thread being stopped
201207
-- depending on the zoom value
202208
labelAt labelsMode endTime $
203-
show t ++ " " ++ showThreadStopStatus s
209+
T.pack $ show t ++ " " ++ showThreadStopStatus s
204210
where
205211
rectWidth = truncate (fromIntegral (endTime - startTime) / scaleValue) -- as pixels
206212
tStr = show t
@@ -226,7 +232,7 @@ gcBar col !startTime !endTime = do
226232
(endTime - startTime) -- w
227233
(hecBarHeight `div` 2) -- h
228234

229-
labelAt :: Bool -> Timestamp -> String -> Render ()
235+
labelAt :: Bool -> Timestamp -> Text -> Render ()
230236
labelAt labelsMode t str
231237
| not labelsMode = return ()
232238
| otherwise = do
@@ -238,7 +244,7 @@ labelAt labelsMode t str
238244
showText str
239245
restore
240246

241-
drawEvent :: ViewParameters -> Double -> IM.IntMap String -> GHC.Event
247+
drawEvent :: ViewParameters -> Double -> IM.IntMap Text -> GHC.Event
242248
-> Render Bool
243249
drawEvent params@ViewParameters{..} ewidth perfNames event =
244250
let renderI = renderInstantEvent params perfNames event ewidth
@@ -270,24 +276,29 @@ drawEvent params@ViewParameters{..} ewidth perfNames event =
270276

271277
_ -> return False
272278

273-
renderInstantEvent :: ViewParameters -> IM.IntMap String -> GHC.Event
279+
renderInstantEvent :: ViewParameters -> IM.IntMap Text -> GHC.Event
274280
-> Double -> Color
275281
-> Render Bool
276282
renderInstantEvent ViewParameters{..} perfNames event ewidth color = do
277283
setSourceRGBAhex color 1.0
278284
setLineWidth (ewidth * scaleValue)
279285
let t = evTime event
280286
draw_line (t, hecBarOff-4) (t, hecBarOff+hecBarHeight+4)
281-
let numToLabel PerfCounter{perfNum, period} | period == 0 =
287+
let numToLabel :: EventInfo -> Maybe Text
288+
numToLabel PerfCounter{perfNum, period} | period == 0 =
282289
IM.lookup (fromIntegral perfNum) perfNames
283-
numToLabel PerfCounter{perfNum, period} =
284-
fmap (++ " <" ++ show (period + 1) ++ " times>") $
285-
IM.lookup (fromIntegral perfNum) perfNames
286-
numToLabel PerfTracepoint{perfNum} =
287-
fmap ("tracepoint: " ++) $ IM.lookup (fromIntegral perfNum) perfNames
290+
numToLabel PerfCounter{perfNum, period} = do
291+
name <- IM.lookup (fromIntegral perfNum) perfNames
292+
return $ toText $
293+
TB.fromText name <> " <" <> TB.decimal (period + 1) <> " times>"
294+
numToLabel PerfTracepoint{perfNum} = do
295+
name <- IM.lookup (fromIntegral perfNum) perfNames
296+
return $ toText $ "tracepoint: " <> TB.fromText name
288297
numToLabel _ = Nothing
289-
showLabel espec = fromMaybe (showEventInfo espec) (numToLabel espec)
298+
showLabel espec = fromMaybe (toText $ buildEventInfo espec) (numToLabel espec)
290299
labelAt labelsMode t $ showLabel (evSpec event)
291300
return True
301+
where
302+
toText = TL.toStrict . TB.toLazyText
292303

293304
-------------------------------------------------------------------------------

threadscope.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ Executable threadscope
5656
array < 0.6,
5757
mtl < 2.3,
5858
filepath < 1.5,
59-
ghc-events >= 0.5 && < 0.13,
59+
ghc-events >= 0.13 && < 0.14,
6060
containers >= 0.2 && < 0.7,
6161
deepseq >= 1.1,
6262
text < 1.3,

0 commit comments

Comments
 (0)