@@ -21,22 +21,22 @@ import (
2121 "github.com/maruel/panicparse/v2/stack"
2222)
2323
24- // Write writes buckets as HTML to the writer.
25- func Write (w io.Writer , buckets []* stack.Bucket , needsEnv , live bool ) error {
24+ // WriteBuckets writes buckets as HTML to the writer.
25+ func WriteBuckets (w io.Writer , buckets []* stack.Bucket , needsEnv , live bool ) error {
2626 m := template.FuncMap {
27- "funcClass" : funcClass ,
28- "minus" : minus ,
29- "pkgURL" : pkgURL ,
30- "srcURL" : srcURL ,
31- "symbol" : symbol ,
27+ "bucketClass" : func (bucket * stack.Bucket ) template.HTML { return "Routine" },
28+ "funcClass" : funcClass ,
29+ "minus" : minus ,
30+ "pkgURL" : pkgURL ,
31+ "routineClass" : func (bucket * stack.Goroutine ) template.HTML { return "Routine" },
32+ "srcURL" : srcURL ,
33+ "symbol" : symbol ,
3234 // Needs to be a function and not a variable, otherwise it is not
3335 // accessible inside inner templates.
3436 "isDebug" : isDebug ,
3537 }
3638 if len (buckets ) > 1 {
37- m ["routineClass" ] = routineClass
38- } else {
39- m ["routineClass" ] = func (bucket * stack.Bucket ) template.HTML { return "Routine" }
39+ m ["bucketClass" ] = bucketClass
4040 }
4141 t , err := template .New ("t" ).Funcs (m ).Parse (indexHTML )
4242 if err != nil {
@@ -56,6 +56,41 @@ func Write(w io.Writer, buckets []*stack.Bucket, needsEnv, live bool) error {
5656 return t .Execute (w , data )
5757}
5858
59+ // WriteGoroutines writes a race as HTML to the writer.
60+ func WriteGoroutines (w io.Writer , goroutines []* stack.Goroutine , needsEnv , live bool ) error {
61+ m := template.FuncMap {
62+ "bucketClass" : func (bucket * stack.Bucket ) template.HTML { return "Routine" },
63+ "funcClass" : funcClass ,
64+ "minus" : minus ,
65+ "pkgURL" : pkgURL ,
66+ "srcURL" : srcURL ,
67+ "symbol" : symbol ,
68+ "routineClass" : func (bucket * stack.Goroutine ) template.HTML { return "Routine" },
69+ // Needs to be a function and not a variable, otherwise it is not
70+ // accessible inside inner templates.
71+ "isDebug" : isDebug ,
72+ }
73+ if len (goroutines ) > 1 {
74+ m ["routineClass" ] = routineClass
75+ }
76+ t , err := template .New ("t" ).Funcs (m ).Parse (indexHTML )
77+ if err != nil {
78+ return err
79+ }
80+ data := map [string ]interface {}{
81+ "Routines" : goroutines ,
82+ "Favicon" : favicon ,
83+ "GOMAXPROCS" : runtime .GOMAXPROCS (0 ),
84+ "GOPATH" : os .Getenv ("GOPATH" ),
85+ "GOROOT" : runtime .GOROOT (),
86+ "Live" : live ,
87+ "NeedsEnv" : needsEnv ,
88+ "Now" : time .Now ().Truncate (time .Second ),
89+ "Version" : runtime .Version (),
90+ }
91+ return t .Execute (w , data )
92+ }
93+
5994//
6095
6196var reMethodSymbol = regexp .MustCompile (`^\(\*?([^)]+)\)(\..+)$` )
@@ -232,7 +267,14 @@ func symbol(f *stack.Func) template.URL {
232267 return template .URL (url .QueryEscape (s ))
233268}
234269
235- func routineClass (bucket * stack.Bucket ) template.HTML {
270+ func bucketClass (bucket * stack.Bucket ) template.HTML {
271+ if bucket .First {
272+ return "RoutineFirst"
273+ }
274+ return "Routine"
275+ }
276+
277+ func routineClass (bucket * stack.Goroutine ) template.HTML {
236278 if bucket .First {
237279 return "RoutineFirst"
238280 }
0 commit comments