Do not allow for double initialization

This commit is contained in:
Daniel Sanchez Quiros 2022-09-30 18:39:38 +02:00
parent 14b001a167
commit e521879094
2 changed files with 27 additions and 19 deletions

View File

@ -12,7 +12,7 @@ use crate::general::Result;
pub use config::WakuNodeConfig; pub use config::WakuNodeConfig;
/// Shared flag to check if a waku node is already running in the current process /// Shared flag to check if a waku node is already running in the current process
static WAKU_NODE_RUNNING: Mutex<bool> = Mutex::new(false); static WAKU_NODE_INITIALIZED: Mutex<bool> = Mutex::new(false);
/// Marker trait to disallow undesired waku node states in the handle /// Marker trait to disallow undesired waku node states in the handle
pub trait WakuNodeState {} pub trait WakuNodeState {}
@ -37,32 +37,38 @@ impl<State: WakuNodeState> WakuNodeHandle<State> {
node::waku_listen_addressses() node::waku_listen_addressses()
} }
} }
fn stop_node() -> Result<()> {
let mut node_initialized = WAKU_NODE_INITIALIZED
.lock()
.expect("Access to the mutex at some point");
*node_initialized = false;
node::waku_stop().map(|_| ())
}
impl WakuNodeHandle<Initialized> { impl WakuNodeHandle<Initialized> {
pub fn start(self) -> Result<WakuNodeHandle<Running>> { pub fn start(self) -> Result<WakuNodeHandle<Running>> {
let mut node_running = WAKU_NODE_RUNNING node::waku_start().map(|_| WakuNodeHandle(Default::default()))
.lock() }
.expect("Access to the mutex at some point");
if *node_running { pub fn stop(self) -> Result<()> {
return Err("Waku node is already running".into()); stop_node()
}
match node::waku_start() {
Ok(_) => {
*node_running = true;
Ok(WakuNodeHandle(Default::default()))
}
Err(e) => Err(e),
}
} }
} }
impl WakuNodeHandle<Running> { impl WakuNodeHandle<Running> {
pub fn stop(self) -> Result<()> { pub fn stop(self) -> Result<()> {
node::waku_stop().map(|_| ()) stop_node()
} }
} }
pub fn waku_new(config: Option<WakuNodeConfig>) -> Result<WakuNodeHandle<Initialized>> { pub fn waku_new(config: Option<WakuNodeConfig>) -> Result<WakuNodeHandle<Initialized>> {
let mut node_initialized = WAKU_NODE_INITIALIZED
.lock()
.expect("Access to the mutex at some point");
if *node_initialized {
return Err("Waku node is already initialized".into());
}
*node_initialized = true;
node::waku_new(config).map(|_| WakuNodeHandle(Default::default())) node::waku_new(config).map(|_| WakuNodeHandle(Default::default()))
} }
@ -73,9 +79,9 @@ mod tests {
#[test] #[test]
fn exclusive_running() { fn exclusive_running() {
let handle1 = waku_new(None).unwrap(); let handle1 = waku_new(None).unwrap();
let handle2 = waku_new(None).unwrap(); let handle2 = waku_new(None);
let stop_handle1 = handle1.start().unwrap(); assert!(handle2.is_err());
assert!(handle2.start().is_err()); let stop_handle = handle1.start().unwrap();
stop_handle1.stop().unwrap(); stop_handle.stop().unwrap();
} }
} }

View File

@ -96,6 +96,7 @@ mod test {
let id = waku_peer_id().unwrap(); let id = waku_peer_id().unwrap();
dbg!(&id); dbg!(&id);
assert!(!id.is_empty()); assert!(!id.is_empty());
waku_stop().unwrap();
} }
#[test] #[test]
@ -104,5 +105,6 @@ mod test {
let addresses = waku_listen_addressses().unwrap(); let addresses = waku_listen_addressses().unwrap();
dbg!(&addresses); dbg!(&addresses);
assert!(!addresses.is_empty()); assert!(!addresses.is_empty());
waku_stop().unwrap();
} }
} }