Fix PID failsafe loggers
This CL fixes the silence issue of PID failsafe loggers.
This CL also deprecates pointers for PID failsafe loggers to fix the
crashes.
Tested: https://paste.googleplex.com/6195713150812160 (No crash happens)
https://paste.googleplex.com/4789243163181056 (The logs appear)
https://fusion2.corp.google.com/6f303831-040f-31c0-a747-2c7c4458b54c
https://fusion2.corp.google.com/b2560a17-2a26-36a0-a1e9-b13a4d395f02
https://fusion2.corp.google.com/b62ed499-47ba-30bc-97c5-4675fafe01cc
Platforms-Affected: All
Change-Id: I6d93aca91d8608c860768bad8a51fc814b694bcf
Google-Bug-Id: 437375644
Google-Bug-Id: 403313360
Signed-off-by: James Zheng <alphetis@google.com>
(cherry picked from commit 4273691e6bd27a4662c819b59ad38af8bd519011)
diff --git a/recipes-phosphor/fans/phosphor-pid-control/0001-Fix-PID-failsafe-loggers.patch b/recipes-phosphor/fans/phosphor-pid-control/0001-Fix-PID-failsafe-loggers.patch
new file mode 100644
index 0000000..8cb4017
--- /dev/null
+++ b/recipes-phosphor/fans/phosphor-pid-control/0001-Fix-PID-failsafe-loggers.patch
@@ -0,0 +1,145 @@
+From 124b0fdcab70682d39d28f6890ec2a39e2ef0667 Mon Sep 17 00:00:00 2001
+From: James Zheng <alphetis@google.com>
+Date: Thu, 14 Aug 2025 17:59:59 +0000
+Subject: [PATCH] Fix PID failsafe logger
+
+Signed-off-by: James Zheng <alphetis@google.com>
+
+---
+ failsafeloggers/builder.cpp | 6 ++--
+ failsafeloggers/failsafe_logger.cpp | 2 +-
+ failsafeloggers/failsafe_logger.hpp | 5 ++-
+ failsafeloggers/failsafe_logger_utility.cpp | 5 ++-
+ failsafeloggers/failsafe_logger_utility.hpp | 35 ++++++++++-----------
+ 5 files changed, 26 insertions(+), 27 deletions(-)
+
+diff --git a/failsafeloggers/builder.cpp b/failsafeloggers/builder.cpp
+index 648abdc..c3a1b19 100644
+--- a/failsafeloggers/builder.cpp
++++ b/failsafeloggers/builder.cpp
+@@ -33,14 +33,12 @@ void buildFailsafeLoggers(
+ const std::unordered_map<int64_t, std::shared_ptr<ZoneInterface>>& zones,
+ const size_t logMaxCountPerSecond /* = 20 */) {
+ zoneIdToFailsafeLogger =
+- std::unordered_map<int64_t,
+- std::shared_ptr<pid_control::FailsafeLogger>>();
++ std::unordered_map<int64_t, pid_control::FailsafeLogger>();
+ sensorNameToZoneId = std::unordered_map<std::string, std::vector<int64_t>>();
+ for (const auto& zoneIdToZone : zones) {
+ int64_t zoneId = zoneIdToZone.first;
+ // Create a failsafe logger for each zone.
+- zoneIdToFailsafeLogger[zoneId] =
+- std::make_shared<FailsafeLogger>(
++ zoneIdToFailsafeLogger[zoneId] = FailsafeLogger(
+ logMaxCountPerSecond, zoneIdToZone.second->getFailSafeMode());
+
+ // Build the sensor-zone topology map.
+diff --git a/failsafeloggers/failsafe_logger.cpp b/failsafeloggers/failsafe_logger.cpp
+index ace08e9..d10a540 100644
+--- a/failsafeloggers/failsafe_logger.cpp
++++ b/failsafeloggers/failsafe_logger.cpp
+@@ -28,7 +28,7 @@ void FailsafeLogger::outputFailsafeLog(const int64_t zoneId,
+ // encountered in the current state.
+ std::string locationReason = location + " @ " + reason;
+ if (_logTimestamps.size() >= _logMaxCountPerSecond ||
+- !_logsInCurrentState.contains(locationReason)) {
++ _logsInCurrentState.contains(locationReason)) {
+ return;
+ }
+ _logsInCurrentState.insert(locationReason);
+diff --git a/failsafeloggers/failsafe_logger.hpp b/failsafeloggers/failsafe_logger.hpp
+index 6ac0ba5..53883b6 100644
+--- a/failsafeloggers/failsafe_logger.hpp
++++ b/failsafeloggers/failsafe_logger.hpp
+@@ -32,7 +32,10 @@ class FailsafeLogger
+ FailsafeLogger(size_t logMaxCountPerSecond = 20,
+ bool currentFailsafeState = false)
+ : _logMaxCountPerSecond(logMaxCountPerSecond),
+- _currentFailsafeState(currentFailsafeState) {}
++ _currentFailsafeState(currentFailsafeState) {
++ _logTimestamps.clear();
++ _logsInCurrentState.clear();
++ }
+ ~FailsafeLogger() = default;
+
+ /** Attempt to output an entering/leaving-failsafe-mode log.
+diff --git a/failsafeloggers/failsafe_logger_utility.cpp b/failsafeloggers/failsafe_logger_utility.cpp
+index 6e9d6aa..4ca17f0 100644
+--- a/failsafeloggers/failsafe_logger_utility.cpp
++++ b/failsafeloggers/failsafe_logger_utility.cpp
+@@ -3,9 +3,8 @@
+ #include <string>
+
+
+-std::unordered_map<int64_t, std::shared_ptr<pid_control::FailsafeLogger>>
+- zoneIdToFailsafeLogger =
+- std::unordered_map<int64_t, std::shared_ptr<pid_control::FailsafeLogger>>();
++std::unordered_map<int64_t, pid_control::FailsafeLogger> zoneIdToFailsafeLogger =
++ std::unordered_map<int64_t, pid_control::FailsafeLogger>();
+
+ std::unordered_map<std::string, std::vector<int64_t>>
+ sensorNameToZoneId = std::unordered_map<std::string, std::vector<int64_t>>();
+diff --git a/failsafeloggers/failsafe_logger_utility.hpp b/failsafeloggers/failsafe_logger_utility.hpp
+index 9ccdff3..7106808 100644
+--- a/failsafeloggers/failsafe_logger_utility.hpp
++++ b/failsafeloggers/failsafe_logger_utility.hpp
+@@ -10,8 +10,7 @@
+
+ /** Map of the zone ID to its failsafe logger.
+ */
+-extern std::unordered_map<int64_t, std::shared_ptr<pid_control::FailsafeLogger>>
+- zoneIdToFailsafeLogger;
++extern std::unordered_map<int64_t, pid_control::FailsafeLogger> zoneIdToFailsafeLogger;
+
+ /** Map of the sensor name/ID to its corresponding zone IDs.
+ */
+@@ -33,31 +32,31 @@ extern const std::string failsafeReasonFailSensorNotFunctional;
+ namespace pid_control {
+
+ /** Given a sensor name, attempt to output entering/leaving-failsafe-mode
+- * logs for its corresponding zones.
++ * logs for its corresponding zones.
+ */
+ inline void outputFailsafeLogWithSensor(const std::string sensorName,
+- const bool newFailsafeState,
+- const std::string location,
+- const std::string& reason) {
++ bool newFailsafeState,
++ const std::string& location,
++ const std::string& reason) {
+ for (const int64_t zoneId : sensorNameToZoneId[sensorName]) {
+- zoneIdToFailsafeLogger[zoneId]->outputFailsafeLog(zoneId,
+- newFailsafeState,
+- location,
+- reason);
++ zoneIdToFailsafeLogger[zoneId].outputFailsafeLog(zoneId,
++ newFailsafeState,
++ location,
++ reason);
+ }
+ }
+
+ /** Given a zone ID, attempt to output entering/leaving-failsafe-mode
+- * logs for its corresponding zones.
++ * logs for it.
+ */
+ inline void outputFailsafeLogWithZone(const int64_t zoneId,
+- const bool newFailsafeState,
+- const std::string location,
+- const std::string& reason) {
+- zoneIdToFailsafeLogger[zoneId]->outputFailsafeLog(zoneId,
+- newFailsafeState,
+- location,
+- reason);
++ bool newFailsafeState,
++ const std::string& location,
++ const std::string& reason) {
++ zoneIdToFailsafeLogger[zoneId].outputFailsafeLog(zoneId,
++ newFailsafeState,
++ location,
++ reason);
+ }
+ } // namespace pid_control
+
+--
+2.51.0.rc1.163.g2494970778-goog
\ No newline at end of file
diff --git a/recipes-phosphor/fans/phosphor-pid-control_%.bbappend b/recipes-phosphor/fans/phosphor-pid-control_%.bbappend
index 34f15bc..726d1a0 100644
--- a/recipes-phosphor/fans/phosphor-pid-control_%.bbappend
+++ b/recipes-phosphor/fans/phosphor-pid-control_%.bbappend
@@ -5,4 +5,5 @@
file://0001-set-fan-pwm-forcely.patch \
file://0001-Add-failsafe-logger-for-zones.patch \
file://0001-Optimize-failsafe-logger.patch \
+ file://0001-Fix-PID-failsafe-loggers.patch \
"