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;
}