pub struct ExecutorLockBuilder<L, T> { /* private fields */ }Expand description
Builder state after a lock has been attached.
Call Self::when to configure the required condition tester.
§Type Parameters
L- The lock type implementingLock<T>.T- The data type protected by the lock.
Implementations§
Source§impl<L, T> ExecutorLockBuilder<L, T>where
L: Lock<T>,
impl<L, T> ExecutorLockBuilder<L, T>where
L: Lock<T>,
Sourcepub fn log_unmet_condition(
self,
level: Level,
message: impl Into<String>,
) -> Self
pub fn log_unmet_condition( self, level: Level, message: impl Into<String>, ) -> Self
Sourcepub fn disable_unmet_condition_logging(self) -> Self
pub fn disable_unmet_condition_logging(self) -> Self
Disables logging when the double-checked condition is not met.
§Returns
This builder with unmet-condition logging disabled.
Sourcepub fn log_prepare_failure(
self,
level: Level,
message_prefix: impl Into<String>,
) -> Self
pub fn log_prepare_failure( self, level: Level, message_prefix: impl Into<String>, ) -> Self
Sourcepub fn disable_prepare_failure_logging(self) -> Self
pub fn disable_prepare_failure_logging(self) -> Self
Disables logging when the prepare action fails.
§Returns
This builder with prepare failure logging disabled.
Sourcepub fn log_prepare_commit_failure(
self,
level: Level,
message_prefix: impl Into<String>,
) -> Self
pub fn log_prepare_commit_failure( self, level: Level, message_prefix: impl Into<String>, ) -> Self
Sourcepub fn disable_prepare_commit_failure_logging(self) -> Self
pub fn disable_prepare_commit_failure_logging(self) -> Self
Disables logging when the prepare commit action fails.
§Returns
This builder with prepare-commit failure logging disabled.
Sourcepub fn log_prepare_rollback_failure(
self,
level: Level,
message_prefix: impl Into<String>,
) -> Self
pub fn log_prepare_rollback_failure( self, level: Level, message_prefix: impl Into<String>, ) -> Self
Sourcepub fn disable_prepare_rollback_failure_logging(self) -> Self
pub fn disable_prepare_rollback_failure_logging(self) -> Self
Disables logging when the prepare rollback action fails.
§Returns
This builder with prepare-rollback failure logging disabled.
Sourcepub fn when<Tst>(self, tester: Tst) -> ExecutorReadyBuilder<L, T>
pub fn when<Tst>(self, tester: Tst) -> ExecutorReadyBuilder<L, T>
Configures the required double-checked condition.
The tester is executed outside and inside the lock. State read by the outside check must be safe to access without this executor’s lock.
§Parameters
tester- The reusable condition tester.
§Returns
The builder state that can configure prepare callbacks and build the executor.
Examples found in repository?
29fn main() -> Result<(), Box<dyn std::error::Error>> {
30 // Create shared state
31 let running = Arc::new(AtomicBool::new(false));
32 let data = ArcMutex::new(42);
33
34 println!("Initial state: running = {}", running.load(Ordering::Acquire));
35 println!("Initial data: {}", data.read(|d| *d));
36
37 let executor = DoubleCheckedLockExecutor::builder()
38 .on(data.clone())
39 .when({
40 let running = running.clone();
41 move || running.load(Ordering::Acquire)
42 })
43 .build();
44
45 // Try to execute when service is not running (should fail)
46 let result = executor
47 .call_with(|value: &mut i32| {
48 *value += 1;
49 Ok::<_, std::io::Error>(*value)
50 })
51 .get_result();
52
53 if result.is_success() {
54 println!("Unexpected success: {}", result.unwrap());
55 } else {
56 println!("Expected failure: Condition not met.");
57 }
58
59 // Start the service
60 running.store(true, Ordering::Release);
61 println!("Service started: running = {}", running.load(Ordering::Acquire));
62
63 // Now execute should succeed
64 let result = executor
65 .call_with(|value: &mut i32| {
66 *value += 1;
67 Ok::<_, std::io::Error>(*value)
68 })
69 .get_result();
70
71 if result.is_success() {
72 println!("Success: new value = {}", result.unwrap());
73 } else {
74 println!("Unexpected failure: {:?}", result);
75 }
76
77 // Verify the data was updated
78 println!("Final data: {}", data.read(|d| *d));
79
80 // Stop the service
81 running.store(false, Ordering::Release);
82 println!("Service stopped: running = {}", running.load(Ordering::Acquire));
83
84 // Try to execute when service is stopped (should fail)
85 let result = executor
86 .call_with(|value: &mut i32| {
87 *value += 1;
88 Ok::<_, std::io::Error>(*value)
89 })
90 .get_result();
91
92 if result.is_success() {
93 println!("Unexpected success: {}", result.unwrap());
94 } else {
95 println!("Expected failure: Condition not met.");
96 }
97
98 Ok(())
99}Sourcepub fn catch_panics(self) -> Self
pub fn catch_panics(self) -> Self
Enables panic capture for tester, prepare callbacks, and task execution.
§Returns
This builder with panic capture enabled.
Sourcepub fn with_panic_capture(self, catch_panics: bool) -> Self
pub fn with_panic_capture(self, catch_panics: bool) -> Self
Sourcepub fn disable_catch_panics(self) -> Self
pub fn disable_catch_panics(self) -> Self
Disables panic capture for tester, prepare callbacks, and task execution.
§Returns
This builder with panic capture disabled.