// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This binary collects a 1s delta mutex profile and dumps it to os.Stdout. // // This is in a subprocess because we want the base mutex profile to be empty // (as a regression test for https://go.dev/issue/64566) and the only way to // force reset the profile is to create a new subprocess. // // This manually collects the HTTP response and dumps to stdout in order to // avoid any flakiness around port selection for a real HTTP server. package main import ( "bytes" "fmt" "log" "net/http" "net/http/pprof" "net/http/httptest" "runtime" ) func main() { // Disable the mutex profiler. This is the default, but that default is // load-bearing for this test, which needs the base profile to be empty. runtime.SetMutexProfileFraction(0) h := pprof.Handler("mutex") req := httptest.NewRequest("GET", "/debug/pprof/mutex?seconds=1", nil) rec := httptest.NewRecorder() rec.Body = new(bytes.Buffer) h.ServeHTTP(rec, req) resp := rec.Result() if resp.StatusCode != http.StatusOK { log.Fatalf("Request failed: %s\n%s", resp.Status, rec.Body) } fmt.Print(rec.Body) }