Skip to content

Commit e417d97

Browse files
authored
Merge pull request #107 from maoe/ghc-events-unicode
Update ghc-events to 0.13.0
2 parents 1ab567f + 849add1 commit e417d97

File tree

8 files changed

+76
-50
lines changed

8 files changed

+76
-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: 16 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,
@@ -18,9 +19,14 @@ import qualified GUI.GtkExtras as GtkExt
1819

1920
import Control.Monad.Reader
2021
import Data.Array
22+
import Data.Monoid
2123
import Data.IORef
2224
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)
2328
import Numeric
29+
import Prelude
2430

2531
-------------------------------------------------------------------------------
2632

@@ -55,8 +61,8 @@ eventsViewNew builder EventsViewActions{..} = do
5561
stateRef <- newIORef undefined
5662

5763
let getWidget cast = builderGetObject builder cast
58-
drawArea <- getWidget castToWidget "eventsDrawingArea"
59-
vScrollbar <- getWidget castToVScrollbar "eventsVScroll"
64+
drawArea <- getWidget castToWidget ("eventsDrawingArea" :: T.Text)
65+
vScrollbar <- getWidget castToVScrollbar ("eventsVScroll" :: T.Text)
6066
adj <- get vScrollbar rangeAdjustment
6167

6268
-- make the background white
@@ -339,16 +345,14 @@ drawEvents EventsView{drawArea, adj}
339345
where
340346
showEventTime (Event time _spec _) =
341347
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
348+
showEventDescr :: Event -> T.Text
349+
showEventDescr (Event _time spec cap) = TL.toStrict $ TB.toLazyText $
350+
maybe "" (\c -> "HEC " <> TB.decimal c <> ": ") cap
351+
<> case spec of
352+
UnknownEvent{ref} -> "unknown event; " <> TB.decimal ref
353+
Message msg -> TB.fromText msg
354+
UserMessage msg -> TB.fromText msg
355+
_ -> buildEventInfo spec
352356

353357
-------------------------------------------------------------------------------
354358

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: 27 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,16 @@ 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.Monoid
24+
import Data.Text (Text)
25+
import qualified Data.Text as T
26+
import qualified Data.Text.Lazy as TL
27+
import qualified Data.Text.Lazy.Builder as TB
28+
import qualified Data.Text.Lazy.Builder.Int as TB (decimal)
29+
import Prelude
2230

2331
renderHEC :: ViewParameters -> Timestamp -> Timestamp
24-
-> IM.IntMap String -> (DurationTree,EventTree)
32+
-> IM.IntMap Text -> (DurationTree,EventTree)
2533
-> Render ()
2634
renderHEC params@ViewParameters{..} start end perfNames (dtree,etree) = do
2735
renderDurations params start end dtree
@@ -33,7 +41,7 @@ renderHEC params@ViewParameters{..} start end perfNames (dtree,etree) = do
3341
return ()
3442

3543
renderInstantHEC :: ViewParameters -> Timestamp -> Timestamp
36-
-> IM.IntMap String -> EventTree
44+
-> IM.IntMap Text -> EventTree
3745
-> Render ()
3846
renderInstantHEC params@ViewParameters{..} start end
3947
perfNames (EventTree ltime etime tree) = do
@@ -78,7 +86,7 @@ renderEvents :: ViewParameters
7886
-> Timestamp -- start time of this tree node
7987
-> Timestamp -- end time of this tree node
8088
-> Timestamp -> Timestamp -> Double
81-
-> IM.IntMap String -> EventNode
89+
-> IM.IntMap Text -> EventNode
8290
-> Render Bool
8391

8492
renderEvents params@ViewParameters{..} !_s !_e !startPos !endPos ewidth
@@ -200,7 +208,7 @@ drawDuration ViewParameters{..} (ThreadRun t s startTime endTime) = do
200208
-- Optionally write the reason for the thread being stopped
201209
-- depending on the zoom value
202210
labelAt labelsMode endTime $
203-
show t ++ " " ++ showThreadStopStatus s
211+
T.pack $ show t ++ " " ++ showThreadStopStatus s
204212
where
205213
rectWidth = truncate (fromIntegral (endTime - startTime) / scaleValue) -- as pixels
206214
tStr = show t
@@ -226,7 +234,7 @@ gcBar col !startTime !endTime = do
226234
(endTime - startTime) -- w
227235
(hecBarHeight `div` 2) -- h
228236

229-
labelAt :: Bool -> Timestamp -> String -> Render ()
237+
labelAt :: Bool -> Timestamp -> Text -> Render ()
230238
labelAt labelsMode t str
231239
| not labelsMode = return ()
232240
| otherwise = do
@@ -238,7 +246,7 @@ labelAt labelsMode t str
238246
showText str
239247
restore
240248

241-
drawEvent :: ViewParameters -> Double -> IM.IntMap String -> GHC.Event
249+
drawEvent :: ViewParameters -> Double -> IM.IntMap Text -> GHC.Event
242250
-> Render Bool
243251
drawEvent params@ViewParameters{..} ewidth perfNames event =
244252
let renderI = renderInstantEvent params perfNames event ewidth
@@ -270,24 +278,29 @@ drawEvent params@ViewParameters{..} ewidth perfNames event =
270278

271279
_ -> return False
272280

273-
renderInstantEvent :: ViewParameters -> IM.IntMap String -> GHC.Event
281+
renderInstantEvent :: ViewParameters -> IM.IntMap Text -> GHC.Event
274282
-> Double -> Color
275283
-> Render Bool
276284
renderInstantEvent ViewParameters{..} perfNames event ewidth color = do
277285
setSourceRGBAhex color 1.0
278286
setLineWidth (ewidth * scaleValue)
279287
let t = evTime event
280288
draw_line (t, hecBarOff-4) (t, hecBarOff+hecBarHeight+4)
281-
let numToLabel PerfCounter{perfNum, period} | period == 0 =
289+
let numToLabel :: EventInfo -> Maybe Text
290+
numToLabel PerfCounter{perfNum, period} | period == 0 =
282291
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
292+
numToLabel PerfCounter{perfNum, period} = do
293+
name <- IM.lookup (fromIntegral perfNum) perfNames
294+
return $ toText $
295+
TB.fromText name <> " <" <> TB.decimal (period + 1) <> " times>"
296+
numToLabel PerfTracepoint{perfNum} = do
297+
name <- IM.lookup (fromIntegral perfNum) perfNames
298+
return $ toText $ "tracepoint: " <> TB.fromText name
288299
numToLabel _ = Nothing
289-
showLabel espec = fromMaybe (showEventInfo espec) (numToLabel espec)
300+
showLabel espec = fromMaybe (toText $ buildEventInfo espec) (numToLabel espec)
290301
labelAt labelsMode t $ showLabel (evSpec event)
291302
return True
303+
where
304+
toText = TL.toStrict . TB.toLazyText
292305

293306
-------------------------------------------------------------------------------

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)