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()