log.Printf("Opening browser. Trace viewer is listening on %s", addr)
browser.Open(addr)
- // Install MMU handlers.
- traceviewer.InstallMMUHandlers(http.DefaultServeMux, ranges, mutatorUtil)
+ // Install MMU handler.
+ http.HandleFunc("/mmu", traceviewer.MMUHandlerFunc(ranges, mutatorUtil))
// Install main handler.
http.Handle("/", traceviewer.MainHandler(ranges))
log.Printf("Opening browser. Trace viewer is listening on %s", addr)
browser.Open(addr)
+ mutatorUtil := func(flags trace.UtilFlags) ([][]trace.MutatorUtil, error) {
+ return trace.MutatorUtilizationV2(parsed.events, flags), nil
+ }
+
mux := http.NewServeMux()
mux.Handle("/", traceviewer.MainHandler(ranges))
mux.Handle("/trace", traceviewer.TraceHandler())
mux.Handle("/static/", traceviewer.StaticHandler())
mux.HandleFunc("/goroutines", GoroutinesHandlerFunc(gSummaries))
mux.HandleFunc("/goroutine", GoroutineHandler(gSummaries))
-
- // Install MMU handlers.
- mutatorUtil := func(flags trace.UtilFlags) ([][]trace.MutatorUtil, error) {
- return trace.MutatorUtilizationV2(parsed.events, flags), nil
- }
- traceviewer.InstallMMUHandlers(mux, ranges, mutatorUtil)
+ mux.HandleFunc("/mmu", traceviewer.MMUHandlerFunc(ranges, mutatorUtil))
err = http.Serve(ln, mux)
return fmt.Errorf("failed to start http server: %w", err)
type MutatorUtilFunc func(trace.UtilFlags) ([][]trace.MutatorUtil, error)
-func InstallMMUHandlers(mux *http.ServeMux, ranges []Range, f MutatorUtilFunc) {
+func MMUHandlerFunc(ranges []Range, f MutatorUtilFunc) http.HandlerFunc {
mmu := &mmu{
cache: make(map[trace.UtilFlags]*mmuCacheEntry),
f: f,
ranges: ranges,
}
- mux.HandleFunc("/mmu", func(w http.ResponseWriter, r *http.Request) {
- // N.B. templMMU has Javascript that implicitly relies upon the existence
- // of /mmuPlot and /mmuDetails on the same server.
+ return func(w http.ResponseWriter, r *http.Request) {
+ switch r.FormValue("mode") {
+ case "plot":
+ mmu.HandlePlot(w, r)
+ return
+ case "details":
+ mmu.HandleDetails(w, r)
+ return
+ }
http.ServeContent(w, r, "", time.Time{}, strings.NewReader(templMMU))
- })
- mux.HandleFunc("/mmuPlot", mmu.HandlePlot)
- mux.HandleFunc("/mmuDetails", mmu.HandleDetails)
+ }
}
var utilFlagNames = map[string]trace.UtilFlags{
container.css('opacity', '.5');
refreshChart.count++;
var seq = refreshChart.count;
- $.getJSON('/mmuPlot?flags=' + mmuFlags())
+ $.getJSON('?mode=plot&flags=' + mmuFlags())
.fail(function(xhr, status, error) {
alert('failed to load plot: ' + status);
})
var details = $('#details');
details.empty();
var windowNS = curve[items[0].row][0];
- var url = '/mmuDetails?window=' + windowNS + '&flags=' + mmuFlags();
+ var url = '?mode=details&window=' + windowNS + '&flags=' + mmuFlags();
$.getJSON(url)
.fail(function(xhr, status, error) {
details.text(status + ': ' + url + ' could not be loaded');