process_lock/lib.rs
1
2extern crate libc;
3extern crate winapi;
4
5use std::io::Result;
6
7mod sys;
8pub use sys::LockGuard;
9pub struct ProcessLock(sys::ProcessLock);
10/// 提供进程间的共享内存模块
11/// 其中unix使用semget, semctl, semop, 其中用特殊的标识位SEM_UNDO来实现, 防止进程意外退出导致的死锁
12/// 其实windows使用CreateMutex, ReleaseMutex, WaitForSingleObject来实现
13/// # Examples, Open Double Process for same
14///
15/// ```no_run
16/// extern crate process_lock;
17/// use std::time::{Duration, Instant};
18/// use process_lock::*;
19/// fn main () {
20/// let mut lock = ProcessLock::new(String::from(".process_lock"), None).unwrap();
21/// for i in 0..100 {
22/// let now = Instant::now();
23/// {
24/// let _guard = lock.lock().unwrap();
25/// println!("success get the {} lock lock all use time ===== {}", i, now.elapsed().as_secs());
26/// let ten_millis = ::std::time::Duration::from_millis(2000);
27/// ::std::thread::sleep(ten_millis);
28/// }
29/// let ten_millis = ::std::time::Duration::from_millis(100);
30/// ::std::thread::sleep(ten_millis);
31/// }
32/// }
33/// ```
34impl ProcessLock {
35 /// 首先打开命名的进程锁, 如果打开失败, 则创建一个新的进程锁, 并赋与初始变量
36 pub fn new(name: String, path_name: Option<String>) -> Result<ProcessLock> {
37 Ok(ProcessLock(sys::ProcessLock::new(name, path_name)?))
38 }
39
40 /// 立即返回获取进程锁, 如果成功则返回LockGuard, 如果失败则返回Ok(None), 如果发生错误则返回Error
41 pub fn trylock(&self) -> Result<Option<LockGuard>> {
42 self.0.trylock()
43 }
44
45 /// 无限等待获取进程锁, 如果成功返回LockGuard, 如果被打断则系统发生错误, 可查看Error处理具体的错误
46 /// LockGuard析构会自动解锁
47 pub fn lock(&self) -> Result<LockGuard> {
48 self.0.lock()
49 }
50
51 /// 释放进程锁, 通常情况不主动调用, 由LockGuard的生存周期来控制锁的占用周期
52 pub fn unlock(&self) -> Result<()> {
53 self.0.unlock()
54 }
55
56 /// 销毁进程锁, 把handle或者sem_id主动删除
57 pub fn destory(&mut self) -> Result<()> {
58 self.0.destory()
59 }
60}