1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//! A lightweight crate for detecting process forks.
//!
//! ```rust
//! let mut guard = forkguard::new();
//!
//! // Some time later...
//! if guard.detected_fork() {
//! // Handle the fork (e.g., re-initialize state)
//! }
//! ```
//!
//! This crate provides `Guard` types that can detect if the current process has
//! been forked since the last check. This is useful for resetting state (like
//! random number generators or connection pools) that should not be shared between
//! a parent and its forked child.
//!
//! Depending on the platform and enabled features, [`new()`] returns one of three
//! specialized `Guard` flavors:
//!
//! - [`atfork::Guard`] (Unix with `atfork` crate feature): Uses `pthread_atfork()` to
//! update the global state on fork. This is the most efficient detection
//! mechanism for supported Unix-like systems, though the usual caveats of fork
//! handlers apply.
//! - [`pid::Guard`] (Unix default): Tracks the process ID and detects changes. This
//! is a simple and sufficiently efficient option for Unix-like platforms unless
//! `getpid()` overhead is a concern.
//! - [`noop::Guard`] (Non-Unix): Provides a no-op implementation that always returns
//! `false`, used on platforms where fork detection is not required.
//!
//! # Crate features
//!
//! - `atfork` (optional): See the above description.
pub use Guard;
pub use Guard;
pub use Guard;
/// Creates a new fork `Guard` instance.
///
/// The behavior of the returned `Guard` depends on the platform and enabled features:
///
/// - Unix with `atfork` feature: Returns [`atfork::Guard`], which uses `pthread_atfork()` to
/// detect forks.
/// - Unix without `atfork` feature: Returns [`pid::Guard`], which tracks changes in the process
/// ID.
/// - Non-Unix platforms: Returns [`noop::Guard`], which never detects a fork.