From 9114c24cd30766ede422e2a07349be86ca885e14 Mon Sep 17 00:00:00 2001 From: He1pa <56333845+He1pa@users.noreply.github.com> Date: Mon, 21 Oct 2024 19:48:52 +0800 Subject: [PATCH] fix: fix parser cache dead lock (#1706) Signed-off-by: he1pa <18012015693@163.com> --- kclvm/parser/src/lib.rs | 58 ++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/kclvm/parser/src/lib.rs b/kclvm/parser/src/lib.rs index 4287c0f0f..970901b3f 100644 --- a/kclvm/parser/src/lib.rs +++ b/kclvm/parser/src/lib.rs @@ -813,41 +813,39 @@ pub fn parse_entry( let mut unparsed_file: VecDeque = dependent_paths.into(); while let Some(file) = unparsed_file.pop_front() { - let deps = { - match &mut module_cache.read() { - Ok(m_cache) => { - if let Some(m) = m_cache.ast_cache.get(&file.canonicalize()) { - let deps = get_deps(&file, m.as_ref(), pkgs, pkgmap, opts, sess.clone())?; - - match &mut file_graph.write() { - Ok(file_graph) => { - file_graph.update_file(&file, &deps); - if file_graph.toposort().is_ok() { - unparsed_file.extend(deps); - } - continue; + let module_cache_read = module_cache.read(); + match &module_cache_read { + Ok(m_cache) => match m_cache.ast_cache.get(&file.canonicalize()) { + Some(m) => { + let deps = get_deps(&file, m.as_ref(), pkgs, pkgmap, opts, sess.clone())?; + match &mut file_graph.write() { + Ok(file_graph) => { + file_graph.update_file(&file, &deps); + if file_graph.toposort().is_ok() { + unparsed_file.extend(deps); } - Err(e) => return Err(anyhow::anyhow!("Parse entry failed: {e}")), + continue; } + Err(e) => return Err(anyhow::anyhow!("Parse entry failed: {e}")), } } - Err(e) => return Err(anyhow::anyhow!("Parse entry failed: {e}")), - } - - let deps = parse_file( - sess.clone(), - file, - None, - module_cache.clone(), - pkgs, - pkgmap, - file_graph.clone(), - &opts, - )?; - deps + None => { + drop(module_cache_read); + let deps = parse_file( + sess.clone(), + file, + None, + module_cache.clone(), + pkgs, + pkgmap, + file_graph.clone(), + &opts, + )?; + unparsed_file.extend(deps); + } + }, + Err(e) => return Err(anyhow::anyhow!("Parse entry failed: {e}")), }; - - unparsed_file.extend(deps); } Ok(()) }