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 \
 "