From 306d95b2f0689b9bb22144f8df7f4ef2c2e61ce9 Mon Sep 17 00:00:00 2001 From: roblabla Date: Mon, 12 Aug 2019 10:35:22 +0000 Subject: [PATCH] SM: Check if service already exists before creating port --- sm/src/main.rs | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/sm/src/main.rs b/sm/src/main.rs index fd5de8fb3..ddb1a3ba1 100644 --- a/sm/src/main.rs +++ b/sm/src/main.rs @@ -177,21 +177,28 @@ impl IUserInterfaceAsync for UserInterface { /// registered service. fn register_service(&mut self, _work_queue: WorkQueue<'static>, servicename: u64, is_light: bool, max_handles: u32) -> FutureObj<'_, Result> { let servicename = ServiceName(servicename); - let (clientport, serverport) = match syscalls::create_port(max_handles, is_light, &servicename.0.to_ne_bytes()) { - Ok(v) => v, - Err(err) => return FutureObj::new(Box::new(futures::future::err(err.into()))) + + let serverport = { + let mut services_lock = SERVICES.lock(); + let entry = match services_lock.entry(servicename) { + Entry::Occupied(_) => return FutureObj::new(Box::new(futures::future::err(SmError::ServiceAlreadyRegistered.into()))), + Entry::Vacant(vacant) => vacant, + }; + + let (clientport, serverport) = match syscalls::create_port(max_handles, is_light, &servicename.0.to_ne_bytes()) { + Ok(v) => v, + Err(err) => return FutureObj::new(Box::new(futures::future::err(err.into()))) + }; + + entry.insert(clientport); + + serverport }; - match SERVICES.lock().entry(servicename) { - Entry::Occupied(_) => FutureObj::new(Box::new(futures::future::err(SmError::ServiceAlreadyRegistered.into()))), - Entry::Vacant(vacant) => { - vacant.insert(clientport); - // Wake up potential get_service. - SERVICES_EVENT.0.signal().unwrap(); + // Wake up potential get_service. + SERVICES_EVENT.0.signal().unwrap(); - FutureObj::new(Box::new(futures::future::ok(serverport))) - } - } + FutureObj::new(Box::new(futures::future::ok(serverport))) } /// Unregister a service.