OXIESEC PANEL
- Current Dir:
/
/
opt
/
golang
/
1.22.0
/
src
/
runtime
Server IP: 2a02:4780:11:1084:0:327f:3464:10
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
HACKING.md
13.85 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
Makefile
178 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
abi_test.go
2.83 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
alg.go
10.99 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
align_runtime_test.go
1.82 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
align_test.go
5.37 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
arena.go
31.66 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
arena_test.go
13.39 KB
02/02/2024 06:09:55 PM
rw-r--r--
📁
asan
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
asan.go
1.55 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asan0.go
760 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
asan_amd64.s
2.45 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asan_arm64.s
2.14 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asan_loong64.s
2.12 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asan_ppc64le.s
2.75 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asan_riscv64.s
1.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm.s
719 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_386.s
42.54 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_amd64.h
631 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_amd64.s
60.09 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_arm.s
31.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_arm64.s
43.33 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_loong64.s
27.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_mips64x.s
24.34 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_mipsx.s
25.82 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_ppc64x.h
1.93 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_ppc64x.s
45.19 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_riscv64.s
26.97 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_s390x.s
27.55 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_wasm.s
11.82 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
atomic_arm64.s
259 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
atomic_loong64.s
245 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
atomic_mips64x.s
300 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
atomic_mipsx.s
262 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
atomic_pointer.go
3.66 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
atomic_ppc64x.s
437 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
atomic_riscv64.s
275 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
auxv_none.go
298 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
callers_test.go
12.13 KB
02/02/2024 06:09:55 PM
rw-r--r--
📁
cgo
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
cgo.go
2.5 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
cgo_mmap.go
2.42 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
cgo_ppc64x.go
418 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
cgo_sigaction.go
3.28 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
cgocall.go
23.23 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
cgocallback.go
317 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
cgocheck.go
7.97 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
chan.go
23.74 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
chan_test.go
23.44 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
chanbarrier_test.go
1.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
checkptr.go
3.29 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
checkptr_test.go
2.86 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
closure_test.go
937 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
compiler.go
410 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
complex.go
1.59 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
complex_test.go
1.05 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
conv_wasm_test.go
2.96 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
coro.go
4.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📁
coverage
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
covercounter.go
749 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
covermeta.go
2.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
cpuflags.go
810 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
cpuflags_amd64.go
533 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
cpuflags_arm64.go
312 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
cpuprof.go
7.94 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
cputicks.go
437 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
crash_cgo_test.go
23.35 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
crash_test.go
23.12 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
crash_unix_test.go
9.19 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
create_file_nounix.go
305 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
create_file_unix.go
368 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📁
debug
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
debug.go
3.53 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
debug_test.go
7.99 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
debugcall.go
6.75 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
debuglog.go
18.24 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
debuglog_off.go
357 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
debuglog_on.go
1.09 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
debuglog_test.go
4.9 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defer_test.go
11.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs1_linux.go
845 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs1_netbsd_386.go
2.91 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs1_netbsd_amd64.go
3.14 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs1_netbsd_arm.go
3.03 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs1_netbsd_arm64.go
3.25 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs1_solaris_amd64.go
4.01 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs2_linux.go
3.22 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs3_linux.go
1.09 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_aix.go
4.17 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_aix_ppc64.go
3.63 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_arm_linux.go
2.67 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_darwin.go
4.18 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_darwin_amd64.go
6.34 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_darwin_arm64.go
4.17 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_dragonfly.go
2.73 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_dragonfly_amd64.go
3.41 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_freebsd.go
3.96 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_freebsd_386.go
4.52 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_freebsd_amd64.go
4.79 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_freebsd_arm.go
3.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_freebsd_arm64.go
4.18 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_freebsd_riscv64.go
4.19 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_illumos_amd64.go
285 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux.go
2.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_386.go
4.2 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_amd64.go
4.7 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_arm.go
3.89 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_arm64.go
3.62 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_loong64.go
3.43 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_mips64x.go
3.6 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_mipsx.go
3.6 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_ppc64.go
3.69 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_ppc64le.go
3.69 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_riscv64.go
3.81 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_linux_s390x.go
3.16 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_netbsd.go
2.83 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_netbsd_386.go
855 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_netbsd_amd64.go
1.01 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_netbsd_arm.go
764 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_openbsd.go
3.06 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_openbsd_386.go
2.91 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_openbsd_amd64.go
3.11 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_openbsd_arm.go
3.03 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_openbsd_arm64.go
2.78 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_openbsd_mips64.go
2.75 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_openbsd_ppc64.go
3 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_openbsd_riscv64.go
2.89 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_plan9_386.go
1.63 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_plan9_amd64.go
1.82 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_plan9_arm.go
1.73 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_solaris.go
3.32 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_solaris_amd64.go
1004 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_windows.go
2.25 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_windows_386.go
2.28 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_windows_amd64.go
3.19 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_windows_arm.go
2.57 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
defs_windows_arm64.go
3.07 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
duff_386.s
8.24 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
duff_amd64.s
5.64 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
duff_arm.s
7.11 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
duff_arm64.s
5.27 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
duff_loong64.s
11.9 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
duff_mips64x.s
11.28 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
duff_ppc64x.s
7.06 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
duff_riscv64.s
11.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
duff_s390x.s
507 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
ehooks_test.go
2.04 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
env_plan9.go
3 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
env_posix.go
1.56 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
env_test.go
1.16 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
error.go
9.29 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
example_test.go
1.55 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
exithook.go
2.32 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_aix_test.go
207 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_arm_test.go
226 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_darwin_test.go
207 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_debug_amd64_test.go
3.6 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_debug_arm64_test.go
3.49 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_debug_ppc64le_test.go
3.5 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_debug_test.go
5.07 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_debuglog_test.go
1.27 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_linux_test.go
378 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_mmap_test.go
429 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_pipe2_test.go
310 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_pipe_test.go
219 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_test.go
50.52 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_unix_test.go
2.27 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_windows_test.go
903 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
extern.go
18.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
fastlog2.go
1.22 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
fastlog2_test.go
784 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
fastlog2table.go
904 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
fds_nonunix.go
256 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
fds_test.go
1.43 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
fds_unix.go
1.27 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
float.go
1.35 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
float_test.go
699 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
funcdata.h
2.53 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
gc_test.go
20.32 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
gcinfo_test.go
5.95 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
go_tls.h
366 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
hash32.go
1.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
hash64.go
1.95 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
hash_test.go
17.24 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
heap_test.go
529 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
heapdump.go
17.88 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
histogram.go
7.3 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
histogram_test.go
3.51 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
iface.go
20.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
iface_test.go
7.45 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
import_test.go
1.42 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
importx_test.go
763 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📁
internal
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
lfstack.go
2.03 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
lfstack_test.go
2.74 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
libfuzzer.go
6.34 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
libfuzzer_amd64.s
5.03 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
libfuzzer_arm64.s
3.15 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
lock_futex.go
5.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
lock_js.go
7.28 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
lock_sema.go
6.75 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
lock_wasip1.go
2.01 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
lockrank.go
18.19 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
lockrank_off.go
1.17 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
lockrank_on.go
10.27 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
lockrank_test.go
856 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
malloc.go
58.5 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
malloc_test.go
10.64 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
map.go
52.17 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
map_benchmark_test.go
10.59 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
map_fast32.go
12.74 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
map_fast64.go
12.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
map_faststr.go
14.32 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
map_test.go
31.75 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mbarrier.go
13.78 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mbitmap.go
22.54 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mbitmap_allocheaders.go
44.67 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mbitmap_noallocheaders.go
28.95 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mcache.go
10 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mcentral.go
8.05 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mcheckmark.go
2.85 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem.go
6.72 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem_aix.go
2.01 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem_bsd.go
2.21 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem_darwin.go
1.96 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem_js.go
457 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem_linux.go
4.98 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem_plan9.go
447 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem_sbrk.go
4.19 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem_wasip1.go
392 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem_wasm.go
488 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
mem_windows.go
3.88 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_386.s
2.38 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_amd64.s
4.91 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_arm.s
2.6 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_arm64.s
3.62 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_loong64.s
843 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_mips64x.s
1.72 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_mipsx.s
1.32 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_plan9_386.s
983 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_plan9_amd64.s
511 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_ppc64x.s
4.44 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_riscv64.s
1.71 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_s390x.s
1.96 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memclr_wasm.s
485 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_386.s
4.42 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_amd64.s
12.48 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_arm.s
5.9 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_arm64.s
5.96 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_linux_amd64_test.go
1.53 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_loong64.s
1.87 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_mips64x.s
1.83 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_mipsx.s
4.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_plan9_386.s
3.06 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_plan9_amd64.s
3.04 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_ppc64x.s
4.91 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_riscv64.s
5.46 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_s390x.s
2.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_test.go
21.23 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
memmove_wasm.s
479 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📁
metrics
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
metrics.go
26.01 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
metrics_test.go
42.46 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mfinal.go
18.91 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mfinal_test.go
5.57 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mfixalloc.go
3.13 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgc.go
59.29 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgclimit.go
17.28 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgclimit_test.go
9.02 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgcmark.go
53.07 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgcpacer.go
55.36 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgcpacer_test.go
39.26 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgcscavenge.go
52.32 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgcscavenge_test.go
25.2 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgcstack.go
10.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgcsweep.go
32.26 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mgcwork.go
12.89 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mheap.go
72.64 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
minmax.go
1.46 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
minmax_test.go
3.31 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mkduff.go
8.04 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mkfastlog2table.go
3.08 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mklockrank.go
9 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mkpreempt.go
15.33 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mksizeclasses.go
9.52 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mmap.go
844 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
mpagealloc.go
39.23 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mpagealloc_32bit.go
4.56 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mpagealloc_64bit.go
9.34 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mpagealloc_test.go
32.59 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mpagecache.go
5.59 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mpagecache_test.go
10.79 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mpallocbits.go
12.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mpallocbits_test.go
13.69 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mprof.go
47.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mranges.go
14.46 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mranges_test.go
5.68 KB
02/02/2024 06:09:55 PM
rw-r--r--
📁
msan
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
msan.go
1.5 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
msan0.go
725 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
msan_amd64.s
2.3 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
msan_arm64.s
1.98 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
msan_loong64.s
1.96 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
msize_allocheaders.go
1.32 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
msize_noallocheaders.go
915 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
mspanset.go
13.12 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mstats.go
33.81 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
mwbbuf.go
8.13 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
nbpipe_pipe.go
405 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
nbpipe_pipe2.go
344 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
nbpipe_pipe_test.go
706 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
nbpipe_test.go
1.99 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
net_plan9.go
645 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
netpoll.go
20.55 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
netpoll_aix.go
5.06 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
netpoll_epoll.go
4.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
netpoll_fake.go
664 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
netpoll_kqueue.go
5.62 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
netpoll_os_test.go
520 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
netpoll_solaris.go
11.2 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
netpoll_stub.go
1.48 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
netpoll_wasip1.go
6.08 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
netpoll_windows.go
4.01 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
nonwindows_stub.go
729 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
norace_linux_test.go
915 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
norace_test.go
983 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
numcpu_freebsd_test.go
381 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os2_aix.go
20.88 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os2_freebsd.go
302 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os2_openbsd.go
296 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os2_plan9.go
1.48 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os2_solaris.go
320 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os3_plan9.go
3.94 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os3_solaris.go
17.59 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_aix.go
8.89 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_android.go
463 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_darwin.go
11.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_darwin_arm64.go
329 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_dragonfly.go
7.14 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_freebsd.go
11.64 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_freebsd2.go
603 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_freebsd_amd64.go
658 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_freebsd_arm.go
1.45 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_freebsd_arm64.go
320 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_freebsd_noauxv.go
241 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_freebsd_riscv64.go
198 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_illumos.go
3.93 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_js.go
767 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux.go
25.71 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_arm.go
1.51 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_arm64.go
478 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_be64.go
806 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_generic.go
870 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_loong64.go
263 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_mips64x.go
996 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_mipsx.go
987 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_noauxv.go
337 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_novdso.go
347 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_ppc64x.go
526 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_riscv64.go
198 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_s390x.go
825 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_linux_x86.go
234 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_netbsd.go
10.12 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_netbsd_386.go
617 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_netbsd_amd64.go
614 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_netbsd_arm.go
1.07 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_netbsd_arm64.go
769 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_nonopenbsd.go
437 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_only_solaris.go
357 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_openbsd.go
6.23 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_openbsd_arm.go
662 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_openbsd_arm64.go
329 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_openbsd_libc.go
1.49 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_openbsd_mips64.go
329 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_openbsd_syscall.go
1.36 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_openbsd_syscall1.go
441 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_openbsd_syscall2.go
2.51 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_plan9.go
10.18 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_plan9_arm.go
375 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_solaris.go
6.62 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_unix.go
436 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_unix_nonlinux.go
374 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_wasip1.go
7 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_wasm.go
3.15 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_windows.go
41.39 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_windows_arm.go
511 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
os_windows_arm64.go
339 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
pagetrace_off.go
550 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
pagetrace_on.go
10.36 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
panic.go
41.85 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
panic32.go
4.8 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
panic_test.go
1.71 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
panicnil_test.go
1.25 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
pinner.go
10.98 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
pinner_test.go
11.04 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
plugin.go
4.37 KB
02/02/2024 06:09:55 PM
rw-r--r--
📁
pprof
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
preempt.go
15.03 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_386.s
824 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_amd64.s
1.67 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_arm.s
1.49 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_arm64.s
1.97 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_loong64.s
2.41 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_mips64x.s
2.72 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_mipsx.s
2.68 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_nonwindows.go
290 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_ppc64x.s
2.72 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_riscv64.s
2.26 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_s390x.s
1.01 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
preempt_wasm.s
176 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
print.go
5.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
proc.go
204.28 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
proc_runtime_test.go
1.38 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
proc_test.go
25.85 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
profbuf.go
18.26 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
profbuf_test.go
8.54 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
proflabel.go
1.52 KB
02/02/2024 06:09:55 PM
rw-r--r--
📁
race
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
race.go
18.81 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
race0.go
2.79 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
race_amd64.s
13.94 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
race_arm64.s
14.21 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
race_ppc64le.s
15.93 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
race_s390x.s
11.99 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rand.go
7.11 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rand_test.go
1.95 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rdebug.go
550 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
retry.go
760 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_aix_ppc64.s
4.09 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_android_386.s
822 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_android_amd64.s
754 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_android_arm.s
843 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_android_arm64.s
941 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_darwin_amd64.s
399 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_darwin_arm64.s
1.69 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_dragonfly_amd64.s
448 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_freebsd_386.s
454 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_freebsd_amd64.s
442 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_freebsd_arm.s
298 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_freebsd_arm64.s
1.88 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_freebsd_riscv64.s
2.72 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_illumos_amd64.s
311 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_ios_amd64.s
425 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_ios_arm64.s
425 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_js_wasm.s
1.53 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_386.s
450 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_amd64.s
307 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_arm.s
1007 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_arm64.s
1.81 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_loong64.s
2.01 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_mips64x.s
1014 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_mipsx.s
797 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_ppc64.s
847 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_ppc64le.s
2.89 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_riscv64.s
2.65 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_linux_s390x.s
676 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_netbsd_386.s
452 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_netbsd_amd64.s
309 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_netbsd_arm.s
296 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_netbsd_arm64.s
1.8 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_openbsd_386.s
454 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_openbsd_amd64.s
311 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_openbsd_arm.s
298 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_openbsd_arm64.s
1.96 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_openbsd_mips64.s
976 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_openbsd_ppc64.s
370 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_openbsd_riscv64.s
372 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_plan9_386.s
523 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_plan9_amd64.s
481 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_plan9_arm.s
397 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_solaris_amd64.s
311 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_wasip1_wasm.s
387 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_windows_386.s
1.28 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_windows_amd64.s
1.14 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_windows_arm.s
386 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
rt0_windows_arm64.s
733 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime-gdb.py
15.44 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime-gdb_test.go
24.04 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime-gdb_unix_test.go
9.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime-lldb_test.go
4.95 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime-seh_windows_test.go
4.7 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime.go
7.1 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime1.go
16.66 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime2.go
46.16 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime_boring.go
606 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime_linux_test.go
1.77 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime_mmap_test.go
1.77 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime_test.go
11.81 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
runtime_unix_test.go
1.22 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rwmutex.go
5 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
rwmutex_test.go
4.21 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
security_aix.go
449 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
security_issetugid.go
502 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
security_linux.go
335 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
security_nonunix.go
256 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
security_test.go
4.09 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
security_unix.go
818 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
select.go
14.82 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sema.go
18.43 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sema_test.go
4.21 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
semasleep_test.go
3.46 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sigaction.go
489 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_386.go
1.72 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_aix_ppc64.go
3.54 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_amd64.go
2.73 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_arm.go
2.54 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_arm64.go
3.83 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_darwin.go
2.13 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_darwin_amd64.go
4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_darwin_arm64.go
3.6 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_dragonfly.go
2.17 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_dragonfly_amd64.go
2.01 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_freebsd.go
2.2 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_freebsd_386.go
1.55 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_freebsd_amd64.go
2.03 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_freebsd_arm.go
2.18 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_freebsd_arm64.go
3.24 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_freebsd_riscv64.go
3.08 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_linux_386.go
1.59 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_linux_amd64.go
2.05 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_linux_arm.go
2.12 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_linux_arm64.go
2.95 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_linux_loong64.go
3.22 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_linux_mips64x.go
3.35 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_linux_mipsx.go
3.67 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_linux_ppc64x.go
3.5 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_linux_riscv64.go
2.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_linux_s390x.go
4.49 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_loong64.go
3.01 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_mips64x.go
3.18 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_mipsx.go
3.06 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_netbsd.go
2.18 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_netbsd_386.go
1.76 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_netbsd_amd64.go
2.33 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_netbsd_arm.go
2.3 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_netbsd_arm64.go
3.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_openbsd.go
2.18 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_openbsd_386.go
1.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_openbsd_amd64.go
2.04 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_openbsd_arm.go
2.12 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_openbsd_arm64.go
3.39 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_openbsd_mips64.go
3.28 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_openbsd_ppc64.go
3.53 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_openbsd_riscv64.go
3.12 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_plan9.go
1.93 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_ppc64x.go
3.71 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_riscv64.go
2.91 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_solaris.go
4.5 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_solaris_amd64.go
2.47 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_unix.go
44.11 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_windows.go
14.48 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
signal_windows_test.go
8.98 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sigqueue.go
7.62 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sigqueue_note.go
648 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sigqueue_plan9.go
3.25 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sigtab_aix.go
11.3 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sigtab_linux_generic.go
3.52 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sigtab_linux_mipsx.go
5.95 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sizeclasses.go
9.17 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sizeof_test.go
1003 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
slice.go
11.23 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
slice_test.go
10.32 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
softfloat64.go
11.54 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
softfloat64_test.go
4.04 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
stack.go
40.02 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
stack_test.go
23.14 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
start_line_amd64_test.go
647 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
start_line_test.go
2.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
stkframe.go
9.88 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
string.go
13.35 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
string_test.go
13.33 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs.go
17.39 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs2.go
1.15 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs3.go
324 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_386.go
708 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_amd64.go
1.38 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_arm.go
689 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_arm64.go
700 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_linux.go
650 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_loong64.go
638 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_mips64x.go
522 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_mipsx.go
441 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_nonlinux.go
298 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_ppc64.go
302 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_ppc64x.go
688 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_riscv64.go
695 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_s390x.go
414 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
symtab.go
34.76 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
symtab_test.go
7.48 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
symtabinl.go
3.81 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
symtabinl_test.go
2.97 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_aix_ppc64.s
7.42 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_arm.go
521 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_arm64.go
469 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_darwin.go
22.56 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_darwin_amd64.s
19.65 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_darwin_arm64.go
1.74 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_darwin_arm64.s
18.28 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_dragonfly_amd64.s
8.31 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_freebsd_386.s
9.41 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_freebsd_amd64.s
12.67 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_freebsd_arm.s
10.38 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_freebsd_arm64.s
9.49 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_freebsd_riscv64.s
8.92 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_libc.go
1.84 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_linux_386.s
17.89 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_linux_amd64.s
15.74 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_linux_arm.s
13.5 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_linux_arm64.s
16.71 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_linux_loong64.s
14.16 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_linux_mips64x.s
11.96 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_linux_mipsx.s
9.69 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_linux_ppc64x.s
18.09 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_linux_riscv64.s
11.48 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_linux_s390x.s
12.49 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_loong64.go
489 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_mips64x.go
500 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_mipsx.go
496 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_netbsd_386.s
9.61 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_netbsd_amd64.s
9.78 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_netbsd_arm.s
10.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_netbsd_arm64.s
9.47 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_nonppc64x.go
245 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd.go
2.59 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd1.go
1.23 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd2.go
8.67 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd3.go
3.37 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd_386.s
20.4 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd_amd64.s
15.54 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd_arm.s
18.46 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd_arm64.s
15.05 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd_mips64.s
8.81 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd_ppc64.s
15.3 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_openbsd_riscv64.s
16.8 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_plan9_386.s
4.48 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_plan9_amd64.s
4.56 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_plan9_arm.s
7.03 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_ppc64x.go
532 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_riscv64.go
469 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_s390x.go
469 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_solaris_amd64.s
6.42 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_wasm.go
758 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_wasm.s
1.43 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_windows_386.s
6.46 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_windows_amd64.s
8.41 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_windows_arm.s
7.72 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_windows_arm64.s
6.8 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
sys_x86.go
552 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
syscall2_solaris.go
1.85 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
syscall_aix.go
6.33 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
syscall_solaris.go
8.38 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
syscall_unix_test.go
635 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
syscall_windows.go
16.57 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
syscall_windows_test.go
32.45 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
tagptr.go
496 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
tagptr_32bit.go
927 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
tagptr_64bit.go
3.23 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
test_amd64.go
196 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
test_amd64.s
316 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
test_stubs.go
218 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📁
testdata
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
textflag.h
1.47 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
time.go
30.57 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
time_fake.go
2.5 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
time_linux_amd64.s
2.02 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
time_nofake.go
709 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
time_test.go
2.04 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
time_windows.h
753 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
time_windows_386.s
1.71 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
time_windows_amd64.s
786 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
time_windows_arm.s
1.97 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
time_windows_arm64.s
906 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
timeasm.go
418 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
timestub.go
532 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
timestub2.go
363 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_arm.s
3.45 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_arm64.h
1.1 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_arm64.s
1.2 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_loong64.s
589 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_mips64x.s
733 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_mipsx.s
710 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_ppc64x.s
1.52 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_riscv64.s
615 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_s390x.s
1.55 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_stub.go
260 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
tls_windows_amd64.go
294 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📁
trace
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
trace.go
62.76 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2.go
33.81 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2buf.go
6.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2cpu.go
8.87 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2event.go
8.39 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2map.go
4.36 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2region.go
1.68 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2runtime.go
24.2 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2stack.go
9.45 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2status.go
7.24 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2string.go
2.59 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace2time.go
3.21 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
trace_cgo_test.go
4.47 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
traceback.go
54.61 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
traceback_test.go
22.95 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
tracebackx_test.go
509 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
type.go
12.1 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
typekind.go
743 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
unsafe.go
2.97 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
unsafepoint_test.go
3.27 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
utf8.go
3.39 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_elf32.go
2.76 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_elf64.go
2.84 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_freebsd.go
2.44 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_freebsd_arm.go
454 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_freebsd_arm64.go
454 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_freebsd_riscv64.go
429 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_freebsd_x86.go
1.86 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_in_none.go
443 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_linux.go
7.77 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_linux_386.go
669 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_linux_amd64.go
685 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_linux_arm.go
669 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_linux_arm64.go
670 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_linux_loong64.go
793 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_linux_mips64x.go
850 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_linux_ppc64x.go
672 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_linux_riscv64.go
666 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_linux_s390x.go
659 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
vdso_test.go
3.71 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
vlop_386.s
2.02 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
vlop_arm.s
7.06 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
vlop_arm_test.go
3.75 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
vlrt.go
6.71 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
wincallback.go
3.45 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
write_err.go
291 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
write_err_android.go
4.65 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
zcallback_windows.go
155 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
zcallback_windows.s
63.06 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
zcallback_windows_arm.s
89.32 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
zcallback_windows_arm64.s
89.32 KB
02/02/2024 06:09:55 PM
rw-r--r--
Editing: export_test.go
Close
// Copyright 2010 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. // Export guts for testing. package runtime import ( "internal/abi" "internal/goarch" "internal/goexperiment" "internal/goos" "runtime/internal/atomic" "runtime/internal/sys" "unsafe" ) var Fadd64 = fadd64 var Fsub64 = fsub64 var Fmul64 = fmul64 var Fdiv64 = fdiv64 var F64to32 = f64to32 var F32to64 = f32to64 var Fcmp64 = fcmp64 var Fintto64 = fintto64 var F64toint = f64toint var Entersyscall = entersyscall var Exitsyscall = exitsyscall var LockedOSThread = lockedOSThread var Xadduintptr = atomic.Xadduintptr var ReadRandomFailed = &readRandomFailed var Fastlog2 = fastlog2 var Atoi = atoi var Atoi32 = atoi32 var ParseByteCount = parseByteCount var Nanotime = nanotime var NetpollBreak = netpollBreak var Usleep = usleep var PhysPageSize = physPageSize var PhysHugePageSize = physHugePageSize var NetpollGenericInit = netpollGenericInit var Memmove = memmove var MemclrNoHeapPointers = memclrNoHeapPointers var CgoCheckPointer = cgoCheckPointer const CrashStackImplemented = crashStackImplemented const TracebackInnerFrames = tracebackInnerFrames const TracebackOuterFrames = tracebackOuterFrames var MapKeys = keys var MapValues = values var LockPartialOrder = lockPartialOrder type LockRank lockRank func (l LockRank) String() string { return lockRank(l).String() } const PreemptMSupported = preemptMSupported type LFNode struct { Next uint64 Pushcnt uintptr } func LFStackPush(head *uint64, node *LFNode) { (*lfstack)(head).push((*lfnode)(unsafe.Pointer(node))) } func LFStackPop(head *uint64) *LFNode { return (*LFNode)((*lfstack)(head).pop()) } func LFNodeValidate(node *LFNode) { lfnodeValidate((*lfnode)(unsafe.Pointer(node))) } func Netpoll(delta int64) { systemstack(func() { netpoll(delta) }) } func GCMask(x any) (ret []byte) { systemstack(func() { ret = getgcmask(x) }) return } func RunSchedLocalQueueTest() { pp := new(p) gs := make([]g, len(pp.runq)) Escape(gs) // Ensure gs doesn't move, since we use guintptrs for i := 0; i < len(pp.runq); i++ { if g, _ := runqget(pp); g != nil { throw("runq is not empty initially") } for j := 0; j < i; j++ { runqput(pp, &gs[i], false) } for j := 0; j < i; j++ { if g, _ := runqget(pp); g != &gs[i] { print("bad element at iter ", i, "/", j, "\n") throw("bad element") } } if g, _ := runqget(pp); g != nil { throw("runq is not empty afterwards") } } } func RunSchedLocalQueueStealTest() { p1 := new(p) p2 := new(p) gs := make([]g, len(p1.runq)) Escape(gs) // Ensure gs doesn't move, since we use guintptrs for i := 0; i < len(p1.runq); i++ { for j := 0; j < i; j++ { gs[j].sig = 0 runqput(p1, &gs[j], false) } gp := runqsteal(p2, p1, true) s := 0 if gp != nil { s++ gp.sig++ } for { gp, _ = runqget(p2) if gp == nil { break } s++ gp.sig++ } for { gp, _ = runqget(p1) if gp == nil { break } gp.sig++ } for j := 0; j < i; j++ { if gs[j].sig != 1 { print("bad element ", j, "(", gs[j].sig, ") at iter ", i, "\n") throw("bad element") } } if s != i/2 && s != i/2+1 { print("bad steal ", s, ", want ", i/2, " or ", i/2+1, ", iter ", i, "\n") throw("bad steal") } } } func RunSchedLocalQueueEmptyTest(iters int) { // Test that runq is not spuriously reported as empty. // Runq emptiness affects scheduling decisions and spurious emptiness // can lead to underutilization (both runnable Gs and idle Ps coexist // for arbitrary long time). done := make(chan bool, 1) p := new(p) gs := make([]g, 2) Escape(gs) // Ensure gs doesn't move, since we use guintptrs ready := new(uint32) for i := 0; i < iters; i++ { *ready = 0 next0 := (i & 1) == 0 next1 := (i & 2) == 0 runqput(p, &gs[0], next0) go func() { for atomic.Xadd(ready, 1); atomic.Load(ready) != 2; { } if runqempty(p) { println("next:", next0, next1) throw("queue is empty") } done <- true }() for atomic.Xadd(ready, 1); atomic.Load(ready) != 2; { } runqput(p, &gs[1], next1) runqget(p) <-done runqget(p) } } var ( StringHash = stringHash BytesHash = bytesHash Int32Hash = int32Hash Int64Hash = int64Hash MemHash = memhash MemHash32 = memhash32 MemHash64 = memhash64 EfaceHash = efaceHash IfaceHash = ifaceHash ) var UseAeshash = &useAeshash func MemclrBytes(b []byte) { s := (*slice)(unsafe.Pointer(&b)) memclrNoHeapPointers(s.array, uintptr(s.len)) } const HashLoad = hashLoad // entry point for testing func GostringW(w []uint16) (s string) { systemstack(func() { s = gostringw(&w[0]) }) return } var Open = open var Close = closefd var Read = read var Write = write func Envs() []string { return envs } func SetEnvs(e []string) { envs = e } // For benchmarking. // blockWrapper is a wrapper type that ensures a T is placed within a // large object. This is necessary for safely benchmarking things // that manipulate the heap bitmap, like heapBitsSetType. // // More specifically, allocating threads assume they're the sole writers // to their span's heap bits, which allows those writes to be non-atomic. // The heap bitmap is written byte-wise, so if one tried to call heapBitsSetType // on an existing object in a small object span, we might corrupt that // span's bitmap with a concurrent byte write to the heap bitmap. Large // object spans contain exactly one object, so we can be sure no other P // is going to be allocating from it concurrently, hence this wrapper type // which ensures we have a T in a large object span. type blockWrapper[T any] struct { value T _ [_MaxSmallSize]byte // Ensure we're a large object. } func BenchSetType[T any](n int, resetTimer func()) { x := new(blockWrapper[T]) // Escape x to ensure it is allocated on the heap, as we are // working on the heap bits here. Escape(x) // Grab the type. var i any = *new(T) e := *efaceOf(&i) t := e._type // Benchmark setting the type bits for just the internal T of the block. benchSetType(n, resetTimer, 1, unsafe.Pointer(&x.value), t) } const maxArrayBlockWrapperLen = 32 // arrayBlockWrapper is like blockWrapper, but the interior value is intended // to be used as a backing store for a slice. type arrayBlockWrapper[T any] struct { value [maxArrayBlockWrapperLen]T _ [_MaxSmallSize]byte // Ensure we're a large object. } // arrayLargeBlockWrapper is like arrayBlockWrapper, but the interior array // accommodates many more elements. type arrayLargeBlockWrapper[T any] struct { value [1024]T _ [_MaxSmallSize]byte // Ensure we're a large object. } func BenchSetTypeSlice[T any](n int, resetTimer func(), len int) { // We have two separate cases here because we want to avoid // tests on big types but relatively small slices to avoid generating // an allocation that's really big. This will likely force a GC which will // skew the test results. var y unsafe.Pointer if len <= maxArrayBlockWrapperLen { x := new(arrayBlockWrapper[T]) // Escape x to ensure it is allocated on the heap, as we are // working on the heap bits here. Escape(x) y = unsafe.Pointer(&x.value[0]) } else { x := new(arrayLargeBlockWrapper[T]) Escape(x) y = unsafe.Pointer(&x.value[0]) } // Grab the type. var i any = *new(T) e := *efaceOf(&i) t := e._type // Benchmark setting the type for a slice created from the array // of T within the arrayBlock. benchSetType(n, resetTimer, len, y, t) } // benchSetType is the implementation of the BenchSetType* functions. // x must be len consecutive Ts allocated within a large object span (to // avoid a race on the heap bitmap). // // Note: this function cannot be generic. It would get its type from one of // its callers (BenchSetType or BenchSetTypeSlice) whose type parameters are // set by a call in the runtime_test package. That means this function and its // callers will get instantiated in the package that provides the type argument, // i.e. runtime_test. However, we call a function on the system stack. In race // mode the runtime package is usually left uninstrumented because e.g. g0 has // no valid racectx, but if we're instantiated in the runtime_test package, // we might accidentally cause runtime code to be incorrectly instrumented. func benchSetType(n int, resetTimer func(), len int, x unsafe.Pointer, t *_type) { // This benchmark doesn't work with the allocheaders experiment. It sets up // an elaborate scenario to be able to benchmark the function safely, but doing // this work for the allocheaders' version of the function would be complex. // Just fail instead and rely on the test code making sure we never get here. if goexperiment.AllocHeaders { panic("called benchSetType with allocheaders experiment enabled") } // Compute the input sizes. size := t.Size() * uintptr(len) // Validate this function's invariant. s := spanOfHeap(uintptr(x)) if s == nil { panic("no heap span for input") } if s.spanclass.sizeclass() != 0 { panic("span is not a large object span") } // Round up the size to the size class to make the benchmark a little more // realistic. However, validate it, to make sure this is safe. allocSize := roundupsize(size, t.PtrBytes == 0) if s.npages*pageSize < allocSize { panic("backing span not large enough for benchmark") } // Benchmark heapBitsSetType by calling it in a loop. This is safe because // x is in a large object span. resetTimer() systemstack(func() { for i := 0; i < n; i++ { heapBitsSetType(uintptr(x), allocSize, size, t) } }) // Make sure x doesn't get freed, since we're taking a uintptr. KeepAlive(x) } const PtrSize = goarch.PtrSize var ForceGCPeriod = &forcegcperiod // SetTracebackEnv is like runtime/debug.SetTraceback, but it raises // the "environment" traceback level, so later calls to // debug.SetTraceback (e.g., from testing timeouts) can't lower it. func SetTracebackEnv(level string) { setTraceback(level) traceback_env = traceback_cache } var ReadUnaligned32 = readUnaligned32 var ReadUnaligned64 = readUnaligned64 func CountPagesInUse() (pagesInUse, counted uintptr) { stw := stopTheWorld(stwForTestCountPagesInUse) pagesInUse = mheap_.pagesInUse.Load() for _, s := range mheap_.allspans { if s.state.get() == mSpanInUse { counted += s.npages } } startTheWorld(stw) return } func Fastrand() uint32 { return uint32(rand()) } func Fastrand64() uint64 { return rand() } func Fastrandn(n uint32) uint32 { return randn(n) } type ProfBuf profBuf func NewProfBuf(hdrsize, bufwords, tags int) *ProfBuf { return (*ProfBuf)(newProfBuf(hdrsize, bufwords, tags)) } func (p *ProfBuf) Write(tag *unsafe.Pointer, now int64, hdr []uint64, stk []uintptr) { (*profBuf)(p).write(tag, now, hdr, stk) } const ( ProfBufBlocking = profBufBlocking ProfBufNonBlocking = profBufNonBlocking ) func (p *ProfBuf) Read(mode profBufReadMode) ([]uint64, []unsafe.Pointer, bool) { return (*profBuf)(p).read(mode) } func (p *ProfBuf) Close() { (*profBuf)(p).close() } func ReadMetricsSlow(memStats *MemStats, samplesp unsafe.Pointer, len, cap int) { stw := stopTheWorld(stwForTestReadMetricsSlow) // Initialize the metrics beforehand because this could // allocate and skew the stats. metricsLock() initMetrics() systemstack(func() { // Donate the racectx to g0. readMetricsLocked calls into the race detector // via map access. getg().racectx = getg().m.curg.racectx // Read the metrics once before in case it allocates and skews the metrics. // readMetricsLocked is designed to only allocate the first time it is called // with a given slice of samples. In effect, this extra read tests that this // remains true, since otherwise the second readMetricsLocked below could // allocate before it returns. readMetricsLocked(samplesp, len, cap) // Read memstats first. It's going to flush // the mcaches which readMetrics does not do, so // going the other way around may result in // inconsistent statistics. readmemstats_m(memStats) // Read metrics again. We need to be sure we're on the // system stack with readmemstats_m so that we don't call into // the stack allocator and adjust metrics between there and here. readMetricsLocked(samplesp, len, cap) // Undo the donation. getg().racectx = 0 }) metricsUnlock() startTheWorld(stw) } var DoubleCheckReadMemStats = &doubleCheckReadMemStats // ReadMemStatsSlow returns both the runtime-computed MemStats and // MemStats accumulated by scanning the heap. func ReadMemStatsSlow() (base, slow MemStats) { stw := stopTheWorld(stwForTestReadMemStatsSlow) // Run on the system stack to avoid stack growth allocation. systemstack(func() { // Make sure stats don't change. getg().m.mallocing++ readmemstats_m(&base) // Initialize slow from base and zero the fields we're // recomputing. slow = base slow.Alloc = 0 slow.TotalAlloc = 0 slow.Mallocs = 0 slow.Frees = 0 slow.HeapReleased = 0 var bySize [_NumSizeClasses]struct { Mallocs, Frees uint64 } // Add up current allocations in spans. for _, s := range mheap_.allspans { if s.state.get() != mSpanInUse { continue } if s.isUnusedUserArenaChunk() { continue } if sizeclass := s.spanclass.sizeclass(); sizeclass == 0 { slow.Mallocs++ slow.Alloc += uint64(s.elemsize) } else { slow.Mallocs += uint64(s.allocCount) slow.Alloc += uint64(s.allocCount) * uint64(s.elemsize) bySize[sizeclass].Mallocs += uint64(s.allocCount) } } // Add in frees by just reading the stats for those directly. var m heapStatsDelta memstats.heapStats.unsafeRead(&m) // Collect per-sizeclass free stats. var smallFree uint64 for i := 0; i < _NumSizeClasses; i++ { slow.Frees += m.smallFreeCount[i] bySize[i].Frees += m.smallFreeCount[i] bySize[i].Mallocs += m.smallFreeCount[i] smallFree += m.smallFreeCount[i] * uint64(class_to_size[i]) } slow.Frees += m.tinyAllocCount + m.largeFreeCount slow.Mallocs += slow.Frees slow.TotalAlloc = slow.Alloc + m.largeFree + smallFree for i := range slow.BySize { slow.BySize[i].Mallocs = bySize[i].Mallocs slow.BySize[i].Frees = bySize[i].Frees } for i := mheap_.pages.start; i < mheap_.pages.end; i++ { chunk := mheap_.pages.tryChunkOf(i) if chunk == nil { continue } pg := chunk.scavenged.popcntRange(0, pallocChunkPages) slow.HeapReleased += uint64(pg) * pageSize } for _, p := range allp { pg := sys.OnesCount64(p.pcache.scav) slow.HeapReleased += uint64(pg) * pageSize } getg().m.mallocing-- }) startTheWorld(stw) return } // ShrinkStackAndVerifyFramePointers attempts to shrink the stack of the current goroutine // and verifies that unwinding the new stack doesn't crash, even if the old // stack has been freed or reused (simulated via poisoning). func ShrinkStackAndVerifyFramePointers() { before := stackPoisonCopy defer func() { stackPoisonCopy = before }() stackPoisonCopy = 1 gp := getg() systemstack(func() { shrinkstack(gp) }) // If our new stack contains frame pointers into the old stack, this will // crash because the old stack has been poisoned. FPCallers(make([]uintptr, 1024)) } // BlockOnSystemStack switches to the system stack, prints "x\n" to // stderr, and blocks in a stack containing // "runtime.blockOnSystemStackInternal". func BlockOnSystemStack() { systemstack(blockOnSystemStackInternal) } func blockOnSystemStackInternal() { print("x\n") lock(&deadlock) lock(&deadlock) } type RWMutex struct { rw rwmutex } func (rw *RWMutex) Init() { rw.rw.init(lockRankTestR, lockRankTestRInternal, lockRankTestW) } func (rw *RWMutex) RLock() { rw.rw.rlock() } func (rw *RWMutex) RUnlock() { rw.rw.runlock() } func (rw *RWMutex) Lock() { rw.rw.lock() } func (rw *RWMutex) Unlock() { rw.rw.unlock() } const RuntimeHmapSize = unsafe.Sizeof(hmap{}) func MapBucketsCount(m map[int]int) int { h := *(**hmap)(unsafe.Pointer(&m)) return 1 << h.B } func MapBucketsPointerIsNil(m map[int]int) bool { h := *(**hmap)(unsafe.Pointer(&m)) return h.buckets == nil } func OverLoadFactor(count int, B uint8) bool { return overLoadFactor(count, B) } func LockOSCounts() (external, internal uint32) { gp := getg() if gp.m.lockedExt+gp.m.lockedInt == 0 { if gp.lockedm != 0 { panic("lockedm on non-locked goroutine") } } else { if gp.lockedm == 0 { panic("nil lockedm on locked goroutine") } } return gp.m.lockedExt, gp.m.lockedInt } //go:noinline func TracebackSystemstack(stk []uintptr, i int) int { if i == 0 { pc, sp := getcallerpc(), getcallersp() var u unwinder u.initAt(pc, sp, 0, getg(), unwindJumpStack) // Don't ignore errors, for testing return tracebackPCs(&u, 0, stk) } n := 0 systemstack(func() { n = TracebackSystemstack(stk, i-1) }) return n } func KeepNArenaHints(n int) { hint := mheap_.arenaHints for i := 1; i < n; i++ { hint = hint.next if hint == nil { return } } hint.next = nil } // MapNextArenaHint reserves a page at the next arena growth hint, // preventing the arena from growing there, and returns the range of // addresses that are no longer viable. // // This may fail to reserve memory. If it fails, it still returns the // address range it attempted to reserve. func MapNextArenaHint() (start, end uintptr, ok bool) { hint := mheap_.arenaHints addr := hint.addr if hint.down { start, end = addr-heapArenaBytes, addr addr -= physPageSize } else { start, end = addr, addr+heapArenaBytes } got := sysReserve(unsafe.Pointer(addr), physPageSize) ok = (addr == uintptr(got)) if !ok { // We were unable to get the requested reservation. // Release what we did get and fail. sysFreeOS(got, physPageSize) } return } func GetNextArenaHint() uintptr { return mheap_.arenaHints.addr } type G = g type Sudog = sudog func Getg() *G { return getg() } func Goid() uint64 { return getg().goid } func GIsWaitingOnMutex(gp *G) bool { return readgstatus(gp) == _Gwaiting && gp.waitreason.isMutexWait() } var CasGStatusAlwaysTrack = &casgstatusAlwaysTrack //go:noinline func PanicForTesting(b []byte, i int) byte { return unexportedPanicForTesting(b, i) } //go:noinline func unexportedPanicForTesting(b []byte, i int) byte { return b[i] } func G0StackOverflow() { systemstack(func() { g0 := getg() sp := getcallersp() // The stack bounds for g0 stack is not always precise. // Use an artificially small stack, to trigger a stack overflow // without actually run out of the system stack (which may seg fault). g0.stack.lo = sp - 4096 - stackSystem g0.stackguard0 = g0.stack.lo + stackGuard g0.stackguard1 = g0.stackguard0 stackOverflow(nil) }) } func stackOverflow(x *byte) { var buf [256]byte stackOverflow(&buf[0]) } func MapTombstoneCheck(m map[int]int) { // Make sure emptyOne and emptyRest are distributed correctly. // We should have a series of filled and emptyOne cells, followed by // a series of emptyRest cells. h := *(**hmap)(unsafe.Pointer(&m)) i := any(m) t := *(**maptype)(unsafe.Pointer(&i)) for x := 0; x < 1<<h.B; x++ { b0 := (*bmap)(add(h.buckets, uintptr(x)*uintptr(t.BucketSize))) n := 0 for b := b0; b != nil; b = b.overflow(t) { for i := 0; i < bucketCnt; i++ { if b.tophash[i] != emptyRest { n++ } } } k := 0 for b := b0; b != nil; b = b.overflow(t) { for i := 0; i < bucketCnt; i++ { if k < n && b.tophash[i] == emptyRest { panic("early emptyRest") } if k >= n && b.tophash[i] != emptyRest { panic("late non-emptyRest") } if k == n-1 && b.tophash[i] == emptyOne { panic("last non-emptyRest entry is emptyOne") } k++ } } } } func RunGetgThreadSwitchTest() { // Test that getg works correctly with thread switch. // With gccgo, if we generate getg inlined, the backend // may cache the address of the TLS variable, which // will become invalid after a thread switch. This test // checks that the bad caching doesn't happen. ch := make(chan int) go func(ch chan int) { ch <- 5 LockOSThread() }(ch) g1 := getg() // Block on a receive. This is likely to get us a thread // switch. If we yield to the sender goroutine, it will // lock the thread, forcing us to resume on a different // thread. <-ch g2 := getg() if g1 != g2 { panic("g1 != g2") } // Also test getg after some control flow, as the // backend is sensitive to control flow. g3 := getg() if g1 != g3 { panic("g1 != g3") } } const ( PageSize = pageSize PallocChunkPages = pallocChunkPages PageAlloc64Bit = pageAlloc64Bit PallocSumBytes = pallocSumBytes ) // Expose pallocSum for testing. type PallocSum pallocSum func PackPallocSum(start, max, end uint) PallocSum { return PallocSum(packPallocSum(start, max, end)) } func (m PallocSum) Start() uint { return pallocSum(m).start() } func (m PallocSum) Max() uint { return pallocSum(m).max() } func (m PallocSum) End() uint { return pallocSum(m).end() } // Expose pallocBits for testing. type PallocBits pallocBits func (b *PallocBits) Find(npages uintptr, searchIdx uint) (uint, uint) { return (*pallocBits)(b).find(npages, searchIdx) } func (b *PallocBits) AllocRange(i, n uint) { (*pallocBits)(b).allocRange(i, n) } func (b *PallocBits) Free(i, n uint) { (*pallocBits)(b).free(i, n) } func (b *PallocBits) Summarize() PallocSum { return PallocSum((*pallocBits)(b).summarize()) } func (b *PallocBits) PopcntRange(i, n uint) uint { return (*pageBits)(b).popcntRange(i, n) } // SummarizeSlow is a slow but more obviously correct implementation // of (*pallocBits).summarize. Used for testing. func SummarizeSlow(b *PallocBits) PallocSum { var start, most, end uint const N = uint(len(b)) * 64 for start < N && (*pageBits)(b).get(start) == 0 { start++ } for end < N && (*pageBits)(b).get(N-end-1) == 0 { end++ } run := uint(0) for i := uint(0); i < N; i++ { if (*pageBits)(b).get(i) == 0 { run++ } else { run = 0 } most = max(most, run) } return PackPallocSum(start, most, end) } // Expose non-trivial helpers for testing. func FindBitRange64(c uint64, n uint) uint { return findBitRange64(c, n) } // Given two PallocBits, returns a set of bit ranges where // they differ. func DiffPallocBits(a, b *PallocBits) []BitRange { ba := (*pageBits)(a) bb := (*pageBits)(b) var d []BitRange base, size := uint(0), uint(0) for i := uint(0); i < uint(len(ba))*64; i++ { if ba.get(i) != bb.get(i) { if size == 0 { base = i } size++ } else { if size != 0 { d = append(d, BitRange{base, size}) } size = 0 } } if size != 0 { d = append(d, BitRange{base, size}) } return d } // StringifyPallocBits gets the bits in the bit range r from b, // and returns a string containing the bits as ASCII 0 and 1 // characters. func StringifyPallocBits(b *PallocBits, r BitRange) string { str := "" for j := r.I; j < r.I+r.N; j++ { if (*pageBits)(b).get(j) != 0 { str += "1" } else { str += "0" } } return str } // Expose pallocData for testing. type PallocData pallocData func (d *PallocData) FindScavengeCandidate(searchIdx uint, min, max uintptr) (uint, uint) { return (*pallocData)(d).findScavengeCandidate(searchIdx, min, max) } func (d *PallocData) AllocRange(i, n uint) { (*pallocData)(d).allocRange(i, n) } func (d *PallocData) ScavengedSetRange(i, n uint) { (*pallocData)(d).scavenged.setRange(i, n) } func (d *PallocData) PallocBits() *PallocBits { return (*PallocBits)(&(*pallocData)(d).pallocBits) } func (d *PallocData) Scavenged() *PallocBits { return (*PallocBits)(&(*pallocData)(d).scavenged) } // Expose fillAligned for testing. func FillAligned(x uint64, m uint) uint64 { return fillAligned(x, m) } // Expose pageCache for testing. type PageCache pageCache const PageCachePages = pageCachePages func NewPageCache(base uintptr, cache, scav uint64) PageCache { return PageCache(pageCache{base: base, cache: cache, scav: scav}) } func (c *PageCache) Empty() bool { return (*pageCache)(c).empty() } func (c *PageCache) Base() uintptr { return (*pageCache)(c).base } func (c *PageCache) Cache() uint64 { return (*pageCache)(c).cache } func (c *PageCache) Scav() uint64 { return (*pageCache)(c).scav } func (c *PageCache) Alloc(npages uintptr) (uintptr, uintptr) { return (*pageCache)(c).alloc(npages) } func (c *PageCache) Flush(s *PageAlloc) { cp := (*pageCache)(c) sp := (*pageAlloc)(s) systemstack(func() { // None of the tests need any higher-level locking, so we just // take the lock internally. lock(sp.mheapLock) cp.flush(sp) unlock(sp.mheapLock) }) } // Expose chunk index type. type ChunkIdx chunkIdx // Expose pageAlloc for testing. Note that because pageAlloc is // not in the heap, so is PageAlloc. type PageAlloc pageAlloc func (p *PageAlloc) Alloc(npages uintptr) (uintptr, uintptr) { pp := (*pageAlloc)(p) var addr, scav uintptr systemstack(func() { // None of the tests need any higher-level locking, so we just // take the lock internally. lock(pp.mheapLock) addr, scav = pp.alloc(npages) unlock(pp.mheapLock) }) return addr, scav } func (p *PageAlloc) AllocToCache() PageCache { pp := (*pageAlloc)(p) var c PageCache systemstack(func() { // None of the tests need any higher-level locking, so we just // take the lock internally. lock(pp.mheapLock) c = PageCache(pp.allocToCache()) unlock(pp.mheapLock) }) return c } func (p *PageAlloc) Free(base, npages uintptr) { pp := (*pageAlloc)(p) systemstack(func() { // None of the tests need any higher-level locking, so we just // take the lock internally. lock(pp.mheapLock) pp.free(base, npages) unlock(pp.mheapLock) }) } func (p *PageAlloc) Bounds() (ChunkIdx, ChunkIdx) { return ChunkIdx((*pageAlloc)(p).start), ChunkIdx((*pageAlloc)(p).end) } func (p *PageAlloc) Scavenge(nbytes uintptr) (r uintptr) { pp := (*pageAlloc)(p) systemstack(func() { r = pp.scavenge(nbytes, nil, true) }) return } func (p *PageAlloc) InUse() []AddrRange { ranges := make([]AddrRange, 0, len(p.inUse.ranges)) for _, r := range p.inUse.ranges { ranges = append(ranges, AddrRange{r}) } return ranges } // Returns nil if the PallocData's L2 is missing. func (p *PageAlloc) PallocData(i ChunkIdx) *PallocData { ci := chunkIdx(i) return (*PallocData)((*pageAlloc)(p).tryChunkOf(ci)) } // AddrRange is a wrapper around addrRange for testing. type AddrRange struct { addrRange } // MakeAddrRange creates a new address range. func MakeAddrRange(base, limit uintptr) AddrRange { return AddrRange{makeAddrRange(base, limit)} } // Base returns the virtual base address of the address range. func (a AddrRange) Base() uintptr { return a.addrRange.base.addr() } // Base returns the virtual address of the limit of the address range. func (a AddrRange) Limit() uintptr { return a.addrRange.limit.addr() } // Equals returns true if the two address ranges are exactly equal. func (a AddrRange) Equals(b AddrRange) bool { return a == b } // Size returns the size in bytes of the address range. func (a AddrRange) Size() uintptr { return a.addrRange.size() } // testSysStat is the sysStat passed to test versions of various // runtime structures. We do actually have to keep track of this // because otherwise memstats.mappedReady won't actually line up // with other stats in the runtime during tests. var testSysStat = &memstats.other_sys // AddrRanges is a wrapper around addrRanges for testing. type AddrRanges struct { addrRanges mutable bool } // NewAddrRanges creates a new empty addrRanges. // // Note that this initializes addrRanges just like in the // runtime, so its memory is persistentalloc'd. Call this // function sparingly since the memory it allocates is // leaked. // // This AddrRanges is mutable, so we can test methods like // Add. func NewAddrRanges() AddrRanges { r := addrRanges{} r.init(testSysStat) return AddrRanges{r, true} } // MakeAddrRanges creates a new addrRanges populated with // the ranges in a. // // The returned AddrRanges is immutable, so methods like // Add will fail. func MakeAddrRanges(a ...AddrRange) AddrRanges { // Methods that manipulate the backing store of addrRanges.ranges should // not be used on the result from this function (e.g. add) since they may // trigger reallocation. That would normally be fine, except the new // backing store won't come from the heap, but from persistentalloc, so // we'll leak some memory implicitly. ranges := make([]addrRange, 0, len(a)) total := uintptr(0) for _, r := range a { ranges = append(ranges, r.addrRange) total += r.Size() } return AddrRanges{addrRanges{ ranges: ranges, totalBytes: total, sysStat: testSysStat, }, false} } // Ranges returns a copy of the ranges described by the // addrRanges. func (a *AddrRanges) Ranges() []AddrRange { result := make([]AddrRange, 0, len(a.addrRanges.ranges)) for _, r := range a.addrRanges.ranges { result = append(result, AddrRange{r}) } return result } // FindSucc returns the successor to base. See addrRanges.findSucc // for more details. func (a *AddrRanges) FindSucc(base uintptr) int { return a.findSucc(base) } // Add adds a new AddrRange to the AddrRanges. // // The AddrRange must be mutable (i.e. created by NewAddrRanges), // otherwise this method will throw. func (a *AddrRanges) Add(r AddrRange) { if !a.mutable { throw("attempt to mutate immutable AddrRanges") } a.add(r.addrRange) } // TotalBytes returns the totalBytes field of the addrRanges. func (a *AddrRanges) TotalBytes() uintptr { return a.addrRanges.totalBytes } // BitRange represents a range over a bitmap. type BitRange struct { I, N uint // bit index and length in bits } // NewPageAlloc creates a new page allocator for testing and // initializes it with the scav and chunks maps. Each key in these maps // represents a chunk index and each value is a series of bit ranges to // set within each bitmap's chunk. // // The initialization of the pageAlloc preserves the invariant that if a // scavenged bit is set the alloc bit is necessarily unset, so some // of the bits described by scav may be cleared in the final bitmap if // ranges in chunks overlap with them. // // scav is optional, and if nil, the scavenged bitmap will be cleared // (as opposed to all 1s, which it usually is). Furthermore, every // chunk index in scav must appear in chunks; ones that do not are // ignored. func NewPageAlloc(chunks, scav map[ChunkIdx][]BitRange) *PageAlloc { p := new(pageAlloc) // We've got an entry, so initialize the pageAlloc. p.init(new(mutex), testSysStat, true) lockInit(p.mheapLock, lockRankMheap) for i, init := range chunks { addr := chunkBase(chunkIdx(i)) // Mark the chunk's existence in the pageAlloc. systemstack(func() { lock(p.mheapLock) p.grow(addr, pallocChunkBytes) unlock(p.mheapLock) }) // Initialize the bitmap and update pageAlloc metadata. ci := chunkIndex(addr) chunk := p.chunkOf(ci) // Clear all the scavenged bits which grow set. chunk.scavenged.clearRange(0, pallocChunkPages) // Simulate the allocation and subsequent free of all pages in // the chunk for the scavenge index. This sets the state equivalent // with all pages within the index being free. p.scav.index.alloc(ci, pallocChunkPages) p.scav.index.free(ci, 0, pallocChunkPages) // Apply scavenge state if applicable. if scav != nil { if scvg, ok := scav[i]; ok { for _, s := range scvg { // Ignore the case of s.N == 0. setRange doesn't handle // it and it's a no-op anyway. if s.N != 0 { chunk.scavenged.setRange(s.I, s.N) } } } } // Apply alloc state. for _, s := range init { // Ignore the case of s.N == 0. allocRange doesn't handle // it and it's a no-op anyway. if s.N != 0 { chunk.allocRange(s.I, s.N) // Make sure the scavenge index is updated. p.scav.index.alloc(ci, s.N) } } // Update heap metadata for the allocRange calls above. systemstack(func() { lock(p.mheapLock) p.update(addr, pallocChunkPages, false, false) unlock(p.mheapLock) }) } return (*PageAlloc)(p) } // FreePageAlloc releases hard OS resources owned by the pageAlloc. Once this // is called the pageAlloc may no longer be used. The object itself will be // collected by the garbage collector once it is no longer live. func FreePageAlloc(pp *PageAlloc) { p := (*pageAlloc)(pp) // Free all the mapped space for the summary levels. if pageAlloc64Bit != 0 { for l := 0; l < summaryLevels; l++ { sysFreeOS(unsafe.Pointer(&p.summary[l][0]), uintptr(cap(p.summary[l]))*pallocSumBytes) } } else { resSize := uintptr(0) for _, s := range p.summary { resSize += uintptr(cap(s)) * pallocSumBytes } sysFreeOS(unsafe.Pointer(&p.summary[0][0]), alignUp(resSize, physPageSize)) } // Free extra data structures. sysFreeOS(unsafe.Pointer(&p.scav.index.chunks[0]), uintptr(cap(p.scav.index.chunks))*unsafe.Sizeof(atomicScavChunkData{})) // Subtract back out whatever we mapped for the summaries. // sysUsed adds to p.sysStat and memstats.mappedReady no matter what // (and in anger should actually be accounted for), and there's no other // way to figure out how much we actually mapped. gcController.mappedReady.Add(-int64(p.summaryMappedReady)) testSysStat.add(-int64(p.summaryMappedReady)) // Free the mapped space for chunks. for i := range p.chunks { if x := p.chunks[i]; x != nil { p.chunks[i] = nil // This memory comes from sysAlloc and will always be page-aligned. sysFree(unsafe.Pointer(x), unsafe.Sizeof(*p.chunks[0]), testSysStat) } } } // BaseChunkIdx is a convenient chunkIdx value which works on both // 64 bit and 32 bit platforms, allowing the tests to share code // between the two. // // This should not be higher than 0x100*pallocChunkBytes to support // mips and mipsle, which only have 31-bit address spaces. var BaseChunkIdx = func() ChunkIdx { var prefix uintptr if pageAlloc64Bit != 0 { prefix = 0xc000 } else { prefix = 0x100 } baseAddr := prefix * pallocChunkBytes if goos.IsAix != 0 { baseAddr += arenaBaseOffset } return ChunkIdx(chunkIndex(baseAddr)) }() // PageBase returns an address given a chunk index and a page index // relative to that chunk. func PageBase(c ChunkIdx, pageIdx uint) uintptr { return chunkBase(chunkIdx(c)) + uintptr(pageIdx)*pageSize } type BitsMismatch struct { Base uintptr Got, Want uint64 } func CheckScavengedBitsCleared(mismatches []BitsMismatch) (n int, ok bool) { ok = true // Run on the system stack to avoid stack growth allocation. systemstack(func() { getg().m.mallocing++ // Lock so that we can safely access the bitmap. lock(&mheap_.lock) chunkLoop: for i := mheap_.pages.start; i < mheap_.pages.end; i++ { chunk := mheap_.pages.tryChunkOf(i) if chunk == nil { continue } for j := 0; j < pallocChunkPages/64; j++ { // Run over each 64-bit bitmap section and ensure // scavenged is being cleared properly on allocation. // If a used bit and scavenged bit are both set, that's // an error, and could indicate a larger problem, or // an accounting problem. want := chunk.scavenged[j] &^ chunk.pallocBits[j] got := chunk.scavenged[j] if want != got { ok = false if n >= len(mismatches) { break chunkLoop } mismatches[n] = BitsMismatch{ Base: chunkBase(i) + uintptr(j)*64*pageSize, Got: got, Want: want, } n++ } } } unlock(&mheap_.lock) getg().m.mallocing-- }) return } func PageCachePagesLeaked() (leaked uintptr) { stw := stopTheWorld(stwForTestPageCachePagesLeaked) // Walk over destroyed Ps and look for unflushed caches. deadp := allp[len(allp):cap(allp)] for _, p := range deadp { // Since we're going past len(allp) we may see nil Ps. // Just ignore them. if p != nil { leaked += uintptr(sys.OnesCount64(p.pcache.cache)) } } startTheWorld(stw) return } type Mutex = mutex var Lock = lock var Unlock = unlock var MutexContended = mutexContended func SemRootLock(addr *uint32) *mutex { root := semtable.rootFor(addr) return &root.lock } var Semacquire = semacquire var Semrelease1 = semrelease1 func SemNwait(addr *uint32) uint32 { root := semtable.rootFor(addr) return root.nwait.Load() } const SemTableSize = semTabSize // SemTable is a wrapper around semTable exported for testing. type SemTable struct { semTable } // Enqueue simulates enqueuing a waiter for a semaphore (or lock) at addr. func (t *SemTable) Enqueue(addr *uint32) { s := acquireSudog() s.releasetime = 0 s.acquiretime = 0 s.ticket = 0 t.semTable.rootFor(addr).queue(addr, s, false) } // Dequeue simulates dequeuing a waiter for a semaphore (or lock) at addr. // // Returns true if there actually was a waiter to be dequeued. func (t *SemTable) Dequeue(addr *uint32) bool { s, _, _ := t.semTable.rootFor(addr).dequeue(addr) if s != nil { releaseSudog(s) return true } return false } // mspan wrapper for testing. type MSpan mspan // Allocate an mspan for testing. func AllocMSpan() *MSpan { var s *mspan systemstack(func() { lock(&mheap_.lock) s = (*mspan)(mheap_.spanalloc.alloc()) unlock(&mheap_.lock) }) return (*MSpan)(s) } // Free an allocated mspan. func FreeMSpan(s *MSpan) { systemstack(func() { lock(&mheap_.lock) mheap_.spanalloc.free(unsafe.Pointer(s)) unlock(&mheap_.lock) }) } func MSpanCountAlloc(ms *MSpan, bits []byte) int { s := (*mspan)(ms) s.nelems = uint16(len(bits) * 8) s.gcmarkBits = (*gcBits)(unsafe.Pointer(&bits[0])) result := s.countAlloc() s.gcmarkBits = nil return result } const ( TimeHistSubBucketBits = timeHistSubBucketBits TimeHistNumSubBuckets = timeHistNumSubBuckets TimeHistNumBuckets = timeHistNumBuckets TimeHistMinBucketBits = timeHistMinBucketBits TimeHistMaxBucketBits = timeHistMaxBucketBits ) type TimeHistogram timeHistogram // Counts returns the counts for the given bucket, subBucket indices. // Returns true if the bucket was valid, otherwise returns the counts // for the overflow bucket if bucket > 0 or the underflow bucket if // bucket < 0, and false. func (th *TimeHistogram) Count(bucket, subBucket int) (uint64, bool) { t := (*timeHistogram)(th) if bucket < 0 { return t.underflow.Load(), false } i := bucket*TimeHistNumSubBuckets + subBucket if i >= len(t.counts) { return t.overflow.Load(), false } return t.counts[i].Load(), true } func (th *TimeHistogram) Record(duration int64) { (*timeHistogram)(th).record(duration) } var TimeHistogramMetricsBuckets = timeHistogramMetricsBuckets func SetIntArgRegs(a int) int { lock(&finlock) old := intArgRegs if a >= 0 { intArgRegs = a } unlock(&finlock) return old } func FinalizerGAsleep() bool { return fingStatus.Load()&fingWait != 0 } // For GCTestMoveStackOnNextCall, it's important not to introduce an // extra layer of call, since then there's a return before the "real" // next call. var GCTestMoveStackOnNextCall = gcTestMoveStackOnNextCall // For GCTestIsReachable, it's important that we do this as a call so // escape analysis can see through it. func GCTestIsReachable(ptrs ...unsafe.Pointer) (mask uint64) { return gcTestIsReachable(ptrs...) } // For GCTestPointerClass, it's important that we do this as a call so // escape analysis can see through it. // // This is nosplit because gcTestPointerClass is. // //go:nosplit func GCTestPointerClass(p unsafe.Pointer) string { return gcTestPointerClass(p) } const Raceenabled = raceenabled const ( GCBackgroundUtilization = gcBackgroundUtilization GCGoalUtilization = gcGoalUtilization DefaultHeapMinimum = defaultHeapMinimum MemoryLimitHeapGoalHeadroomPercent = memoryLimitHeapGoalHeadroomPercent MemoryLimitMinHeapGoalHeadroom = memoryLimitMinHeapGoalHeadroom ) type GCController struct { gcControllerState } func NewGCController(gcPercent int, memoryLimit int64) *GCController { // Force the controller to escape. We're going to // do 64-bit atomics on it, and if it gets stack-allocated // on a 32-bit architecture, it may get allocated unaligned // space. g := Escape(new(GCController)) g.gcControllerState.test = true // Mark it as a test copy. g.init(int32(gcPercent), memoryLimit) return g } func (c *GCController) StartCycle(stackSize, globalsSize uint64, scannableFrac float64, gomaxprocs int) { trigger, _ := c.trigger() if c.heapMarked > trigger { trigger = c.heapMarked } c.maxStackScan.Store(stackSize) c.globalsScan.Store(globalsSize) c.heapLive.Store(trigger) c.heapScan.Add(int64(float64(trigger-c.heapMarked) * scannableFrac)) c.startCycle(0, gomaxprocs, gcTrigger{kind: gcTriggerHeap}) } func (c *GCController) AssistWorkPerByte() float64 { return c.assistWorkPerByte.Load() } func (c *GCController) HeapGoal() uint64 { return c.heapGoal() } func (c *GCController) HeapLive() uint64 { return c.heapLive.Load() } func (c *GCController) HeapMarked() uint64 { return c.heapMarked } func (c *GCController) Triggered() uint64 { return c.triggered } type GCControllerReviseDelta struct { HeapLive int64 HeapScan int64 HeapScanWork int64 StackScanWork int64 GlobalsScanWork int64 } func (c *GCController) Revise(d GCControllerReviseDelta) { c.heapLive.Add(d.HeapLive) c.heapScan.Add(d.HeapScan) c.heapScanWork.Add(d.HeapScanWork) c.stackScanWork.Add(d.StackScanWork) c.globalsScanWork.Add(d.GlobalsScanWork) c.revise() } func (c *GCController) EndCycle(bytesMarked uint64, assistTime, elapsed int64, gomaxprocs int) { c.assistTime.Store(assistTime) c.endCycle(elapsed, gomaxprocs, false) c.resetLive(bytesMarked) c.commit(false) } func (c *GCController) AddIdleMarkWorker() bool { return c.addIdleMarkWorker() } func (c *GCController) NeedIdleMarkWorker() bool { return c.needIdleMarkWorker() } func (c *GCController) RemoveIdleMarkWorker() { c.removeIdleMarkWorker() } func (c *GCController) SetMaxIdleMarkWorkers(max int32) { c.setMaxIdleMarkWorkers(max) } var alwaysFalse bool var escapeSink any func Escape[T any](x T) T { if alwaysFalse { escapeSink = x } return x } // Acquirem blocks preemption. func Acquirem() { acquirem() } func Releasem() { releasem(getg().m) } var Timediv = timediv type PIController struct { piController } func NewPIController(kp, ti, tt, min, max float64) *PIController { return &PIController{piController{ kp: kp, ti: ti, tt: tt, min: min, max: max, }} } func (c *PIController) Next(input, setpoint, period float64) (float64, bool) { return c.piController.next(input, setpoint, period) } const ( CapacityPerProc = capacityPerProc GCCPULimiterUpdatePeriod = gcCPULimiterUpdatePeriod ) type GCCPULimiter struct { limiter gcCPULimiterState } func NewGCCPULimiter(now int64, gomaxprocs int32) *GCCPULimiter { // Force the controller to escape. We're going to // do 64-bit atomics on it, and if it gets stack-allocated // on a 32-bit architecture, it may get allocated unaligned // space. l := Escape(new(GCCPULimiter)) l.limiter.test = true l.limiter.resetCapacity(now, gomaxprocs) return l } func (l *GCCPULimiter) Fill() uint64 { return l.limiter.bucket.fill } func (l *GCCPULimiter) Capacity() uint64 { return l.limiter.bucket.capacity } func (l *GCCPULimiter) Overflow() uint64 { return l.limiter.overflow } func (l *GCCPULimiter) Limiting() bool { return l.limiter.limiting() } func (l *GCCPULimiter) NeedUpdate(now int64) bool { return l.limiter.needUpdate(now) } func (l *GCCPULimiter) StartGCTransition(enableGC bool, now int64) { l.limiter.startGCTransition(enableGC, now) } func (l *GCCPULimiter) FinishGCTransition(now int64) { l.limiter.finishGCTransition(now) } func (l *GCCPULimiter) Update(now int64) { l.limiter.update(now) } func (l *GCCPULimiter) AddAssistTime(t int64) { l.limiter.addAssistTime(t) } func (l *GCCPULimiter) ResetCapacity(now int64, nprocs int32) { l.limiter.resetCapacity(now, nprocs) } const ScavengePercent = scavengePercent type Scavenger struct { Sleep func(int64) int64 Scavenge func(uintptr) (uintptr, int64) ShouldStop func() bool GoMaxProcs func() int32 released atomic.Uintptr scavenger scavengerState stop chan<- struct{} done <-chan struct{} } func (s *Scavenger) Start() { if s.Sleep == nil || s.Scavenge == nil || s.ShouldStop == nil || s.GoMaxProcs == nil { panic("must populate all stubs") } // Install hooks. s.scavenger.sleepStub = s.Sleep s.scavenger.scavenge = s.Scavenge s.scavenger.shouldStop = s.ShouldStop s.scavenger.gomaxprocs = s.GoMaxProcs // Start up scavenger goroutine, and wait for it to be ready. stop := make(chan struct{}) s.stop = stop done := make(chan struct{}) s.done = done go func() { // This should match bgscavenge, loosely. s.scavenger.init() s.scavenger.park() for { select { case <-stop: close(done) return default: } released, workTime := s.scavenger.run() if released == 0 { s.scavenger.park() continue } s.released.Add(released) s.scavenger.sleep(workTime) } }() if !s.BlockUntilParked(1e9 /* 1 second */) { panic("timed out waiting for scavenger to get ready") } } // BlockUntilParked blocks until the scavenger parks, or until // timeout is exceeded. Returns true if the scavenger parked. // // Note that in testing, parked means something slightly different. // In anger, the scavenger parks to sleep, too, but in testing, // it only parks when it actually has no work to do. func (s *Scavenger) BlockUntilParked(timeout int64) bool { // Just spin, waiting for it to park. // // The actual parking process is racy with respect to // wakeups, which is fine, but for testing we need something // a bit more robust. start := nanotime() for nanotime()-start < timeout { lock(&s.scavenger.lock) parked := s.scavenger.parked unlock(&s.scavenger.lock) if parked { return true } Gosched() } return false } // Released returns how many bytes the scavenger released. func (s *Scavenger) Released() uintptr { return s.released.Load() } // Wake wakes up a parked scavenger to keep running. func (s *Scavenger) Wake() { s.scavenger.wake() } // Stop cleans up the scavenger's resources. The scavenger // must be parked for this to work. func (s *Scavenger) Stop() { lock(&s.scavenger.lock) parked := s.scavenger.parked unlock(&s.scavenger.lock) if !parked { panic("tried to clean up scavenger that is not parked") } close(s.stop) s.Wake() <-s.done } type ScavengeIndex struct { i scavengeIndex } func NewScavengeIndex(min, max ChunkIdx) *ScavengeIndex { s := new(ScavengeIndex) // This is a bit lazy but we easily guarantee we'll be able // to reference all the relevant chunks. The worst-case // memory usage here is 512 MiB, but tests generally use // small offsets from BaseChunkIdx, which results in ~100s // of KiB in memory use. // // This may still be worth making better, at least by sharing // this fairly large array across calls with a sync.Pool or // something. Currently, when the tests are run serially, // it takes around 0.5s. Not all that much, but if we have // a lot of tests like this it could add up. s.i.chunks = make([]atomicScavChunkData, max) s.i.min.Store(uintptr(min)) s.i.max.Store(uintptr(max)) s.i.minHeapIdx.Store(uintptr(min)) s.i.test = true return s } func (s *ScavengeIndex) Find(force bool) (ChunkIdx, uint) { ci, off := s.i.find(force) return ChunkIdx(ci), off } func (s *ScavengeIndex) AllocRange(base, limit uintptr) { sc, ec := chunkIndex(base), chunkIndex(limit-1) si, ei := chunkPageIndex(base), chunkPageIndex(limit-1) if sc == ec { // The range doesn't cross any chunk boundaries. s.i.alloc(sc, ei+1-si) } else { // The range crosses at least one chunk boundary. s.i.alloc(sc, pallocChunkPages-si) for c := sc + 1; c < ec; c++ { s.i.alloc(c, pallocChunkPages) } s.i.alloc(ec, ei+1) } } func (s *ScavengeIndex) FreeRange(base, limit uintptr) { sc, ec := chunkIndex(base), chunkIndex(limit-1) si, ei := chunkPageIndex(base), chunkPageIndex(limit-1) if sc == ec { // The range doesn't cross any chunk boundaries. s.i.free(sc, si, ei+1-si) } else { // The range crosses at least one chunk boundary. s.i.free(sc, si, pallocChunkPages-si) for c := sc + 1; c < ec; c++ { s.i.free(c, 0, pallocChunkPages) } s.i.free(ec, 0, ei+1) } } func (s *ScavengeIndex) ResetSearchAddrs() { for _, a := range []*atomicOffAddr{&s.i.searchAddrBg, &s.i.searchAddrForce} { addr, marked := a.Load() if marked { a.StoreUnmark(addr, addr) } a.Clear() } s.i.freeHWM = minOffAddr } func (s *ScavengeIndex) NextGen() { s.i.nextGen() } func (s *ScavengeIndex) SetEmpty(ci ChunkIdx) { s.i.setEmpty(chunkIdx(ci)) } func CheckPackScavChunkData(gen uint32, inUse, lastInUse uint16, flags uint8) bool { sc0 := scavChunkData{ gen: gen, inUse: inUse, lastInUse: lastInUse, scavChunkFlags: scavChunkFlags(flags), } scp := sc0.pack() sc1 := unpackScavChunkData(scp) return sc0 == sc1 } const GTrackingPeriod = gTrackingPeriod var ZeroBase = unsafe.Pointer(&zerobase) const UserArenaChunkBytes = userArenaChunkBytes type UserArena struct { arena *userArena } func NewUserArena() *UserArena { return &UserArena{newUserArena()} } func (a *UserArena) New(out *any) { i := efaceOf(out) typ := i._type if typ.Kind_&kindMask != kindPtr { panic("new result of non-ptr type") } typ = (*ptrtype)(unsafe.Pointer(typ)).Elem i.data = a.arena.new(typ) } func (a *UserArena) Slice(sl any, cap int) { a.arena.slice(sl, cap) } func (a *UserArena) Free() { a.arena.free() } func GlobalWaitingArenaChunks() int { n := 0 systemstack(func() { lock(&mheap_.lock) for s := mheap_.userArena.quarantineList.first; s != nil; s = s.next { n++ } unlock(&mheap_.lock) }) return n } func UserArenaClone[T any](s T) T { return arena_heapify(s).(T) } var AlignUp = alignUp func BlockUntilEmptyFinalizerQueue(timeout int64) bool { return blockUntilEmptyFinalizerQueue(timeout) } func FrameStartLine(f *Frame) int { return f.startLine } // PersistentAlloc allocates some memory that lives outside the Go heap. // This memory will never be freed; use sparingly. func PersistentAlloc(n uintptr) unsafe.Pointer { return persistentalloc(n, 0, &memstats.other_sys) } // FPCallers works like Callers and uses frame pointer unwinding to populate // pcBuf with the return addresses of the physical frames on the stack. func FPCallers(pcBuf []uintptr) int { return fpTracebackPCs(unsafe.Pointer(getfp()), pcBuf) } const FramePointerEnabled = framepointer_enabled var ( IsPinned = isPinned GetPinCounter = pinnerGetPinCounter ) func SetPinnerLeakPanic(f func()) { pinnerLeakPanic = f } func GetPinnerLeakPanic() func() { return pinnerLeakPanic } var testUintptr uintptr func MyGenericFunc[T any]() { systemstack(func() { testUintptr = 4 }) } func UnsafePoint(pc uintptr) bool { fi := findfunc(pc) v := pcdatavalue(fi, abi.PCDATA_UnsafePoint, pc) switch v { case abi.UnsafePointUnsafe: return true case abi.UnsafePointSafe: return false case abi.UnsafePointRestart1, abi.UnsafePointRestart2, abi.UnsafePointRestartAtEntry: // These are all interruptible, they just encode a nonstandard // way of recovering when interrupted. return false default: var buf [20]byte panic("invalid unsafe point code " + string(itoa(buf[:], uint64(v)))) } }