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 ?