commit | 8332e9e607eb545f0153ae52fbfb47d97244f894 | [log] [tgz] |
---|---|---|
author | Inna Palant <[email protected]> | Wed Dec 13 13:41:36 2023 +0000 |
committer | Automerger Merge Worker <[email protected]> | Wed Dec 13 13:41:36 2023 +0000 |
tree | 743cda32af04480b2517ad89df0f0b6cf90acafb | |
parent | 8cd41a9edc2f6aba2ba9dc1b159ff1ade4306479 [diff] | |
parent | dca6b7a419ca8bfc3e6bf90126853e2d437f2d21 [diff] |
Merge remote-tracking branch 'origin/upstream' am: 68bc564c6f am: 280eea6ea8 am: dca6b7a419 Original change: undetermined Change-Id: Ia98f143688e59d244d9101b6311f63f30188724a Signed-off-by: Automerger Merge Worker <[email protected]>
This library provides wrapper types that permit sending non Send types to other threads and use runtime checks to ensure safety.
It provides the Fragile<T>
, Sticky<T>
and SemiSticky<T>
types which are similar in nature but have different behaviors with regards to how destructors are executed. The Fragile<T>
will panic if the destructor is called in another thread, Sticky<T>
will temporarily leak the object until the thread shuts down. SemiSticky<T>
is a compromise of the two. It behaves like Sticky<T>
but it avoids the use of thread local storage if the type does not need Drop
.
use std::thread; // creating and using a fragile object in the same thread works let val = Fragile::new(true); assert_eq!(*val.get(), true); assert!(val.try_get().is_ok()); // once send to another thread it stops working thread::spawn(move || { assert!(val.try_get().is_err()); }).join() .unwrap();