mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
lock on streams to allow parallel send
This commit is contained in:
parent
1166893fd4
commit
1cb6101326
@ -67,9 +67,9 @@ impl Client {
|
||||
|
||||
pub(crate) fn send<M: Into<ServerMsg>>(&self, msg: M) -> Result<(), StreamError> {
|
||||
match msg.into() {
|
||||
ServerMsg::Info(m) => self.register_stream.try_lock().unwrap().send(m),
|
||||
ServerMsg::Init(m) => self.register_stream.try_lock().unwrap().send(m),
|
||||
ServerMsg::RegisterAnswer(m) => self.register_stream.try_lock().unwrap().send(m),
|
||||
ServerMsg::Info(m) => self.register_stream.lock().unwrap().send(m),
|
||||
ServerMsg::Init(m) => self.register_stream.lock().unwrap().send(m),
|
||||
ServerMsg::RegisterAnswer(m) => self.register_stream.lock().unwrap().send(m),
|
||||
ServerMsg::General(g) => {
|
||||
match g {
|
||||
//Character Screen related
|
||||
@ -78,7 +78,7 @@ impl Client {
|
||||
| ServerGeneral::CharacterActionError(_)
|
||||
| ServerGeneral::CharacterCreated(_)
|
||||
| ServerGeneral::CharacterSuccess => {
|
||||
self.character_screen_stream.try_lock().unwrap().send(g)
|
||||
self.character_screen_stream.lock().unwrap().send(g)
|
||||
},
|
||||
//Ingame related
|
||||
ServerGeneral::GroupUpdate(_)
|
||||
@ -92,12 +92,12 @@ impl Client {
|
||||
| ServerGeneral::Knockback(_)
|
||||
| ServerGeneral::UpdatePendingTrade(_, _)
|
||||
| ServerGeneral::FinishedTrade(_) => {
|
||||
self.in_game_stream.try_lock().unwrap().send(g)
|
||||
self.in_game_stream.lock().unwrap().send(g)
|
||||
},
|
||||
//Ingame related, terrain
|
||||
ServerGeneral::TerrainChunkUpdate { .. }
|
||||
| ServerGeneral::TerrainBlockUpdates(_) => {
|
||||
self.terrain_stream.try_lock().unwrap().send(g)
|
||||
self.terrain_stream.lock().unwrap().send(g)
|
||||
},
|
||||
// Always possible
|
||||
ServerGeneral::PlayerListUpdate(_)
|
||||
@ -110,12 +110,10 @@ impl Client {
|
||||
| ServerGeneral::CreateEntity(_)
|
||||
| ServerGeneral::DeleteEntity(_)
|
||||
| ServerGeneral::Disconnect(_)
|
||||
| ServerGeneral::Notification(_) => {
|
||||
self.general_stream.try_lock().unwrap().send(g)
|
||||
},
|
||||
| ServerGeneral::Notification(_) => self.general_stream.lock().unwrap().send(g),
|
||||
}
|
||||
},
|
||||
ServerMsg::Ping(m) => self.ping_stream.try_lock().unwrap().send(m),
|
||||
ServerMsg::Ping(m) => self.ping_stream.lock().unwrap().send(m),
|
||||
}
|
||||
}
|
||||
|
||||
@ -123,32 +121,16 @@ impl Client {
|
||||
|
||||
pub(crate) fn send_prepared(&self, msg: &PreparedMsg) -> Result<(), StreamError> {
|
||||
match msg.stream_id {
|
||||
0 => self
|
||||
.register_stream
|
||||
.try_lock()
|
||||
.unwrap()
|
||||
.send_raw(&msg.message),
|
||||
0 => self.register_stream.lock().unwrap().send_raw(&msg.message),
|
||||
1 => self
|
||||
.character_screen_stream
|
||||
.try_lock()
|
||||
.unwrap()
|
||||
.send_raw(&msg.message),
|
||||
2 => self
|
||||
.in_game_stream
|
||||
.try_lock()
|
||||
.unwrap()
|
||||
.send_raw(&msg.message),
|
||||
3 => self
|
||||
.general_stream
|
||||
.try_lock()
|
||||
.unwrap()
|
||||
.send_raw(&msg.message),
|
||||
4 => self.ping_stream.try_lock().unwrap().send_raw(&msg.message),
|
||||
5 => self
|
||||
.terrain_stream
|
||||
.try_lock()
|
||||
.lock()
|
||||
.unwrap()
|
||||
.send_raw(&msg.message),
|
||||
2 => self.in_game_stream.lock().unwrap().send_raw(&msg.message),
|
||||
3 => self.general_stream.lock().unwrap().send_raw(&msg.message),
|
||||
4 => self.ping_stream.lock().unwrap().send_raw(&msg.message),
|
||||
5 => self.terrain_stream.lock().unwrap().send_raw(&msg.message),
|
||||
_ => unreachable!("invalid stream id"),
|
||||
}
|
||||
}
|
||||
@ -227,7 +209,7 @@ impl PreparedMsg {
|
||||
fn new<M: Serialize + ?Sized>(id: u8, msg: &M, stream: &Mutex<Stream>) -> PreparedMsg {
|
||||
Self {
|
||||
stream_id: id,
|
||||
message: Message::serialize(&msg, &stream.try_lock().unwrap()),
|
||||
message: Message::serialize(&msg, &stream.lock().unwrap()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,15 +6,17 @@ pub mod register;
|
||||
pub mod terrain;
|
||||
|
||||
use crate::client::Client;
|
||||
use common_ecs::dispatch;
|
||||
use common_ecs::{dispatch, System};
|
||||
use serde::de::DeserializeOwned;
|
||||
use specs::DispatcherBuilder;
|
||||
|
||||
pub fn add_server_systems(dispatch_builder: &mut DispatcherBuilder) {
|
||||
//run ping after general, as its super fast anyway. also don't get duplicate
|
||||
// disconnect then.
|
||||
dispatch::<character_screen::Sys>(dispatch_builder, &[]);
|
||||
dispatch::<general::Sys>(dispatch_builder, &[]);
|
||||
dispatch::<in_game::Sys>(dispatch_builder, &[]);
|
||||
dispatch::<ping::Sys>(dispatch_builder, &[]);
|
||||
dispatch::<ping::Sys>(dispatch_builder, &[&general::Sys::sys_name()]);
|
||||
dispatch::<register::Sys>(dispatch_builder, &[]);
|
||||
dispatch::<terrain::Sys>(dispatch_builder, &[]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user