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// Tests increasing and decreasing GOMAXPROCS to try and
6// catch issues with stale proc state.
7
8//go:build ignore
9
10package main
11
12import (
13	"log"
14	"os"
15	"runtime"
16	"runtime/trace"
17	"time"
18)
19
20func main() {
21	// Start a goroutine that calls runtime.GC to try and
22	// introduce some interesting events in between the
23	// GOMAXPROCS calls.
24	go func() {
25		for {
26			runtime.GC()
27			time.Sleep(1 * time.Millisecond)
28		}
29	}()
30
31	// Start tracing.
32	if err := trace.Start(os.Stdout); err != nil {
33		log.Fatalf("failed to start tracing: %v", err)
34	}
35	// Run GOMAXPROCS a bunch of times, up and down.
36	for i := 1; i <= 16; i *= 2 {
37		runtime.GOMAXPROCS(i)
38		time.Sleep(1 * time.Millisecond)
39	}
40	for i := 16; i >= 1; i /= 2 {
41		runtime.GOMAXPROCS(i)
42		time.Sleep(1 * time.Millisecond)
43	}
44	// Stop tracing.
45	trace.Stop()
46}
47