mod static_run;
use std::sync::atomic::Ordering;
use super::SupervisorCore;
use crate::error::RuntimeError;
impl SupervisorCore {
pub(crate) fn start(&self) -> Result<(), RuntimeError> {
if self.started.load(Ordering::Acquire) {
return Ok(());
}
let _startup = self
.startup_gate
.lock()
.unwrap_or_else(|error| error.into_inner());
if self.started.load(Ordering::Acquire) {
return Ok(());
}
tokio::runtime::Handle::try_current().map_err(|_| RuntimeError::TokioRuntimeUnavailable)?;
self.subs.start()?;
if self.bus.is_enabled() {
self.subscriber_listener();
}
self.registry.clone().spawn_listener();
#[cfg(feature = "controller")]
if let Some(controller) = self.controller.get().and_then(std::sync::Weak::upgrade) {
controller.run();
}
self.started.store(true, Ordering::Release);
Ok(())
}
}