validate that rooms and dialogs are owned exclusively on shutdown
check-and-test / check-and-test (push) Successful in 1m18s
Details
check-and-test / check-and-test (push) Successful in 1m18s
Details
This commit is contained in:
parent
d305f5bf77
commit
a940114a14
|
@ -130,6 +130,21 @@ impl DialogRegistry {
|
||||||
let mut guard = self.0.write().await;
|
let mut guard = self.0.write().await;
|
||||||
guard.players = Some(players);
|
guard.players = Some(players);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn unset_players(&self) {
|
||||||
|
let mut guard = self.0.write().await;
|
||||||
|
guard.players = None;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn shutdown(self) -> Result<()> {
|
||||||
|
let res = match Arc::try_unwrap(self.0) {
|
||||||
|
Ok(e) => e,
|
||||||
|
Err(_) => return Err(fail("failed to acquire dialogs ownership on shutdown")),
|
||||||
|
};
|
||||||
|
let res = res.into_inner();
|
||||||
|
drop(res);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -40,8 +40,10 @@ impl LavinaCore {
|
||||||
|
|
||||||
pub async fn shutdown(mut self) -> Result<()> {
|
pub async fn shutdown(mut self) -> Result<()> {
|
||||||
self.players.shutdown_all().await?;
|
self.players.shutdown_all().await?;
|
||||||
drop(self.players);
|
self.dialogs.unset_players().await;
|
||||||
drop(self.rooms);
|
self.players.shutdown()?;
|
||||||
|
self.dialogs.shutdown()?;
|
||||||
|
self.rooms.shutdown()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,6 +258,16 @@ impl PlayerRegistry {
|
||||||
Ok(PlayerRegistry(Arc::new(RwLock::new(inner))))
|
Ok(PlayerRegistry(Arc::new(RwLock::new(inner))))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn shutdown(self) -> Result<()> {
|
||||||
|
let res = match Arc::try_unwrap(self.0) {
|
||||||
|
Ok(e) => e,
|
||||||
|
Err(_) => return Err(fail("failed to acquire players ownership on shutdown")),
|
||||||
|
};
|
||||||
|
let res = res.into_inner();
|
||||||
|
drop(res);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn get_player(&self, id: &PlayerId) -> Option<PlayerHandle> {
|
pub async fn get_player(&self, id: &PlayerId) -> Option<PlayerHandle> {
|
||||||
let inner = self.0.read().await;
|
let inner = self.0.read().await;
|
||||||
inner.players.get(id).map(|(handle, _)| handle.clone())
|
inner.players.get(id).map(|(handle, _)| handle.clone())
|
||||||
|
|
|
@ -48,6 +48,17 @@ impl RoomRegistry {
|
||||||
Ok(RoomRegistry(Arc::new(AsyncRwLock::new(inner))))
|
Ok(RoomRegistry(Arc::new(AsyncRwLock::new(inner))))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn shutdown(self) -> Result<()> {
|
||||||
|
let res = match Arc::try_unwrap(self.0) {
|
||||||
|
Ok(e) => e,
|
||||||
|
Err(_) => return Err(fail("failed to acquire rooms ownership on shutdown")),
|
||||||
|
};
|
||||||
|
let res = res.into_inner();
|
||||||
|
// TODO drop all rooms
|
||||||
|
drop(res);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn get_or_create_room(&mut self, room_id: RoomId) -> Result<RoomHandle> {
|
pub async fn get_or_create_room(&mut self, room_id: RoomId) -> Result<RoomHandle> {
|
||||||
let mut inner = self.0.write().await;
|
let mut inner = self.0.write().await;
|
||||||
if let Some(room_handle) = inner.get_or_load_room(&room_id).await? {
|
if let Some(room_handle) = inner.get_or_load_room(&room_id).await? {
|
||||||
|
|
|
@ -375,6 +375,11 @@ async fn scenario_two_users() -> Result<()> {
|
||||||
s1.expect(":tester1 PART #test").await?;
|
s1.expect(":tester1 PART #test").await?;
|
||||||
// The second user should receive the PART message
|
// The second user should receive the PART message
|
||||||
s2.expect(":tester1 PART #test").await?;
|
s2.expect(":tester1 PART #test").await?;
|
||||||
|
|
||||||
|
stream1.shutdown().await?;
|
||||||
|
stream2.shutdown().await?;
|
||||||
|
|
||||||
|
server.server.terminate().await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -694,5 +699,10 @@ async fn scenario_two_players_dialog() -> Result<()> {
|
||||||
s1.expect(":tester2 PRIVMSG tester1 :good").await?;
|
s1.expect(":tester2 PRIVMSG tester1 :good").await?;
|
||||||
s1.expect_nothing().await?;
|
s1.expect_nothing().await?;
|
||||||
|
|
||||||
|
stream1.shutdown().await?;
|
||||||
|
stream2.shutdown().await?;
|
||||||
|
|
||||||
|
server.server.terminate().await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue