summaryrefslogtreecommitdiffstats
path: root/third_party/rust/try-lock/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/try-lock/README.md')
-rw-r--r--third_party/rust/try-lock/README.md44
1 files changed, 44 insertions, 0 deletions
diff --git a/third_party/rust/try-lock/README.md b/third_party/rust/try-lock/README.md
new file mode 100644
index 0000000000..abbb0eac47
--- /dev/null
+++ b/third_party/rust/try-lock/README.md
@@ -0,0 +1,44 @@
+# TryLock
+
+- [Crates.io](https://crates.io/crates/try-lock)
+- [Docs](https://docs.rs/try-lock)
+
+A light-weight lock guarded by an atomic boolean.
+
+Most efficient when contention is low, acquiring the lock is a single atomic swap, and releasing it just 1 more atomic swap.
+
+## Example
+
+```rust
+use std::sync::Arc;
+use try_lock::TryLock;
+
+// a thing we want to share
+struct Widget {
+ name: String,
+}
+
+// lock it up!
+let widget1 = Arc::new(TryLock::new(Widget {
+ name: "Spanner".into(),
+}));
+
+let widget2 = widget1.clone();
+
+
+// mutate the widget
+let mut locked = widget1.try_lock().expect("example isn't locked yet");
+locked.name.push_str(" Bundle");
+
+// hands off, buddy
+let not_locked = widget2.try_lock();
+assert!(not_locked.is_none(), "widget1 has the lock");
+
+// ok, you can have it
+drop(locked);
+
+let locked2 = widget2.try_lock().expect("widget1 lock is released");
+
+assert_eq!(locked2.name, "Spanner Bundle");
+```
+