forked from davecheney/gcvis
/
main.go
81 lines (63 loc) · 1.48 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// gzvis is a tool to assist you visualising the operation of
// the go runtime garbage collector.
//
// usage:
//
// gcvis program [arguments]...
package main
import (
"flag"
"fmt"
"log"
"net"
"net/http"
"os"
"strings"
"github.com/pkg/browser"
)
var gcvisGraph Graph
func indexHandler(w http.ResponseWriter, req *http.Request) {
gcvisGraph.write(w)
}
var iface = flag.String("i", "127.0.0.1", "specify interface to use. defaults to 127.0.0.1.")
func main() {
var err error
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage of %s: command <args>...\n", os.Args[0])
flag.PrintDefaults()
}
flag.Parse()
if len(flag.Args()) < 1 {
flag.Usage()
return
}
ifaceAndPort := fmt.Sprintf("%v:0", *iface)
listener, err := net.Listen("tcp4", ifaceAndPort)
if err != nil {
log.Fatal(err)
}
pr, pw, _ := os.Pipe()
gcChan := make(chan *gctrace, 1)
scvgChan := make(chan *scvgtrace, 1)
parser := Parser{
reader: pr,
gcChan: gcChan,
scvgChan: scvgChan,
}
gcvisGraph = NewGraph(strings.Join(flag.Args(), " "), GCVIS_TMPL)
go startSubprocess(pw, flag.Args())
go parser.Run()
http.HandleFunc("/", indexHandler)
go http.Serve(listener, nil)
url := fmt.Sprintf("http://%s/", listener.Addr())
log.Printf("opening browser window, if this fails, navigate to %s", url)
browser.OpenURL(url)
for {
select {
case gcTrace := <-gcChan:
gcvisGraph.AddGCTraceGraphPoint(gcTrace)
case scvgTrace := <-scvgChan:
gcvisGraph.AddScavengerGraphPoint(scvgTrace)
}
}
}