From 1f44b66f0826bbe3ba0375e126e357a24f69d3ec Mon Sep 17 00:00:00 2001 From: Mark <> Date: Mon, 15 Apr 2024 17:26:06 +0200 Subject: [PATCH] fix a deadlock when using recursive `try`s --- mers/Cargo.toml | 4 ++-- mers_lib/Cargo.toml | 2 +- mers_lib/src/program/run/try.rs | 9 +++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/mers/Cargo.toml b/mers/Cargo.toml index 3d0f0ac..9c7a627 100644 --- a/mers/Cargo.toml +++ b/mers/Cargo.toml @@ -11,7 +11,7 @@ repository = "https://github.com/Dummi26/mers" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -mers_lib = "0.8.0" -# mers_lib = { path = "../mers_lib" } +# mers_lib = "0.8.0" +mers_lib = { path = "../mers_lib" } clap = { version = "4.3.19", features = ["derive"] } colored = "2.1.0" diff --git a/mers_lib/Cargo.toml b/mers_lib/Cargo.toml index aafe9f3..69cf8ff 100755 --- a/mers_lib/Cargo.toml +++ b/mers_lib/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mers_lib" -version = "0.8.0" +version = "0.8.1" edition = "2021" license = "MIT OR Apache-2.0" description = "library to use the mers language in other projects" diff --git a/mers_lib/src/program/run/try.rs b/mers_lib/src/program/run/try.rs index 3ba6fef..bd339ba 100644 --- a/mers_lib/src/program/run/try.rs +++ b/mers_lib/src/program/run/try.rs @@ -33,8 +33,8 @@ impl MersStatement for Try { .collect::, CheckError>>()?; let mut index_lock = self.index_of_unused_try_statement.lock().unwrap(); let mut unused_try_statements_lock = info.global.unused_try_statements.lock().unwrap(); - let used = if let Some(i) = *index_lock { - &mut unused_try_statements_lock[i] + let my_index = if let Some(i) = *index_lock { + i } else { let my_index = unused_try_statements_lock.len(); *index_lock = Some(my_index); @@ -42,8 +42,9 @@ impl MersStatement for Try { self.pos_in_src.clone(), self.funcs.iter().map(|v| Some(v.source_range())).collect(), )); - &mut unused_try_statements_lock[my_index] + my_index }; + drop(unused_try_statements_lock); drop(index_lock); for arg in arg.subtypes_type().types.iter() { let mut found = false; @@ -79,7 +80,7 @@ impl MersStatement for Try { errs.push(err); } else { // found the function to use - used.1[i] = None; + info.global.unused_try_statements.lock().unwrap()[my_index].1[i] = None; found = true; t.add_all(&func_res); break;