From 3b3d6f1d46007ee79e357f35f510463dab6faf6e Mon Sep 17 00:00:00 2001 From: Cyrix126 <gupaxx@baermail.fr> Date: Wed, 30 Oct 2024 17:52:43 +0100 Subject: [PATCH] fix: potential deadlock --- src/helper/p2pool.rs | 4 ++-- src/helper/xrig/xmrig.rs | 4 ++-- src/helper/xrig/xmrig_proxy.rs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/helper/p2pool.rs b/src/helper/p2pool.rs index 362ea41..6d25f18 100644 --- a/src/helper/p2pool.rs +++ b/src/helper/p2pool.rs @@ -833,13 +833,14 @@ impl PubP2poolApi { process: &mut Process, ) { // 1. Take the process's current output buffer and combine it with Pub (if not empty) - let mut output_parse = output_parse.lock().unwrap(); let mut output_pub = output_pub.lock().unwrap(); if !output_pub.is_empty() { public.output.push_str(&std::mem::take(&mut *output_pub)); } + drop(output_pub); // 2. Parse the full STDOUT + let mut output_parse = output_parse.lock().unwrap(); let (payouts_new, xmr_new) = Self::calc_payouts_and_xmr(&output_parse); // Check for "SYNCHRONIZED" only if we aren't already. if process.state == ProcessState::Syncing { @@ -866,7 +867,6 @@ impl PubP2poolApi { // 3. Throw away [output_parse] output_parse.clear(); - drop(output_pub); drop(output_parse); // 4. Add to current values let (payouts, xmr) = (public.payouts + payouts_new, public.xmr + xmr_new); diff --git a/src/helper/xrig/xmrig.rs b/src/helper/xrig/xmrig.rs index 50e8d6c..f160798 100644 --- a/src/helper/xrig/xmrig.rs +++ b/src/helper/xrig/xmrig.rs @@ -746,7 +746,6 @@ impl PubXmrigApi { process: &mut Process, ) { // 1. Take the process's current output buffer and combine it with Pub (if not empty) - let mut output_parse = output_parse.lock().unwrap(); let mut output_pub = output_pub.lock().unwrap(); { @@ -756,7 +755,9 @@ impl PubXmrigApi { // Update uptime public.uptime = elapsed; } + drop(output_pub); + let mut output_parse = output_parse.lock().unwrap(); // 2. Check for "new job"/"no active...". if XMRIG_REGEX.new_job.is_match(&output_parse) { process.state = ProcessState::Alive; @@ -771,7 +772,6 @@ impl PubXmrigApi { // 3. Throw away [output_parse] output_parse.clear(); - drop(output_pub); drop(output_parse); } diff --git a/src/helper/xrig/xmrig_proxy.rs b/src/helper/xrig/xmrig_proxy.rs index 62991b8..683308a 100644 --- a/src/helper/xrig/xmrig_proxy.rs +++ b/src/helper/xrig/xmrig_proxy.rs @@ -504,7 +504,6 @@ impl PubXmrigProxyApi { process: &mut Process, ) { // 1. Take the process's current output buffer and combine it with Pub (if not empty) - let mut output_parse = output_parse.lock().unwrap(); let mut output_pub = output_pub.lock().unwrap(); { @@ -515,6 +514,8 @@ impl PubXmrigProxyApi { public.uptime = elapsed; } + drop(output_pub); + let mut output_parse = output_parse.lock().unwrap(); // 2. Check for "new job"/"no active...". if XMRIG_REGEX.new_job.is_match(&output_parse) || XMRIG_REGEX.valid_conn.is_match(&output_parse) @@ -533,7 +534,6 @@ impl PubXmrigProxyApi { } // 3. Throw away [output_parse] output_parse.clear(); - drop(output_pub); drop(output_parse); } // same method as PubXmrigApi, why not make a trait ?