From 4c2b1e0feb3d3112da94fa4cd11ebe995003fa89 Mon Sep 17 00:00:00 2001 From: Andy Pan Date: Thu, 1 Feb 2024 10:21:14 +0800 Subject: runtime: migrate internal/atomic to internal/runtime For #65355 Change-Id: I65dd090fb99de9b231af2112c5ccb0eb635db2be Reviewed-on: https://go-review.googlesource.com/c/go/+/560155 Reviewed-by: David Chase Reviewed-by: Michael Pratt LUCI-TryBot-Result: Go LUCI Reviewed-by: Ibrahim Bazoka Auto-Submit: Emmanuel Odeke --- src/runtime/internal/atomic/atomic_test.go | 386 ----------------------------- 1 file changed, 386 deletions(-) delete mode 100644 src/runtime/internal/atomic/atomic_test.go (limited to 'src/runtime/internal/atomic/atomic_test.go') diff --git a/src/runtime/internal/atomic/atomic_test.go b/src/runtime/internal/atomic/atomic_test.go deleted file mode 100644 index 2427bfd211..0000000000 --- a/src/runtime/internal/atomic/atomic_test.go +++ /dev/null @@ -1,386 +0,0 @@ -// Copyright 2015 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. - -package atomic_test - -import ( - "internal/goarch" - "runtime" - "runtime/internal/atomic" - "testing" - "unsafe" -) - -func runParallel(N, iter int, f func()) { - defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(int(N))) - done := make(chan bool) - for i := 0; i < N; i++ { - go func() { - for j := 0; j < iter; j++ { - f() - } - done <- true - }() - } - for i := 0; i < N; i++ { - <-done - } -} - -func TestXadduintptr(t *testing.T) { - N := 20 - iter := 100000 - if testing.Short() { - N = 10 - iter = 10000 - } - inc := uintptr(100) - total := uintptr(0) - runParallel(N, iter, func() { - atomic.Xadduintptr(&total, inc) - }) - if want := uintptr(N*iter) * inc; want != total { - t.Fatalf("xadduintpr error, want %d, got %d", want, total) - } - total = 0 - runParallel(N, iter, func() { - atomic.Xadduintptr(&total, inc) - atomic.Xadduintptr(&total, uintptr(-int64(inc))) - }) - if total != 0 { - t.Fatalf("xadduintpr total error, want %d, got %d", 0, total) - } -} - -// Tests that xadduintptr correctly updates 64-bit values. The place where -// we actually do so is mstats.go, functions mSysStat{Inc,Dec}. -func TestXadduintptrOnUint64(t *testing.T) { - if goarch.BigEndian { - // On big endian architectures, we never use xadduintptr to update - // 64-bit values and hence we skip the test. (Note that functions - // mSysStat{Inc,Dec} in mstats.go have explicit checks for - // big-endianness.) - t.Skip("skip xadduintptr on big endian architecture") - } - const inc = 100 - val := uint64(0) - atomic.Xadduintptr((*uintptr)(unsafe.Pointer(&val)), inc) - if inc != val { - t.Fatalf("xadduintptr should increase lower-order bits, want %d, got %d", inc, val) - } -} - -func shouldPanic(t *testing.T, name string, f func()) { - defer func() { - // Check that all GC maps are sane. - runtime.GC() - - err := recover() - want := "unaligned 64-bit atomic operation" - if err == nil { - t.Errorf("%s did not panic", name) - } else if s, _ := err.(string); s != want { - t.Errorf("%s: wanted panic %q, got %q", name, want, err) - } - }() - f() -} - -// Variant of sync/atomic's TestUnaligned64: -func TestUnaligned64(t *testing.T) { - // Unaligned 64-bit atomics on 32-bit systems are - // a continual source of pain. Test that on 32-bit systems they crash - // instead of failing silently. - - if unsafe.Sizeof(int(0)) != 4 { - t.Skip("test only runs on 32-bit systems") - } - - x := make([]uint32, 4) - u := unsafe.Pointer(uintptr(unsafe.Pointer(&x[0])) | 4) // force alignment to 4 - - up64 := (*uint64)(u) // misaligned - p64 := (*int64)(u) // misaligned - - shouldPanic(t, "Load64", func() { atomic.Load64(up64) }) - shouldPanic(t, "Loadint64", func() { atomic.Loadint64(p64) }) - shouldPanic(t, "Store64", func() { atomic.Store64(up64, 0) }) - shouldPanic(t, "Xadd64", func() { atomic.Xadd64(up64, 1) }) - shouldPanic(t, "Xchg64", func() { atomic.Xchg64(up64, 1) }) - shouldPanic(t, "Cas64", func() { atomic.Cas64(up64, 1, 2) }) -} - -func TestAnd8(t *testing.T) { - // Basic sanity check. - x := uint8(0xff) - for i := uint8(0); i < 8; i++ { - atomic.And8(&x, ^(1 << i)) - if r := uint8(0xff) << (i + 1); x != r { - t.Fatalf("clearing bit %#x: want %#x, got %#x", uint8(1<