quic: gate and queue synchronization primitives

Add a form of monitor (in the sense of the synchronization primitive)
for controlling access to queues and streams.

We call this a "gate". A gate acts as a mutex and condition variable
with one bit of state. A gate may be locked and unlocked. Lock
operations may optionally block on the gate condition being set.
Unlock operations always record the new value of the condition.

Gates play nicely with contexts.

Unlike traditional condition variables, gates do not suffer from
spurious wakeups: A goroutine waiting for a gate condition is not
woken before the condition is set.

Gates are inspired by the queue design from Bryan Mills's talk,
Rethinking Classical Concurrency Patterns.

Add a queue implemented with a gate.

For golang/go#58547

Change-Id: Ibec6d1f29a2c03a7184fca7392ed5639f96b6485
Reviewed-on: https://go-review.googlesource.com/c/net/+/513955
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Damien Neil <dneil@google.com>
4 files changed
tree: 23d9b81cdf94cf3f3f22f93bd3ef6f5daa923bbe
  1. bpf/
  2. context/
  3. dict/
  4. dns/
  5. html/
  6. http/
  7. http2/
  8. icmp/
  9. idna/
  10. internal/
  11. ipv4/
  12. ipv6/
  13. lif/
  14. nettest/
  15. netutil/
  16. proxy/
  17. publicsuffix/
  18. route/
  19. trace/
  20. webdav/
  21. websocket/
  22. xsrftoken/
  23. .gitattributes
  24. .gitignore
  25. codereview.cfg
  26. CONTRIBUTING.md
  27. go.mod
  28. go.sum
  29. LICENSE
  30. PATENTS
  31. README.md
README.md

Go Networking

Go Reference

This repository holds supplementary Go networking libraries.

Download/Install

The easiest way to install is to run go get -u golang.org/x/net. You can also manually git clone the repository to $GOPATH/src/golang.org/x/net.

Report Issues / Send Patches

This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see https://golang.org/doc/contribute.html. The main issue tracker for the net repository is located at https://github.com/golang/go/issues. Prefix your issue with “x/net:” in the subject line, so it is easy to find.