@@ -161,6 +161,14 @@ var trace struct {
161161 buf traceBufPtr // global trace buffer, used when running without a p
162162}
163163
164+ // gTraceState is per-G state for the tracer.
165+ type gTraceState struct {
166+ sysExitTicks int64 // cputicks when syscall has returned
167+ sysBlockTraced bool // StartTrace has emitted EvGoInSyscall about this goroutine
168+ seq uint64 // trace event sequencer
169+ lastP puintptr // last P emitted an event for this goroutine
170+ }
171+
164172// traceLockInit initializes global trace locks.
165173func traceLockInit () {
166174 lockInit (& trace .bufLock , lockRankTraceBuf )
@@ -269,33 +277,33 @@ func StartTrace() error {
269277 forEachGRace (func (gp * g ) {
270278 status := readgstatus (gp )
271279 if status != _Gdead {
272- gp .traceseq = 0
273- gp .tracelastp = getg ().m .p
280+ gp .trace . seq = 0
281+ gp .trace . lastP = getg ().m .p
274282 // +PCQuantum because traceFrameForPC expects return PCs and subtracts PCQuantum.
275283 id := trace .stackTab .put ([]uintptr {logicalStackSentinel , startPCforTrace (gp .startpc ) + sys .PCQuantum })
276284 traceEvent (traceEvGoCreate , - 1 , gp .goid , uint64 (id ), stackID )
277285 }
278286 if status == _Gwaiting {
279287 // traceEvGoWaiting is implied to have seq=1.
280- gp .traceseq ++
288+ gp .trace . seq ++
281289 traceEvent (traceEvGoWaiting , - 1 , gp .goid )
282290 }
283291 if status == _Gsyscall {
284- gp .traceseq ++
292+ gp .trace . seq ++
285293 traceEvent (traceEvGoInSyscall , - 1 , gp .goid )
286294 } else if status == _Gdead && gp .m != nil && gp .m .isextra {
287295 // Trigger two trace events for the dead g in the extra m,
288296 // since the next event of the g will be traceEvGoSysExit in exitsyscall,
289297 // while calling from C thread to Go.
290- gp .traceseq = 0
291- gp .tracelastp = getg ().m .p
298+ gp .trace . seq = 0
299+ gp .trace . lastP = getg ().m .p
292300 // +PCQuantum because traceFrameForPC expects return PCs and subtracts PCQuantum.
293301 id := trace .stackTab .put ([]uintptr {logicalStackSentinel , startPCforTrace (0 ) + sys .PCQuantum }) // no start pc
294302 traceEvent (traceEvGoCreate , - 1 , gp .goid , uint64 (id ), stackID )
295- gp .traceseq ++
303+ gp .trace . seq ++
296304 traceEvent (traceEvGoInSyscall , - 1 , gp .goid )
297305 } else {
298- gp .sysblocktraced = false
306+ gp .trace . sysBlockTraced = false
299307 }
300308 })
301309 traceProcStart ()
@@ -1507,8 +1515,8 @@ func traceGCMarkAssistDone() {
15071515}
15081516
15091517func traceGoCreate (newg * g , pc uintptr ) {
1510- newg .traceseq = 0
1511- newg .tracelastp = getg ().m .p
1518+ newg .trace . seq = 0
1519+ newg .trace . lastP = getg ().m .p
15121520 // +PCQuantum because traceFrameForPC expects return PCs and subtracts PCQuantum.
15131521 id := trace .stackTab .put ([]uintptr {logicalStackSentinel , startPCforTrace (pc ) + sys .PCQuantum })
15141522 traceEvent (traceEvGoCreate , 2 , newg .goid , uint64 (id ))
@@ -1517,14 +1525,14 @@ func traceGoCreate(newg *g, pc uintptr) {
15171525func traceGoStart () {
15181526 gp := getg ().m .curg
15191527 pp := gp .m .p
1520- gp .traceseq ++
1528+ gp .trace . seq ++
15211529 if pp .ptr ().gcMarkWorkerMode != gcMarkWorkerNotWorker {
1522- traceEvent (traceEvGoStartLabel , - 1 , gp .goid , gp .traceseq , trace .markWorkerLabels [pp .ptr ().gcMarkWorkerMode ])
1523- } else if gp .tracelastp == pp {
1530+ traceEvent (traceEvGoStartLabel , - 1 , gp .goid , gp .trace . seq , trace .markWorkerLabels [pp .ptr ().gcMarkWorkerMode ])
1531+ } else if gp .trace . lastP == pp {
15241532 traceEvent (traceEvGoStartLocal , - 1 , gp .goid )
15251533 } else {
1526- gp .tracelastp = pp
1527- traceEvent (traceEvGoStart , - 1 , gp .goid , gp .traceseq )
1534+ gp .trace . lastP = pp
1535+ traceEvent (traceEvGoStart , - 1 , gp .goid , gp .trace . seq )
15281536 }
15291537}
15301538
@@ -1534,13 +1542,13 @@ func traceGoEnd() {
15341542
15351543func traceGoSched () {
15361544 gp := getg ()
1537- gp .tracelastp = gp .m .p
1545+ gp .trace . lastP = gp .m .p
15381546 traceEvent (traceEvGoSched , 1 )
15391547}
15401548
15411549func traceGoPreempt () {
15421550 gp := getg ()
1543- gp .tracelastp = gp .m .p
1551+ gp .trace . lastP = gp .m .p
15441552 traceEvent (traceEvGoPreempt , 1 )
15451553}
15461554
@@ -1550,12 +1558,12 @@ func traceGoPark(traceEv byte, skip int) {
15501558
15511559func traceGoUnpark (gp * g , skip int ) {
15521560 pp := getg ().m .p
1553- gp .traceseq ++
1554- if gp .tracelastp == pp {
1561+ gp .trace . seq ++
1562+ if gp .trace . lastP == pp {
15551563 traceEvent (traceEvGoUnblockLocal , skip , gp .goid )
15561564 } else {
1557- gp .tracelastp = pp
1558- traceEvent (traceEvGoUnblock , skip , gp .goid , gp .traceseq )
1565+ gp .trace . lastP = pp
1566+ traceEvent (traceEvGoUnblock , skip , gp .goid , gp .trace . seq )
15591567 }
15601568}
15611569
@@ -1593,9 +1601,9 @@ func traceGoSysExit(ts int64) {
15931601 ts = 0
15941602 }
15951603 gp := getg ().m .curg
1596- gp .traceseq ++
1597- gp .tracelastp = gp .m .p
1598- traceEvent (traceEvGoSysExit , - 1 , gp .goid , gp .traceseq , uint64 (ts )/ traceTickDiv )
1604+ gp .trace . seq ++
1605+ gp .trace . lastP = gp .m .p
1606+ traceEvent (traceEvGoSysExit , - 1 , gp .goid , gp .trace . seq , uint64 (ts )/ traceTickDiv )
15991607}
16001608
16011609func traceGoSysBlock (pp * p ) {
@@ -1723,6 +1731,6 @@ func traceOneNewExtraM(gp *g) {
17231731 // since the next event of the g will be traceEvGoSysExit in exitsyscall,
17241732 // while calling from C thread to Go.
17251733 traceGoCreate (gp , 0 ) // no start pc
1726- gp .traceseq ++
1734+ gp .trace . seq ++
17271735 traceEvent (traceEvGoInSyscall , - 1 , gp .goid )
17281736}
0 commit comments