1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// This binary collects a 1s delta mutex profile and dumps it to os.Stdout.
6//
7// This is in a subprocess because we want the base mutex profile to be empty
8// (as a regression test for https://go.dev/issue/64566) and the only way to
9// force reset the profile is to create a new subprocess.
10//
11// This manually collects the HTTP response and dumps to stdout in order to
12// avoid any flakiness around port selection for a real HTTP server.
13package main
14
15import (
16	"bytes"
17	"fmt"
18	"log"
19	"net/http"
20	"net/http/pprof"
21	"net/http/httptest"
22	"runtime"
23)
24
25func main() {
26	// Disable the mutex profiler. This is the default, but that default is
27	// load-bearing for this test, which needs the base profile to be empty.
28	runtime.SetMutexProfileFraction(0)
29
30	h := pprof.Handler("mutex")
31
32	req := httptest.NewRequest("GET", "/debug/pprof/mutex?seconds=1", nil)
33	rec := httptest.NewRecorder()
34	rec.Body = new(bytes.Buffer)
35
36	h.ServeHTTP(rec, req)
37	resp := rec.Result()
38	if resp.StatusCode != http.StatusOK {
39		log.Fatalf("Request failed: %s\n%s", resp.Status, rec.Body)
40	}
41
42	fmt.Print(rec.Body)
43}
44