Skip to content

Commit a8fabd1

Browse files
committed
Memoize nextFreeDisplayThread to avoid excessive calls to HashMap.size
1 parent e7a5d79 commit a8fabd1

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

opentelemetry-extra/src/OpenTelemetry/EventlogStreaming_Internal.hs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ data State = S
4242
serial2sid :: HM.HashMap Word64 SpanId,
4343
thread2sid :: HM.HashMap ThreadId SpanId,
4444
thread2displayThread :: HM.HashMap ThreadId ThreadId, -- https://github.com/ethercrow/opentelemetry-haskell/issues/40
45+
nextFreeDisplayThread :: ThreadId,
4546
gcRequestedAt :: !Timestamp,
4647
gcStartedAt :: !Timestamp,
4748
gcGeneration :: !Int,
@@ -53,7 +54,7 @@ data State = S
5354
deriving (Show)
5455

5556
initialState :: Word64 -> R.SMGen -> State
56-
initialState timestamp = S timestamp mempty mempty mempty mempty mempty mempty mempty 0 0 0 0 0 0
57+
initialState timestamp = S timestamp mempty mempty mempty mempty mempty mempty mempty 1 0 0 0 0 0 0
5758

5859
data EventSource
5960
= EventLogHandle Handle WatDoOnEOF
@@ -162,14 +163,18 @@ processEvent (Event ts ev m_cap) st@S {..} =
162163
(st {cap2thread = IM.insert cap tid cap2thread}, [], [])
163164
(StopThread tid tstatus, Just cap, _)
164165
| isTerminalThreadStatus tstatus ->
165-
( st
166-
{ cap2thread = IM.delete cap cap2thread,
167-
traceMap = HM.delete tid traceMap,
168-
thread2displayThread = HM.delete tid thread2displayThread
169-
},
170-
[],
171-
[Metric threadsI [MetricDatapoint now (-1)]]
172-
)
166+
let (t2dt, nfdt) = case HM.lookup tid thread2displayThread of
167+
Nothing -> (thread2displayThread, nextFreeDisplayThread)
168+
Just _ -> (HM.delete tid thread2displayThread, nextFreeDisplayThread - 1)
169+
in ( st
170+
{ cap2thread = IM.delete cap cap2thread,
171+
traceMap = HM.delete tid traceMap,
172+
thread2displayThread = t2dt,
173+
nextFreeDisplayThread = nfdt
174+
},
175+
[],
176+
[Metric threadsI [MetricDatapoint now (-1)]]
177+
)
173178
(RequestSeqGC, _, _) ->
174179
(st {gcRequestedAt = now}, [], [])
175180
(RequestParGC, _, _) ->
@@ -405,11 +410,11 @@ inventSpanId serial st = (st', sid)
405410
st' = st {serial2sid = HM.insert serial sid serial2sid, randomGen = randomGen'}
406411

407412
inventDisplayTid :: ThreadId -> State -> (State, ThreadId)
408-
inventDisplayTid tid st@(S {thread2displayThread}) =
413+
inventDisplayTid tid st@(S {thread2displayThread, nextFreeDisplayThread}) =
409414
case HM.lookup tid thread2displayThread of
410415
Nothing ->
411-
let new_dtid = fromIntegral (HM.size thread2displayThread)
412-
in (st {thread2displayThread = HM.insert tid new_dtid thread2displayThread}, new_dtid)
416+
let new_dtid = nextFreeDisplayThread
417+
in (st {thread2displayThread = HM.insert tid new_dtid thread2displayThread, nextFreeDisplayThread = new_dtid + 1}, new_dtid)
413418
Just dtid -> (st, dtid)
414419

415420
parseText :: [T.Text] -> Maybe OpenTelemetryEventlogEvent

0 commit comments

Comments
 (0)