diff --git a/zed/src/rpc.rs b/zed/src/rpc.rs index fe1dde4ffba2d2579fcfe036cb3b162126fa1847..d4315a44d42f7de2b40a07eeaabefd7d1994f7c8 100644 --- a/zed/src/rpc.rs +++ b/zed/src/rpc.rs @@ -371,11 +371,11 @@ impl Client { if let Some(extract_entity_id) = state.entity_id_extractors.get(&message.payload_type_id()) { + let payload_type_id = message.payload_type_id(); let entity_id = (extract_entity_id)(message.as_ref()); - if let Some(handler) = state - .model_handlers - .get_mut(&(message.payload_type_id(), entity_id)) - { + let handler_key = (payload_type_id, entity_id); + if let Some(mut handler) = state.model_handlers.remove(&handler_key) { + drop(state); // Avoid deadlocks if the handler interacts with rpc::Client let start_time = Instant::now(); log::info!("RPC client message {}", message.payload_type_name()); (handler)(message, &mut cx); @@ -383,6 +383,10 @@ impl Client { "RPC message handled. duration:{:?}", start_time.elapsed() ); + this.state + .write() + .model_handlers + .insert(handler_key, handler); } else { log::info!("unhandled message {}", message.payload_type_name()); }