summaryrefslogtreecommitdiffstats
path: root/tokio/src/sync/rwlock.rs
diff options
context:
space:
mode:
authorEliza Weisman <eliza@buoyant.io>2020-02-18 12:43:29 -0800
committerGitHub <noreply@github.com>2020-02-18 12:43:29 -0800
commitb37e4a438037689956ade41ebe9e5ec64d53199f (patch)
tree8775ca6f83cd5416160be45429a48d4caffc0631 /tokio/src/sync/rwlock.rs
parent41576e6c48c38e0d8418997defb7413484a5c5c5 (diff)
sync: improve RwLock API docs (#2252)
Currently, the documentation for `tokio::sync::RwLock` states that it has an unspecified priority policy dependent on the operating system. This is incorrect: Tokio's `RwLock` is fairly queued. The incorrect documentation appears to have been copied from the `std::sync::RwLock` docs, for which this *is* the case. This commit corrects the documentation to describe the actual priority policy. Signed-off-by: Eliza Weisman <eliza@buoyant.io>
Diffstat (limited to 'tokio/src/sync/rwlock.rs')
-rw-r--r--tokio/src/sync/rwlock.rs24
1 files changed, 15 insertions, 9 deletions
diff --git a/tokio/src/sync/rwlock.rs b/tokio/src/sync/rwlock.rs
index b859813a..d3d7e337 100644
--- a/tokio/src/sync/rwlock.rs
+++ b/tokio/src/sync/rwlock.rs
@@ -18,13 +18,18 @@ const MAX_READS: usize = 10;
/// typically allows for read-only access (shared access).
///
/// In comparison, a [`Mutex`] does not distinguish between readers or writers
-/// that acquire the lock, therefore blocking any tasks waiting for the lock to
-/// become available. An `RwLock` will allow any number of readers to acquire the
-/// lock as long as a writer is not holding the lock.
+/// that acquire the lock, therefore causing any tasks waiting for the lock to
+/// become available to yield. An `RwLock` will allow any number of readers to
+/// acquire the lock as long as a writer is not holding the lock.
///
-/// The priority policy of the lock is dependent on the underlying operating
-/// system's implementation, and this type does not guarantee that any
-/// particular policy will be used.
+/// The priority policy of Tokio's read-write lock is _fair_ (or
+/// [_write-preferring_]), in order to ensure that readers cannot starve
+/// writers. Fairness is ensured using a first-in, first-out queue for the tasks
+/// awaiting the lock; if a task that wishes to acquire the write lock is at the
+/// head of the queue, read locks will not be given out until the write lock has
+/// been released. This is in contrast to the Rust standard library's
+/// `std::sync::RwLock`, where the priority policy is dependent on the
+/// operating system's implementation.
///
/// The type parameter `T` represents the data that this lock protects. It is
/// required that `T` satisfies [`Send`] to be shared across threads. The RAII guards
@@ -63,6 +68,7 @@ const MAX_READS: usize = 10;
/// [`RwLockReadGuard`]: struct.RwLockReadGuard.html
/// [`RwLockWriteGuard`]: struct.RwLockWriteGuard.html
/// [`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html
+/// [_write-preferring_]: https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock#Priority_policies
#[derive(Debug)]
pub struct RwLock<T> {
//semaphore to coordinate read and write access to T
@@ -151,7 +157,7 @@ impl<T> RwLock<T> {
/// Locks this rwlock with shared read access, blocking the current task
/// until it can be acquired.
///
- /// The calling task will be blocked until there are no more writers which
+ /// The calling task will yield until there are no more writers which
/// hold the lock. There may be other readers currently inside the lock when
/// this method returns.
///
@@ -192,8 +198,8 @@ impl<T> RwLock<T> {
RwLockReadGuard { lock: self, permit }
}
- /// Locks this rwlock with exclusive write access, blocking the current
- /// task until it can be acquired.
+ /// Locks this rwlock with exclusive write access, causing the current task
+ /// to yield it can be acquired.
///
/// This function will not return while other writers or other readers
/// currently have access to the lock.