github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/runtime/race.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build race 6 7 package runtime 8 9 import ( 10 "github.com/shogo82148/std/unsafe" 11 ) 12 13 func RaceRead(addr unsafe.Pointer) 14 func RaceWrite(addr unsafe.Pointer) 15 func RaceReadRange(addr unsafe.Pointer, len int) 16 func RaceWriteRange(addr unsafe.Pointer, len int) 17 18 func RaceErrors() int 19 20 // RaceAcquire/RaceRelease/RaceReleaseMergeを使用すると、 21 // ゴルーチン間のhappens-before関係を確立できます。 22 // これによって、競争検出器に、一部の理由で見えない実際の同期について情報を提供できます 23 // (例:RaceDisable/RaceEnableのコード節内の同期)。 24 // RaceAcquireは、addrの前のRaceReleaseMergeからaddrの最後のRaceReleaseまでの 25 // happens-before関係を確立します。 26 // Cのメモリモデル(C11 §5.1.2.4、§7.17.3)において、RaceAcquireは 27 // atomic_load(memory_order_acquire)に相当します。 28 // 29 //go:nosplit 30 func RaceAcquire(addr unsafe.Pointer) 31 32 // RaceReleaseは、addr上のリリース操作を実行します。 33 // これは、後のaddr上のRaceAcquireと同期することができます。 34 // 35 // Cのメモリモデルの観点からは、RaceReleaseはatomic_store(memory_order_release)に相当します。 36 // 37 //go:nosplit 38 func RaceRelease(addr unsafe.Pointer) 39 40 // RaceReleaseMergeはRaceReleaseと似ていますが、addrの前にあるRaceReleaseまたはRaceReleaseMergeとのhappens-before関係も確立します。 41 // 42 // Cのメモリモデルにおいて、RaceReleaseMergeはatomic_exchange(memory_order_release)と等価です。 43 // 44 //go:nosplit 45 func RaceReleaseMerge(addr unsafe.Pointer) 46 47 // RaceDisableは現在のゴルーチンでの競争同期イベントの処理を無効にします。 48 // RaceEnableで処理は再有効化されます。RaceDisable/RaceEnableは入れ子にすることができます。 49 // 非同期イベント(メモリアクセス、関数の入退場)は引き続き競争検出器に影響します。 50 // 51 //go:nosplit 52 func RaceDisable() 53 54 // RaceEnableは現在のgoroutineでのレースイベントの処理を再有効化します。 55 // 56 //go:nosplit 57 func RaceEnable()