• Dmitry Vyukov's avatar
    sync: fix deficiency in RWMutex race annotations · f451a318
    Dmitry Vyukov authored
    Remove unnecessary race.Release annotation from Unlock.
    
    For RWMutex we want to establish the following happens-before (HB) edges:
    1. Between Unlock and the subsequent Lock.
    2. Between Unlock and the subsequent RLock.
    3. Between batch of RUnlock's and the subsequent Lock.
    
    1 is provided by Release(&rw.readerSem) in Unlock and Acquire(&rw.readerSem) in Lock.
    2 is provided by Release(&rw.readerSem) in Unlock and Acquire(&rw.readerSem) in RLock.
    3 is provided by ReleaseMerge(&rw.writerSem) in RUnlock in Acquire(&rw.writerSem) in Lock,
    since we want to establish HB between a batch of RUnlock's this uses ReleaseMerge instead of Release.
    
    Release(&rw.writerSem) in Unlock is simply not needed.
    
    FWIW this is also how C++ tsan handles mutexes, not a proof but at least something.
    Making 2 implementations consistent also simplifies any kind of reasoning against both of them.
    
    Since this only affects performance, a reasonable test is not possible.
    Everything should just continue to work but slightly faster.
    
    Credit for discovering this goes to Jamie Liu.
    
    Change-Id: Ice37d29ecb7a5faed3f7781c38dd32c7469b2735
    Reviewed-on: https://go-review.googlesource.com/120495
    Run-TryBot: Ian Lance Taylor <iant@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    f451a318
Name
Last commit
Last update
..
atomic Loading commit data...
cond.go Loading commit data...
cond_test.go Loading commit data...
example_pool_test.go Loading commit data...
example_test.go Loading commit data...
export_test.go Loading commit data...
map.go Loading commit data...
map_bench_test.go Loading commit data...
map_reference_test.go Loading commit data...
map_test.go Loading commit data...
mutex.go Loading commit data...
mutex_test.go Loading commit data...
once.go Loading commit data...
once_test.go Loading commit data...
pool.go Loading commit data...
pool_test.go Loading commit data...
runtime.go Loading commit data...
runtime_sema_test.go Loading commit data...
rwmutex.go Loading commit data...
rwmutex_test.go Loading commit data...
waitgroup.go Loading commit data...
waitgroup_test.go Loading commit data...