Synchronization tweaks for IPC services (#2028)

* using sequentally consistent checks

* making shutdown method synchronous

* redndant line
This commit is contained in:
Nikolay Volf 2016-09-01 14:04:19 +04:00 committed by Arkadiy Paronyan
parent b4f3c4bd7a
commit 3439c06a1c
3 changed files with 8 additions and 6 deletions

View File

@ -42,7 +42,7 @@ pub struct ModuleState {
#[derive(Ipc)] #[derive(Ipc)]
pub trait ControlService { pub trait ControlService {
fn shutdown(&self); fn shutdown(&self) -> bool;
} }
#[derive(Ipc)] #[derive(Ipc)]

View File

@ -42,7 +42,7 @@ pub fn host_service<T: ?Sized + Send + Sync + 'static>(addr: &str, stop_guard: A
let mut worker = nanoipc::Worker::<T>::new(&service); let mut worker = nanoipc::Worker::<T>::new(&service);
worker.add_reqrep(&socket_url).unwrap(); worker.add_reqrep(&socket_url).unwrap();
while !stop_guard.load(Ordering::Relaxed) { while !stop_guard.load(Ordering::SeqCst) {
worker.poll(); worker.poll();
} }
}); });

View File

@ -31,9 +31,10 @@ struct SyncControlService {
} }
impl ControlService for SyncControlService { impl ControlService for SyncControlService {
fn shutdown(&self) { fn shutdown(&self) -> bool {
trace!(target: "hypervisor", "Received shutdown from control service"); trace!(target: "hypervisor", "Received shutdown from control service");
self.stop.store(true, ::std::sync::atomic::Ordering::Relaxed); self.stop.store(true, ::std::sync::atomic::Ordering::SeqCst);
true
} }
} }
@ -75,14 +76,15 @@ pub fn main() {
let control_service = Arc::new(SyncControlService::default()); let control_service = Arc::new(SyncControlService::default());
let as_control = control_service.clone() as Arc<ControlService>; let as_control = control_service.clone() as Arc<ControlService>;
let mut worker = nanoipc::Worker::<ControlService>::new(&as_control); let mut worker = nanoipc::Worker::<ControlService>::new(&as_control);
let thread_stop = control_service.stop.clone();
worker.add_reqrep( worker.add_reqrep(
&service_urls::with_base(&service_config.io_path, service_urls::SYNC_CONTROL) &service_urls::with_base(&service_config.io_path, service_urls::SYNC_CONTROL)
).unwrap(); ).unwrap();
while !control_service.stop.load(::std::sync::atomic::Ordering::Relaxed) { while !thread_stop.load(::std::sync::atomic::Ordering::SeqCst) {
worker.poll(); worker.poll();
} }
service_stop.store(true, ::std::sync::atomic::Ordering::Relaxed); service_stop.store(true, ::std::sync::atomic::Ordering::SeqCst);
hypervisor.module_shutdown(SYNC_MODULE_ID); hypervisor.module_shutdown(SYNC_MODULE_ID);
trace!(target: "hypervisor", "Sync process terminated gracefully"); trace!(target: "hypervisor", "Sync process terminated gracefully");