This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch releases/12.12
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/releases/12.12 by this push:
     new 68a4632f5dc drivers/battery: fix race condition in event handling
68a4632f5dc is described below

commit 68a4632f5dc3bcdd2f6f8ecbbefde98945f3f21e
Author: dongjiuzhu1 <[email protected]>
AuthorDate: Tue Nov 19 21:00:04 2024 +0800

    drivers/battery: fix race condition in event handling
    
    Move mutex lock before checking flist to prevent race condition where
    events could be lost when occurring simultaneously with service opening.
    
    Signed-off-by: dongjiuzhu1 <[email protected]>
---
 drivers/power/battery/battery_charger.c | 15 ++++++++-------
 drivers/power/battery/battery_gauge.c   | 15 ++++++++-------
 drivers/power/battery/battery_monitor.c | 15 ++++++++-------
 3 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/drivers/power/battery/battery_charger.c 
b/drivers/power/battery/battery_charger.c
index ba4f74a4ac6..6f3bda6f974 100644
--- a/drivers/power/battery/battery_charger.c
+++ b/drivers/power/battery/battery_charger.c
@@ -474,18 +474,18 @@ int battery_charger_changed(FAR struct 
battery_charger_dev_s *dev,
 
   /* Event happen too early? */
 
+  ret = nxmutex_lock(&dev->batlock);
+  if (ret < 0)
+    {
+      return ret;
+    }
+
   if (list_is_clear(&dev->flist))
     {
       /* Yes, record it and return directly */
 
       dev->mask |= mask;
-      return 0;
-    }
-
-  ret = nxmutex_lock(&dev->batlock);
-  if (ret < 0)
-    {
-      return ret;
+      goto out;
     }
 
   dev->mask |= mask;
@@ -495,6 +495,7 @@ int battery_charger_changed(FAR struct 
battery_charger_dev_s *dev,
       battery_charger_notify(priv, mask);
     }
 
+out:
   nxmutex_unlock(&dev->batlock);
   return OK;
 }
diff --git a/drivers/power/battery/battery_gauge.c 
b/drivers/power/battery/battery_gauge.c
index 3b52b5d827f..3363ca694f1 100644
--- a/drivers/power/battery/battery_gauge.c
+++ b/drivers/power/battery/battery_gauge.c
@@ -434,18 +434,18 @@ int battery_gauge_changed(FAR struct battery_gauge_dev_s 
*dev,
 
   /* Event happen too early? */
 
+  ret = nxmutex_lock(&dev->batlock);
+  if (ret < 0)
+    {
+      return ret;
+    }
+
   if (list_is_clear(&dev->flist))
     {
       /* Yes, record it and return directly */
 
       dev->mask |= mask;
-      return 0;
-    }
-
-  ret = nxmutex_lock(&dev->batlock);
-  if (ret < 0)
-    {
-      return ret;
+      goto out;
     }
 
   dev->mask |= mask;
@@ -455,6 +455,7 @@ int battery_gauge_changed(FAR struct battery_gauge_dev_s 
*dev,
       battery_gauge_notify(priv, mask);
     }
 
+out:
   nxmutex_unlock(&dev->batlock);
   return OK;
 }
diff --git a/drivers/power/battery/battery_monitor.c 
b/drivers/power/battery/battery_monitor.c
index e01b6cc0763..825b316b7a4 100644
--- a/drivers/power/battery/battery_monitor.c
+++ b/drivers/power/battery/battery_monitor.c
@@ -499,18 +499,18 @@ int battery_monitor_changed(FAR struct 
battery_monitor_dev_s *dev,
 
   /* Event happen too early? */
 
+  ret = nxmutex_lock(&dev->batlock);
+  if (ret < 0)
+    {
+      return ret;
+    }
+
   if (list_is_clear(&dev->flist))
     {
       /* Yes, record it and return directly */
 
       dev->mask |= mask;
-      return 0;
-    }
-
-  ret = nxmutex_lock(&dev->batlock);
-  if (ret < 0)
-    {
-      return ret;
+      goto out;
     }
 
   dev->mask |= mask;
@@ -520,6 +520,7 @@ int battery_monitor_changed(FAR struct 
battery_monitor_dev_s *dev,
       battery_monitor_notify(priv, mask);
     }
 
+out:
   nxmutex_unlock(&dev->batlock);
   return OK;
 }

Reply via email to