From 4e562a86a7cf0bc00c02320f7707857c38e4988c Mon Sep 17 00:00:00 2001 From: Koxiaet <38139193+Koxiaet@users.noreply.github.com> Date: Fri, 16 Oct 2020 06:52:52 +0100 Subject: [PATCH] Avoid locking extensions mutex when possible --- src/extensions/mod.rs | 32 +++++++++++++++++--------------- src/schema.rs | 2 +- src/validation/suggestion.rs | 5 ++--- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/extensions/mod.rs b/src/extensions/mod.rs index 6390171b..f79386ae 100644 --- a/src/extensions/mod.rs +++ b/src/extensions/mod.rs @@ -196,13 +196,13 @@ impl Extensions { } pub async fn prepare_request( - &self, + &mut self, ctx: &ExtensionContext<'_>, request: Request, ) -> ServerResult { let mut request = request; - if let Some(e) = &self.0 { - for e in e.lock().iter_mut() { + if let Some(e) = &mut self.0 { + for e in e.get_mut().iter_mut() { request = e.prepare_request(ctx, request).await?; } } @@ -210,33 +210,35 @@ impl Extensions { } pub fn parse_start( - &self, + &mut self, ctx: &ExtensionContext<'_>, query_source: &str, variables: &Variables, ) { - if let Some(e) = &self.0 { - e.lock() + if let Some(e) = &mut self.0 { + e.get_mut() .iter_mut() .for_each(|e| e.parse_start(ctx, query_source, variables)); } } - pub fn parse_end(&self, ctx: &ExtensionContext<'_>, document: &ExecutableDocument) { - if let Some(e) = &self.0 { - e.lock().iter_mut().for_each(|e| e.parse_end(ctx, document)); + pub fn parse_end(&mut self, ctx: &ExtensionContext<'_>, document: &ExecutableDocument) { + if let Some(e) = &mut self.0 { + e.get_mut() + .iter_mut() + .for_each(|e| e.parse_end(ctx, document)); } } - pub fn validation_start(&self, ctx: &ExtensionContext<'_>) { - if let Some(e) = &self.0 { - e.lock().iter_mut().for_each(|e| e.validation_start(ctx)); + pub fn validation_start(&mut self, ctx: &ExtensionContext<'_>) { + if let Some(e) = &mut self.0 { + e.get_mut().iter_mut().for_each(|e| e.validation_start(ctx)); } } - pub fn validation_end(&self, ctx: &ExtensionContext<'_>) { - if let Some(e) = &self.0 { - e.lock().iter_mut().for_each(|e| e.validation_end(ctx)); + pub fn validation_end(&mut self, ctx: &ExtensionContext<'_>) { + if let Some(e) = &mut self.0 { + e.get_mut().iter_mut().for_each(|e| e.validation_end(ctx)); } } diff --git a/src/schema.rs b/src/schema.rs index 6b2f32bd..0a294747 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -333,7 +333,7 @@ where request: Request, ) -> Result<(QueryEnvInner, CacheControl), Vec> { // create extension instances - let extensions: Extensions = self + let mut extensions: Extensions = self .0 .extensions .iter() diff --git a/src/validation/suggestion.rs b/src/validation/suggestion.rs index 2b661512..5da60ddd 100644 --- a/src/validation/suggestion.rs +++ b/src/validation/suggestion.rs @@ -39,9 +39,8 @@ where } selected.sort_by(|a, b| distances[a].cmp(&distances[b])); - let mut suggestion = String::with_capacity( - prefix.len() + selected.iter().map(|s| s.len() + 5).sum::() - ); + let mut suggestion = + String::with_capacity(prefix.len() + selected.iter().map(|s| s.len() + 5).sum::()); suggestion.push_str(prefix); suggestion.push(' ');