Fix deadlock while initializing JSON language server
Julia
and
Max Brunsfeld
created
As it turns out both parking-lot and std's `RwLock` disallows taking
multiple read locks on the same thread
Co-Authored-By: Max Brunsfeld <max@zed.dev>
@@ -567,20 +567,25 @@ impl LanguageRegistry {
}
pub fn workspace_configuration(&self, cx: &mut MutableAppContext) -> Task<serde_json::Value> {
- let state = self.state.read();
+ let lsp_adapters = {
+ let state = self.state.read();
+ state
+ .available_languages
+ .iter()
+ .filter_map(|l| l.lsp_adapter.clone())
+ .chain(
+ state
+ .languages
+ .iter()
+ .filter_map(|l| l.adapter.as_ref().map(|a| a.adapter.clone())),
+ )
+ .collect::<Vec<_>>()
+ };
+
let mut language_configs = Vec::new();
- for language in &state.available_languages {- if let Some(adapter) = language.lsp_adapter.as_ref() {- if let Some(language_config) = adapter.workspace_configuration(cx) {- language_configs.push(language_config);- }- }- }- for language in &state.languages {- if let Some(adapter) = language.lsp_adapter() {- if let Some(language_config) = adapter.workspace_configuration(cx) {- language_configs.push(language_config);- }
+ for adapter in &lsp_adapters {
+ if let Some(language_config) = adapter.workspace_configuration(cx) {
+ language_configs.push(language_config);
}
}