• 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
rwmutex.go 4.29 KB