]> Cypherpunks repositories - gostls13.git/commit
runtime: make rwmutex work on Ms instead of Gs
authorAustin Clements <austin@google.com>
Wed, 28 Jun 2017 19:54:46 +0000 (15:54 -0400)
committerAustin Clements <austin@google.com>
Wed, 28 Jun 2017 22:08:57 +0000 (22:08 +0000)
commit80832974ac9306f992c797f8394e44d7f63f307e
treef1a58abffb5da95e8a37ece53339ac485fc6cab9
parent3ea53cb08f1709b2f9bf39cfcfaa1d285256baa2
runtime: make rwmutex work on Ms instead of Gs

Currently runtime.rwmutex is written to block the calling goroutine
rather than the calling thread. However, rwmutex was intended to be
used in the scheduler, which means it needs to be a thread-level
synchronization primitive.

Hence, this modifies rwmutex to synchronize threads instead of
goroutines. This has the consequence of making it write-barrier-free,
which is also important for using it in the scheduler.

The implementation makes three changes: it replaces the "w" semaphore
with a mutex, since this was all it was being used for anyway; it
replaces "writerSem" with a single pending M that parks on its note;
and it replaces "readerSem" with a list of Ms that park on their notes
plus a pass count that together emulate a counting semaphore. I
model-checked the safety and liveness of this implementation through
>1 billion schedules.

For #20738.

Change-Id: I3cf5a18c266a96a3f38165083812803510217787
Reviewed-on: https://go-review.googlesource.com/47071
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/HACKING.md
src/runtime/export_test.go
src/runtime/rwmutex.go
src/runtime/rwmutex_test.go