Skip to content

Commit a4ef655

Browse files
mknyszekgopherbot
authored andcommitted
internal/trace: move SchedReqs out of events package
It's only used by order.go; there's no reason for it to be in a shared package. Change-Id: If99df075089e6f6e37a78b12e64a1b81a556331c Reviewed-on: https://go-review.googlesource.com/c/go/+/644216 Auto-Submit: Michael Knyszek <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Michael Pratt <[email protected]>
1 parent ca1cfea commit a4ef655

File tree

2 files changed

+54
-59
lines changed

2 files changed

+54
-59
lines changed

src/internal/trace/event/requirements.go

-26
This file was deleted.

src/internal/trace/order.go

+54-33
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ func (o *ordering) advanceProcStart(ev *baseEvent, evt *evTable, m ThreadID, gen
246246
// We can advance this P. Check some invariants.
247247
//
248248
// We might have a goroutine if a goroutine is exiting a syscall.
249-
reqs := event.SchedReqs{Thread: event.MustHave, Proc: event.MustNotHave, Goroutine: event.MayHave}
249+
reqs := schedReqs{M: mustHave, P: mustNotHave, G: mayHave}
250250
if err := validateCtx(curCtx, reqs); err != nil {
251251
return curCtx, false, err
252252
}
@@ -275,7 +275,7 @@ func (o *ordering) advanceProcStop(ev *baseEvent, evt *evTable, m ThreadID, gen
275275
if state.status != go122.ProcRunning && state.status != go122.ProcSyscall {
276276
return curCtx, false, fmt.Errorf("%s event for proc that's not %s or %s", go122.EventString(ev.typ), go122.ProcRunning, go122.ProcSyscall)
277277
}
278-
reqs := event.SchedReqs{Thread: event.MustHave, Proc: event.MustHave, Goroutine: event.MayHave}
278+
reqs := schedReqs{M: mustHave, P: mustHave, G: mayHave}
279279
if err := validateCtx(curCtx, reqs); err != nil {
280280
return curCtx, false, err
281281
}
@@ -297,7 +297,7 @@ func (o *ordering) advanceProcSteal(ev *baseEvent, evt *evTable, m ThreadID, gen
297297
return curCtx, false, nil
298298
}
299299
// We can advance this P. Check some invariants.
300-
reqs := event.SchedReqs{Thread: event.MustHave, Proc: event.MayHave, Goroutine: event.MayHave}
300+
reqs := schedReqs{M: mustHave, P: mayHave, G: mayHave}
301301
if err := validateCtx(curCtx, reqs); err != nil {
302302
return curCtx, false, err
303303
}
@@ -437,7 +437,7 @@ func (o *ordering) advanceGoStatus(ev *baseEvent, evt *evTable, m ThreadID, gen
437437
func (o *ordering) advanceGoCreate(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
438438
// Goroutines must be created on a running P, but may or may not be created
439439
// by a running goroutine.
440-
reqs := event.SchedReqs{Thread: event.MustHave, Proc: event.MustHave, Goroutine: event.MayHave}
440+
reqs := schedReqs{M: mustHave, P: mustHave, G: mayHave}
441441
if err := validateCtx(curCtx, reqs); err != nil {
442442
return curCtx, false, err
443443
}
@@ -463,7 +463,7 @@ func (o *ordering) advanceGoStopExec(ev *baseEvent, evt *evTable, m ThreadID, ge
463463
// These are goroutine events that all require an active running
464464
// goroutine on some thread. They must *always* be advance-able,
465465
// since running goroutines are bound to their M.
466-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
466+
if err := validateCtx(curCtx, userGoReqs); err != nil {
467467
return curCtx, false, err
468468
}
469469
state, ok := o.gStates[curCtx.G]
@@ -505,7 +505,7 @@ func (o *ordering) advanceGoStart(ev *baseEvent, evt *evTable, m ThreadID, gen u
505505
return curCtx, false, nil
506506
}
507507
// We can advance this goroutine. Check some invariants.
508-
reqs := event.SchedReqs{Thread: event.MustHave, Proc: event.MustHave, Goroutine: event.MustNotHave}
508+
reqs := schedReqs{M: mustHave, P: mustHave, G: mustNotHave}
509509
if err := validateCtx(curCtx, reqs); err != nil {
510510
return curCtx, false, err
511511
}
@@ -546,7 +546,7 @@ func (o *ordering) advanceGoSwitch(ev *baseEvent, evt *evTable, m ThreadID, gen
546546
// only advance it if the sequence numbers line up.
547547
//
548548
// The current goroutine on the thread must be actively running.
549-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
549+
if err := validateCtx(curCtx, userGoReqs); err != nil {
550550
return curCtx, false, err
551551
}
552552
curGState, ok := o.gStates[curCtx.G]
@@ -601,7 +601,7 @@ func (o *ordering) advanceGoSwitch(ev *baseEvent, evt *evTable, m ThreadID, gen
601601
func (o *ordering) advanceGoSyscallBegin(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
602602
// Entering a syscall requires an active running goroutine with a
603603
// proc on some thread. It is always advancable.
604-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
604+
if err := validateCtx(curCtx, userGoReqs); err != nil {
605605
return curCtx, false, err
606606
}
607607
state, ok := o.gStates[curCtx.G]
@@ -642,7 +642,7 @@ func (o *ordering) advanceGoSyscallEnd(ev *baseEvent, evt *evTable, m ThreadID,
642642
// This event is always advance-able because it happens on the same
643643
// thread that EvGoSyscallStart happened, and the goroutine can't leave
644644
// that thread until its done.
645-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
645+
if err := validateCtx(curCtx, userGoReqs); err != nil {
646646
return curCtx, false, err
647647
}
648648
state, ok := o.gStates[curCtx.G]
@@ -689,7 +689,7 @@ func (o *ordering) advanceGoSyscallEndBlocked(ev *baseEvent, evt *evTable, m Thr
689689
}
690690
// As mentioned above, we may have a P here if we ProcStart
691691
// before this event.
692-
if err := validateCtx(curCtx, event.SchedReqs{Thread: event.MustHave, Proc: event.MayHave, Goroutine: event.MustHave}); err != nil {
692+
if err := validateCtx(curCtx, schedReqs{M: mustHave, P: mayHave, G: mustHave}); err != nil {
693693
return curCtx, false, err
694694
}
695695
state, ok := o.gStates[curCtx.G]
@@ -710,7 +710,7 @@ func (o *ordering) advanceGoCreateSyscall(ev *baseEvent, evt *evTable, m ThreadI
710710
// This event indicates that a goroutine is effectively
711711
// being created out of a cgo callback. Such a goroutine
712712
// is 'created' in the syscall state.
713-
if err := validateCtx(curCtx, event.SchedReqs{Thread: event.MustHave, Proc: event.MayHave, Goroutine: event.MustNotHave}); err != nil {
713+
if err := validateCtx(curCtx, schedReqs{M: mustHave, P: mayHave, G: mustNotHave}); err != nil {
714714
return curCtx, false, err
715715
}
716716
// This goroutine is effectively being created. Add a state for it.
@@ -743,7 +743,7 @@ func (o *ordering) advanceGoDestroySyscall(ev *baseEvent, evt *evTable, m Thread
743743
// Note: we might have a P here. The P might not be released
744744
// eagerly by the runtime, and it might get stolen back later
745745
// (or never again, if the program is going to exit).
746-
if err := validateCtx(curCtx, event.SchedReqs{Thread: event.MustHave, Proc: event.MayHave, Goroutine: event.MustHave}); err != nil {
746+
if err := validateCtx(curCtx, schedReqs{M: mustHave, P: mayHave, G: mustHave}); err != nil {
747747
return curCtx, false, err
748748
}
749749
// Check to make sure the goroutine exists in the right state.
@@ -812,7 +812,7 @@ func (o *ordering) advanceUserTaskBegin(ev *baseEvent, evt *evTable, m ThreadID,
812812
return curCtx, false, fmt.Errorf("invalid string ID %v for %v event", nameID, ev.typ)
813813
}
814814
o.activeTasks[id] = taskState{name: name, parentID: parentID}
815-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
815+
if err := validateCtx(curCtx, userGoReqs); err != nil {
816816
return curCtx, false, err
817817
}
818818
o.queue.push(Event{table: evt, ctx: curCtx, base: *ev})
@@ -833,15 +833,15 @@ func (o *ordering) advanceUserTaskEnd(ev *baseEvent, evt *evTable, m ThreadID, g
833833
ev.extra(version.Go122)[0] = uint64(NoTask)
834834
ev.extra(version.Go122)[1] = uint64(evt.addExtraString(""))
835835
}
836-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
836+
if err := validateCtx(curCtx, userGoReqs); err != nil {
837837
return curCtx, false, err
838838
}
839839
o.queue.push(Event{table: evt, ctx: curCtx, base: *ev})
840840
return curCtx, true, nil
841841
}
842842

843843
func (o *ordering) advanceUserRegionBegin(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
844-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
844+
if err := validateCtx(curCtx, userGoReqs); err != nil {
845845
return curCtx, false, err
846846
}
847847
tid := TaskID(ev.args[0])
@@ -862,7 +862,7 @@ func (o *ordering) advanceUserRegionBegin(ev *baseEvent, evt *evTable, m ThreadI
862862
}
863863

864864
func (o *ordering) advanceUserRegionEnd(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
865-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
865+
if err := validateCtx(curCtx, userGoReqs); err != nil {
866866
return curCtx, false, err
867867
}
868868
tid := TaskID(ev.args[0])
@@ -908,7 +908,7 @@ func (o *ordering) advanceGCActive(ev *baseEvent, evt *evTable, m ThreadID, gen
908908
return curCtx, false, fmt.Errorf("encountered GCActive while GC was not in progress")
909909
}
910910
o.gcSeq = seq
911-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
911+
if err := validateCtx(curCtx, userGoReqs); err != nil {
912912
return curCtx, false, err
913913
}
914914
o.queue.push(Event{table: evt, ctx: curCtx, base: *ev})
@@ -932,7 +932,7 @@ func (o *ordering) advanceGCBegin(ev *baseEvent, evt *evTable, m ThreadID, gen u
932932
}
933933
o.gcSeq = seq
934934
o.gcState = gcRunning
935-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
935+
if err := validateCtx(curCtx, userGoReqs); err != nil {
936936
return curCtx, false, err
937937
}
938938
o.queue.push(Event{table: evt, ctx: curCtx, base: *ev})
@@ -953,7 +953,7 @@ func (o *ordering) advanceGCEnd(ev *baseEvent, evt *evTable, m ThreadID, gen uin
953953
}
954954
o.gcSeq = seq
955955
o.gcState = gcNotRunning
956-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
956+
if err := validateCtx(curCtx, userGoReqs); err != nil {
957957
return curCtx, false, err
958958
}
959959
o.queue.push(Event{table: evt, ctx: curCtx, base: *ev})
@@ -962,7 +962,7 @@ func (o *ordering) advanceGCEnd(ev *baseEvent, evt *evTable, m ThreadID, gen uin
962962

963963
func (o *ordering) advanceAnnotation(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
964964
// Handle simple instantaneous events that require a G.
965-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
965+
if err := validateCtx(curCtx, userGoReqs); err != nil {
966966
return curCtx, false, err
967967
}
968968
o.queue.push(Event{table: evt, ctx: curCtx, base: *ev})
@@ -971,7 +971,7 @@ func (o *ordering) advanceAnnotation(ev *baseEvent, evt *evTable, m ThreadID, ge
971971

972972
func (o *ordering) advanceHeapMetric(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
973973
// Handle allocation metrics, which don't require a G.
974-
if err := validateCtx(curCtx, event.SchedReqs{Thread: event.MustHave, Proc: event.MustHave, Goroutine: event.MayHave}); err != nil {
974+
if err := validateCtx(curCtx, schedReqs{M: mustHave, P: mustHave, G: mayHave}); err != nil {
975975
return curCtx, false, err
976976
}
977977
o.queue.push(Event{table: evt, ctx: curCtx, base: *ev})
@@ -980,7 +980,7 @@ func (o *ordering) advanceHeapMetric(ev *baseEvent, evt *evTable, m ThreadID, ge
980980

981981
func (o *ordering) advanceGCSweepBegin(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
982982
// Handle sweep, which is bound to a P and doesn't require a G.
983-
if err := validateCtx(curCtx, event.SchedReqs{Thread: event.MustHave, Proc: event.MustHave, Goroutine: event.MayHave}); err != nil {
983+
if err := validateCtx(curCtx, schedReqs{M: mustHave, P: mustHave, G: mayHave}); err != nil {
984984
return curCtx, false, err
985985
}
986986
if err := o.pStates[curCtx.P].beginRange(makeRangeType(ev.typ, 0)); err != nil {
@@ -1008,7 +1008,7 @@ func (o *ordering) advanceGCSweepActive(ev *baseEvent, evt *evTable, m ThreadID,
10081008
}
10091009

10101010
func (o *ordering) advanceGCSweepEnd(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
1011-
if err := validateCtx(curCtx, event.SchedReqs{Thread: event.MustHave, Proc: event.MustHave, Goroutine: event.MayHave}); err != nil {
1011+
if err := validateCtx(curCtx, schedReqs{M: mustHave, P: mustHave, G: mayHave}); err != nil {
10121012
return curCtx, false, err
10131013
}
10141014
_, err := o.pStates[curCtx.P].endRange(ev.typ)
@@ -1021,7 +1021,7 @@ func (o *ordering) advanceGCSweepEnd(ev *baseEvent, evt *evTable, m ThreadID, ge
10211021

10221022
func (o *ordering) advanceGoRangeBegin(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
10231023
// Handle special goroutine-bound event ranges.
1024-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
1024+
if err := validateCtx(curCtx, userGoReqs); err != nil {
10251025
return curCtx, false, err
10261026
}
10271027
desc := stringID(0)
@@ -1056,7 +1056,7 @@ func (o *ordering) advanceGoRangeActive(ev *baseEvent, evt *evTable, m ThreadID,
10561056
}
10571057

10581058
func (o *ordering) advanceGoRangeEnd(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
1059-
if err := validateCtx(curCtx, event.UserGoReqs); err != nil {
1059+
if err := validateCtx(curCtx, userGoReqs); err != nil {
10601060
return curCtx, false, err
10611061
}
10621062
gState, ok := o.gStates[curCtx.G]
@@ -1078,7 +1078,7 @@ func (o *ordering) advanceGoRangeEnd(ev *baseEvent, evt *evTable, m ThreadID, ge
10781078

10791079
func (o *ordering) advanceAllocFree(ev *baseEvent, evt *evTable, m ThreadID, gen uint64, curCtx schedCtx) (schedCtx, bool, error) {
10801080
// Handle simple instantaneous events that may or may not have a P.
1081-
if err := validateCtx(curCtx, event.SchedReqs{Thread: event.MustHave, Proc: event.MayHave, Goroutine: event.MayHave}); err != nil {
1081+
if err := validateCtx(curCtx, schedReqs{M: mustHave, P: mayHave, G: mayHave}); err != nil {
10821082
return curCtx, false, err
10831083
}
10841084
o.queue.push(Event{table: evt, ctx: curCtx, base: *ev})
@@ -1099,25 +1099,25 @@ type schedCtx struct {
10991099

11001100
// validateCtx ensures that ctx conforms to some reqs, returning an error if
11011101
// it doesn't.
1102-
func validateCtx(ctx schedCtx, reqs event.SchedReqs) error {
1102+
func validateCtx(ctx schedCtx, reqs schedReqs) error {
11031103
// Check thread requirements.
1104-
if reqs.Thread == event.MustHave && ctx.M == NoThread {
1104+
if reqs.M == mustHave && ctx.M == NoThread {
11051105
return fmt.Errorf("expected a thread but didn't have one")
1106-
} else if reqs.Thread == event.MustNotHave && ctx.M != NoThread {
1106+
} else if reqs.M == mustNotHave && ctx.M != NoThread {
11071107
return fmt.Errorf("expected no thread but had one")
11081108
}
11091109

11101110
// Check proc requirements.
1111-
if reqs.Proc == event.MustHave && ctx.P == NoProc {
1111+
if reqs.P == mustHave && ctx.P == NoProc {
11121112
return fmt.Errorf("expected a proc but didn't have one")
1113-
} else if reqs.Proc == event.MustNotHave && ctx.P != NoProc {
1113+
} else if reqs.P == mustNotHave && ctx.P != NoProc {
11141114
return fmt.Errorf("expected no proc but had one")
11151115
}
11161116

11171117
// Check goroutine requirements.
1118-
if reqs.Goroutine == event.MustHave && ctx.G == NoGoroutine {
1118+
if reqs.G == mustHave && ctx.G == NoGoroutine {
11191119
return fmt.Errorf("expected a goroutine but didn't have one")
1120-
} else if reqs.Goroutine == event.MustNotHave && ctx.G != NoGoroutine {
1120+
} else if reqs.G == mustNotHave && ctx.G != NoGoroutine {
11211121
return fmt.Errorf("expected no goroutine but had one")
11221122
}
11231123
return nil
@@ -1393,3 +1393,24 @@ func makeEvent(table *evTable, ctx schedCtx, typ event.Type, time Time, args ...
13931393
copy(ev.base.args[:], args)
13941394
return ev
13951395
}
1396+
1397+
// schedReqs is a set of constraints on what the scheduling
1398+
// context must look like.
1399+
type schedReqs struct {
1400+
M constraint
1401+
P constraint
1402+
G constraint
1403+
}
1404+
1405+
// constraint represents a various presence requirements.
1406+
type constraint uint8
1407+
1408+
const (
1409+
mustNotHave constraint = iota
1410+
mayHave
1411+
mustHave
1412+
)
1413+
1414+
// userGoReqs is a common requirement among events that are running
1415+
// or are close to running user code.
1416+
var userGoReqs = schedReqs{M: mustHave, P: mustHave, G: mustHave}

0 commit comments

Comments
 (0)