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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
//! # procref - Cross-platform Process Reference Counting
//!
//! A library for managing shared service lifecycles across multiple processes
//! using kernel-level reference counting mechanisms.
//!
//! ## Platform Support
//!
//! | Platform | Mechanism | Auto-cleanup on crash |
//! |----------|-----------|----------------------|
//! | Linux | System V Semaphore + SEM_UNDO | ✅ Kernel auto-undo |
//! | macOS | Mach Port send rights | ✅ Kernel auto-release |
//! | Windows | Named Semaphore | ✅ Handle auto-close |
//!
//! ## Design Philosophy
//!
//! This library trusts the **kernel** to manage reference counts, not userspace files.
//! When a process crashes:
//! - The kernel automatically decrements the reference count
//! - No stale state accumulates
//! - No manual cleanup needed
//!
//! Files (like port hints) are just **hints** for optimization, not the source of truth.
//! The actual process state is always verified against reality.
//!
//! ## Lifecycle Callbacks
//!
//! The library provides hooks for business logic at key lifecycle points:
//! - `on_first_acquire`: Called when first client registers (count 0→1)
//! - `on_last_release`: Called when last client exits (count 1→0)
//! - `on_health_check`: Called to verify service is healthy
//! - `on_recover`: Called when service needs recovery
//!
//! ## Usage
//!
//! ```no_run
//! use procref::{SharedService, ServiceInfo};
//!
//! # async fn example() -> procref::Result<()> {
//! let service = SharedService::builder("my-database")
//! .on_first_acquire(|| async {
//! // Start the database process
//! let port = 5432;
//! let pid = start_database(port)?;
//! Ok(ServiceInfo::new(pid, port))
//! })
//! .on_last_release(|info| async move {
//! // Stop the database when last client exits
//! procref::process::terminate(info.pid());
//! Ok(())
//! })
//! .build()?;
//!
//! // Acquire a reference (starts service if first client)
//! let handle = service.acquire().await?;
//! println!("Service running on port {}", handle.info().port());
//!
//! // handle.drop() releases reference
//! // If last client, on_last_release is called
//! # Ok(())
//! # }
//! # fn start_database(_: u16) -> procref::Result<u32> { Ok(0) }
//! ```
pub use ;
pub use PlatformRefCounter;
pub use ;
pub use ServiceInfo;
/// Core trait for kernel-level reference counting.
///
/// Implementations must guarantee that reference counts are automatically
/// decremented by the kernel when a process crashes or exits abnormally.
///
/// This is NOT a userspace reference count - it relies on OS primitives
/// that the kernel manages.
/// Utility functions for process management.