From e121db6e86d4ea05bd95eb2720188c91d1de4f0a Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Mon, 31 Mar 2025 13:36:18 +0200
Subject: [PATCH] ENH: extend sigFpe::fillNan() interfaces

- provide separate float/double UList interfaces, which improves
  flexibility (eg, with SPDP)

- sigFpe::fillNan_if() interface, for filling in when using alternative
  memory allocators
---
 applications/test/sigFpe/Make/files           |  2 +-
 .../sigFpe/{Test-sigFpe.C => Test-sigFpe.cxx} |  0
 src/OSspecific/MSwindows/Make/files           | 14 ++--
 src/OSspecific/MSwindows/signals/sigFpe.H     | 66 +++++++++++++++++--
 .../signals/{sigFpe.C => sigFpe.cxx}          | 34 ++--------
 src/OSspecific/MSwindows/signals/sigInt.H     |  2 +-
 .../signals/{sigInt.C => sigInt.cxx}          |  2 +-
 src/OSspecific/MSwindows/signals/sigQuit.H    |  2 +-
 .../signals/{sigQuit.C => sigQuit.cxx}        |  2 +-
 src/OSspecific/MSwindows/signals/sigSegv.H    |  2 +-
 .../signals/sigSegv.cxx}                      |  2 +-
 .../MSwindows/signals/sigStopAtWriteNow.H     |  2 +-
 ...StopAtWriteNow.C => sigStopAtWriteNow.cxx} |  2 +-
 .../MSwindows/signals/sigWriteNow.H           |  2 +-
 .../{sigWriteNow.C => sigWriteNow.cxx}        |  2 +-
 .../{signalMacros.C => signalMacros.cxx}      |  2 +-
 src/OSspecific/MSwindows/signals/timer.H      |  2 +-
 .../MSwindows/signals/{timer.C => timer.cxx}  |  2 +-
 src/OSspecific/POSIX/Make/files               | 14 ++--
 src/OSspecific/POSIX/signals/sigFpe.H         | 65 ++++++++++++++++--
 .../POSIX/signals/{sigFpe.C => sigFpe.cxx}    | 54 +++------------
 src/OSspecific/POSIX/signals/sigInt.H         |  2 +-
 .../POSIX/signals/{sigInt.C => sigInt.cxx}    |  2 +-
 src/OSspecific/POSIX/signals/sigQuit.H        |  2 +-
 .../POSIX/signals/{sigQuit.C => sigQuit.cxx}  |  2 +-
 src/OSspecific/POSIX/signals/sigSegv.H        |  2 +-
 .../sigSegv.C => POSIX/signals/sigSegv.cxx}   |  2 +-
 .../POSIX/signals/sigStopAtWriteNow.H         |  2 +-
 ...StopAtWriteNow.C => sigStopAtWriteNow.cxx} |  2 +-
 src/OSspecific/POSIX/signals/sigWriteNow.H    |  2 +-
 .../{sigWriteNow.C => sigWriteNow.cxx}        |  2 +-
 .../{signalMacros.C => signalMacros.cxx}      |  2 +-
 src/OSspecific/POSIX/signals/timer.H          |  2 +-
 .../POSIX/signals/{timer.C => timer.cxx}      |  2 +-
 34 files changed, 174 insertions(+), 127 deletions(-)
 rename applications/test/sigFpe/{Test-sigFpe.C => Test-sigFpe.cxx} (100%)
 rename src/OSspecific/MSwindows/signals/{sigFpe.C => sigFpe.cxx} (85%)
 rename src/OSspecific/MSwindows/signals/{sigInt.C => sigInt.cxx} (98%)
 rename src/OSspecific/MSwindows/signals/{sigQuit.C => sigQuit.cxx} (98%)
 rename src/OSspecific/{POSIX/signals/sigSegv.C => MSwindows/signals/sigSegv.cxx} (98%)
 rename src/OSspecific/MSwindows/signals/{sigStopAtWriteNow.C => sigStopAtWriteNow.cxx} (99%)
 rename src/OSspecific/MSwindows/signals/{sigWriteNow.C => sigWriteNow.cxx} (99%)
 rename src/OSspecific/MSwindows/signals/{signalMacros.C => signalMacros.cxx} (99%)
 rename src/OSspecific/MSwindows/signals/{timer.C => timer.cxx} (99%)
 rename src/OSspecific/POSIX/signals/{sigFpe.C => sigFpe.cxx} (80%)
 rename src/OSspecific/POSIX/signals/{sigInt.C => sigInt.cxx} (98%)
 rename src/OSspecific/POSIX/signals/{sigQuit.C => sigQuit.cxx} (98%)
 rename src/OSspecific/{MSwindows/signals/sigSegv.C => POSIX/signals/sigSegv.cxx} (98%)
 rename src/OSspecific/POSIX/signals/{sigStopAtWriteNow.C => sigStopAtWriteNow.cxx} (99%)
 rename src/OSspecific/POSIX/signals/{sigWriteNow.C => sigWriteNow.cxx} (99%)
 rename src/OSspecific/POSIX/signals/{signalMacros.C => signalMacros.cxx} (99%)
 rename src/OSspecific/POSIX/signals/{timer.C => timer.cxx} (99%)

diff --git a/applications/test/sigFpe/Make/files b/applications/test/sigFpe/Make/files
index f2c4215e4a5..d9940651a11 100644
--- a/applications/test/sigFpe/Make/files
+++ b/applications/test/sigFpe/Make/files
@@ -1,3 +1,3 @@
-Test-sigFpe.C
+Test-sigFpe.cxx
 
 EXE = $(FOAM_USER_APPBIN)/Test-sigFpe
diff --git a/applications/test/sigFpe/Test-sigFpe.C b/applications/test/sigFpe/Test-sigFpe.cxx
similarity index 100%
rename from applications/test/sigFpe/Test-sigFpe.C
rename to applications/test/sigFpe/Test-sigFpe.cxx
diff --git a/src/OSspecific/MSwindows/Make/files b/src/OSspecific/MSwindows/Make/files
index 964f34106e0..7c0823f3fce 100644
--- a/src/OSspecific/MSwindows/Make/files
+++ b/src/OSspecific/MSwindows/Make/files
@@ -3,13 +3,13 @@ MSwindows.C
 cpuInfo/cpuInfo.C
 memInfo/memInfo.C
 
-signals/sigFpe.C
-signals/sigInt.C
-signals/sigQuit.C
-signals/sigSegv.C
-signals/sigStopAtWriteNow.C
-signals/sigWriteNow.C
-signals/timer.C
+signals/sigFpe.cxx
+signals/sigInt.cxx
+signals/sigQuit.cxx
+signals/sigSegv.cxx
+signals/sigStopAtWriteNow.cxx
+signals/sigWriteNow.cxx
+signals/timer.cxx
 
 fileStat/fileStat.C
 
diff --git a/src/OSspecific/MSwindows/signals/sigFpe.H b/src/OSspecific/MSwindows/signals/sigFpe.H
index 98054224bc7..31f3b05b99f 100644
--- a/src/OSspecific/MSwindows/signals/sigFpe.H
+++ b/src/OSspecific/MSwindows/signals/sigFpe.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2018-2023 OpenCFD Ltd.
+    Copyright (C) 2018-2025 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -50,13 +50,15 @@ Description
     restores original). The class behaves as a singleton.
 
 SourceFiles
-    sigFpe.C
+    sigFpe.cxx
 
 \*---------------------------------------------------------------------------*/
 
 #ifndef Foam_sigFpe_H
 #define Foam_sigFpe_H
 
+#include <algorithm>
+#include <limits>
 #include <cstddef>  // For std::size_t
 #include "scalarFwd.H"
 
@@ -96,6 +98,23 @@ class sigFpe
         //- Handler for caught signals - ends job and prints stack
         static void sigHandler(int);
 
+        //- Fill (float | double) buffer with signalling NaN
+        template<class FloatType>
+        inline static void fill_with_NaN(FloatType* buf, size_t count)
+        {
+            if (buf && count)
+            {
+                const auto val =
+                    std::numeric_limits<FloatType>::signaling_NaN();
+
+                // [float|double] so do not need std::uninitialized_fill_n()
+                // Can dispatch with
+                // - std::execution::par_unseq
+                // - std::execution::unseq
+                std::fill_n(buf, count, val);
+            }
+        }
+
 
 public:
 
@@ -124,6 +143,15 @@ public:
         //- True if NaN memory initialisation is currently active.
         static bool nanActive() noexcept { return nanActive_; }
 
+        //- Set NaN memory initialisation on/off.
+        //  \return the previous value
+        static bool nanActive(bool on) noexcept
+        {
+            bool old(nanActive_);
+            nanActive_ = on;
+            return old;
+        }
+
         //- Activate SIGFPE handler when FOAM_SIGFPE is enabled.
         //- Activate fill memory with signaling_NaN when FOAM_SETNAN is enabled
         static void set(bool verbose=false);
@@ -131,11 +159,37 @@ public:
         //- Deactivate SIGFPE handler and NaN memory initialisation
         static void unset(bool verbose=false);
 
-        //- Fill data block with signaling_NaN values
-        static void fillNan(char* buf, size_t count);
 
-        //- Fill data block with signaling_NaN values
-        static void fillNan(UList<scalar>& list);
+        //- Fill data block with signaling_NaN values if nanActive().
+        //- Does a reinterpret to \c Foam::scalar
+        inline static void fillNan_if(void* buf, size_t count)
+        {
+            if (nanActive_)
+            {
+                fill_with_NaN
+                (
+                    reinterpret_cast<Foam::scalar*>(buf),
+                    (count/sizeof(Foam::scalar))
+                );
+            }
+        }
+
+        //- Fill data block with signaling_NaN values.
+        //- Does a reinterpret to \c Foam::scalar
+        static void fillNan(char* buf, size_t count)
+        {
+            fill_with_NaN
+            (
+                reinterpret_cast<Foam::scalar*>(buf),
+                (count/sizeof(Foam::scalar))
+            );
+        }
+
+        //- Fill data block with (float) signaling_NaN values
+        static void fillNan(UList<float>& list);
+
+        //- Fill data block with (double) signaling_NaN values
+        static void fillNan(UList<double>& list);
 
 
     // Helpers
diff --git a/src/OSspecific/MSwindows/signals/sigFpe.C b/src/OSspecific/MSwindows/signals/sigFpe.cxx
similarity index 85%
rename from src/OSspecific/MSwindows/signals/sigFpe.C
rename to src/OSspecific/MSwindows/signals/sigFpe.cxx
index 4be1a14ec1f..d38a8d50923 100644
--- a/src/OSspecific/MSwindows/signals/sigFpe.C
+++ b/src/OSspecific/MSwindows/signals/sigFpe.cxx
@@ -36,11 +36,9 @@ License
 #include "Switch.H"
 
 #include <float.h>  // For *fp functions
-#include <algorithm>
-#include <limits>
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@@ -196,37 +194,15 @@ void Foam::sigFpe::unset(bool verbose)
 }
 
 
-void Foam::sigFpe::fillNan(char* buf, size_t count)
+void Foam::sigFpe::fillNan(UList<float>& list)
 {
-    if (!buf || !count) return;
-
-    // Fill with signaling_NaN
-    const scalar val = std::numeric_limits<scalar>::signaling_NaN();
-
-    // Can dispatch with
-    // - std::execution::parallel_unsequenced_policy
-    // - std::execution::unsequenced_policy
-    std::fill_n
-    (
-        reinterpret_cast<scalar*>(buf), (count/sizeof(scalar)), val
-    );
+    sigFpe::fill_with_NaN(list.data(), list.size());
 }
 
 
-void Foam::sigFpe::fillNan(UList<scalar>& list)
+void Foam::sigFpe::fillNan(UList<double>& list)
 {
-    if (list.empty()) return;
-
-    // Fill with signaling_NaN
-    const scalar val = std::numeric_limits<scalar>::signaling_NaN();
-
-    // Can dispatch with
-    // - std::execution::parallel_unsequenced_policy
-    // - std::execution::unsequenced_policy
-    std::fill_n
-    (
-        list.data(), list.size(), val
-    );
+    sigFpe::fill_with_NaN(list.data(), list.size());
 }
 
 
diff --git a/src/OSspecific/MSwindows/signals/sigInt.H b/src/OSspecific/MSwindows/signals/sigInt.H
index a51e7fff737..39869cb4257 100644
--- a/src/OSspecific/MSwindows/signals/sigInt.H
+++ b/src/OSspecific/MSwindows/signals/sigInt.H
@@ -41,7 +41,7 @@ See also
     Foam::JobInfo
 
 SourceFiles
-    sigInt.C
+    sigInt.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/MSwindows/signals/sigInt.C b/src/OSspecific/MSwindows/signals/sigInt.cxx
similarity index 98%
rename from src/OSspecific/MSwindows/signals/sigInt.C
rename to src/OSspecific/MSwindows/signals/sigInt.cxx
index c4114968ba3..c56e837892f 100644
--- a/src/OSspecific/MSwindows/signals/sigInt.C
+++ b/src/OSspecific/MSwindows/signals/sigInt.cxx
@@ -33,7 +33,7 @@ License
 #include "IOstreams.H"
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
diff --git a/src/OSspecific/MSwindows/signals/sigQuit.H b/src/OSspecific/MSwindows/signals/sigQuit.H
index 7525647bfb9..a7a7de630f5 100644
--- a/src/OSspecific/MSwindows/signals/sigQuit.H
+++ b/src/OSspecific/MSwindows/signals/sigQuit.H
@@ -40,7 +40,7 @@ See also
     Foam::JobInfo
 
 SourceFiles
-    sigQuit.C
+    sigQuit.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/MSwindows/signals/sigQuit.C b/src/OSspecific/MSwindows/signals/sigQuit.cxx
similarity index 98%
rename from src/OSspecific/MSwindows/signals/sigQuit.C
rename to src/OSspecific/MSwindows/signals/sigQuit.cxx
index cb33f036ae0..ea4d1880532 100644
--- a/src/OSspecific/MSwindows/signals/sigQuit.C
+++ b/src/OSspecific/MSwindows/signals/sigQuit.cxx
@@ -33,7 +33,7 @@ License
 #include "IOstreams.H"
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 // NOTE: SIGBREAK is the best alternative to SIGQUIT on windows
 
diff --git a/src/OSspecific/MSwindows/signals/sigSegv.H b/src/OSspecific/MSwindows/signals/sigSegv.H
index 39a34f5da1d..a6e000e9d99 100644
--- a/src/OSspecific/MSwindows/signals/sigSegv.H
+++ b/src/OSspecific/MSwindows/signals/sigSegv.H
@@ -40,7 +40,7 @@ See also
     Foam::JobInfo
 
 SourceFiles
-    sigSegv.C
+    sigSegv.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/POSIX/signals/sigSegv.C b/src/OSspecific/MSwindows/signals/sigSegv.cxx
similarity index 98%
rename from src/OSspecific/POSIX/signals/sigSegv.C
rename to src/OSspecific/MSwindows/signals/sigSegv.cxx
index 9fe56674f49..1c147c2e836 100644
--- a/src/OSspecific/POSIX/signals/sigSegv.C
+++ b/src/OSspecific/MSwindows/signals/sigSegv.cxx
@@ -32,7 +32,7 @@ License
 #include "IOstreams.H"
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
diff --git a/src/OSspecific/MSwindows/signals/sigStopAtWriteNow.H b/src/OSspecific/MSwindows/signals/sigStopAtWriteNow.H
index 200e96f8b28..22f040764e7 100644
--- a/src/OSspecific/MSwindows/signals/sigStopAtWriteNow.H
+++ b/src/OSspecific/MSwindows/signals/sigStopAtWriteNow.H
@@ -32,7 +32,7 @@ Description
     The interrupt is defined by OptimisationSwitches::stopAtWriteNowSignal
 
 SourceFiles
-    sigStopAtWriteNow.C
+    sigStopAtWriteNow.cxx
 
 See also
     Foam::JobInfo
diff --git a/src/OSspecific/MSwindows/signals/sigStopAtWriteNow.C b/src/OSspecific/MSwindows/signals/sigStopAtWriteNow.cxx
similarity index 99%
rename from src/OSspecific/MSwindows/signals/sigStopAtWriteNow.C
rename to src/OSspecific/MSwindows/signals/sigStopAtWriteNow.cxx
index bf93989ab9b..cff3b35b7b0 100644
--- a/src/OSspecific/MSwindows/signals/sigStopAtWriteNow.C
+++ b/src/OSspecific/MSwindows/signals/sigStopAtWriteNow.cxx
@@ -34,7 +34,7 @@ License
 #include "Time.H"
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
diff --git a/src/OSspecific/MSwindows/signals/sigWriteNow.H b/src/OSspecific/MSwindows/signals/sigWriteNow.H
index 1bdf7766549..27fd775c963 100644
--- a/src/OSspecific/MSwindows/signals/sigWriteNow.H
+++ b/src/OSspecific/MSwindows/signals/sigWriteNow.H
@@ -32,7 +32,7 @@ Description
     The interrupt is defined by OptimisationSwitches::writeNowSignal
 
 SourceFiles
-    sigWriteNow.C
+    sigWriteNow.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/MSwindows/signals/sigWriteNow.C b/src/OSspecific/MSwindows/signals/sigWriteNow.cxx
similarity index 99%
rename from src/OSspecific/MSwindows/signals/sigWriteNow.C
rename to src/OSspecific/MSwindows/signals/sigWriteNow.cxx
index 389be095b70..0aadfbb142a 100644
--- a/src/OSspecific/MSwindows/signals/sigWriteNow.C
+++ b/src/OSspecific/MSwindows/signals/sigWriteNow.cxx
@@ -33,7 +33,7 @@ License
 #include "Time.H"
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
diff --git a/src/OSspecific/MSwindows/signals/signalMacros.C b/src/OSspecific/MSwindows/signals/signalMacros.cxx
similarity index 99%
rename from src/OSspecific/MSwindows/signals/signalMacros.C
rename to src/OSspecific/MSwindows/signals/signalMacros.cxx
index d5fc5a51125..8cbfd583b64 100644
--- a/src/OSspecific/MSwindows/signals/signalMacros.C
+++ b/src/OSspecific/MSwindows/signals/signalMacros.cxx
@@ -27,7 +27,7 @@ Description
     File-local code for setting/resetting signal handlers.
 
 SourceFiles
-    signalMacros.C
+    signalMacros.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/MSwindows/signals/timer.H b/src/OSspecific/MSwindows/signals/timer.H
index 90ce3bee800..01350cf499e 100644
--- a/src/OSspecific/MSwindows/signals/timer.H
+++ b/src/OSspecific/MSwindows/signals/timer.H
@@ -57,7 +57,7 @@ Note
     ?something to do with stack frames.
 
 SourceFiles
-    timer.C
+    timer.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/MSwindows/signals/timer.C b/src/OSspecific/MSwindows/signals/timer.cxx
similarity index 99%
rename from src/OSspecific/MSwindows/signals/timer.C
rename to src/OSspecific/MSwindows/signals/timer.cxx
index 2a93506c524..17bd0cf796c 100644
--- a/src/OSspecific/MSwindows/signals/timer.C
+++ b/src/OSspecific/MSwindows/signals/timer.cxx
@@ -39,7 +39,7 @@ License
 #include <windows.h>
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 #undef  SIGALRM
 #define SIGALRM 14
diff --git a/src/OSspecific/POSIX/Make/files b/src/OSspecific/POSIX/Make/files
index 9f374e56d94..29c85884451 100644
--- a/src/OSspecific/POSIX/Make/files
+++ b/src/OSspecific/POSIX/Make/files
@@ -4,13 +4,13 @@ cpuInfo/cpuInfo.C
 cpuTime/cpuTimePosix.C
 memInfo/memInfo.C
 
-signals/sigFpe.C
-signals/sigSegv.C
-signals/sigInt.C
-signals/sigQuit.C
-signals/sigStopAtWriteNow.C
-signals/sigWriteNow.C
-signals/timer.C
+signals/sigFpe.cxx
+signals/sigSegv.cxx
+signals/sigInt.cxx
+signals/sigQuit.cxx
+signals/sigStopAtWriteNow.cxx
+signals/sigWriteNow.cxx
+signals/timer.cxx
 
 fileStat/fileStat.C
 
diff --git a/src/OSspecific/POSIX/signals/sigFpe.H b/src/OSspecific/POSIX/signals/sigFpe.H
index 98054224bc7..129c469d8ff 100644
--- a/src/OSspecific/POSIX/signals/sigFpe.H
+++ b/src/OSspecific/POSIX/signals/sigFpe.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2018-2023 OpenCFD Ltd.
+    Copyright (C) 2018-2025 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -50,13 +50,15 @@ Description
     restores original). The class behaves as a singleton.
 
 SourceFiles
-    sigFpe.C
+    sigFpe.cxx
 
 \*---------------------------------------------------------------------------*/
 
 #ifndef Foam_sigFpe_H
 #define Foam_sigFpe_H
 
+#include <algorithm>
+#include <limits>
 #include <cstddef>  // For std::size_t
 #include "scalarFwd.H"
 
@@ -96,6 +98,23 @@ class sigFpe
         //- Handler for caught signals - ends job and prints stack
         static void sigHandler(int);
 
+        //- Fill (float | double) buffer with signalling NaN
+        template<class FloatType>
+        inline static void fill_with_NaN(FloatType* buf, size_t count)
+        {
+            if (buf && count)
+            {
+                const auto val =
+                    std::numeric_limits<FloatType>::signaling_NaN();
+
+                // [float|double] so do not need std::uninitialized_fill_n()
+                // Can dispatch with
+                // - std::execution::par_unseq
+                // - std::execution::unseq
+                std::fill_n(buf, count, val);
+            }
+        }
+
 
 public:
 
@@ -124,6 +143,15 @@ public:
         //- True if NaN memory initialisation is currently active.
         static bool nanActive() noexcept { return nanActive_; }
 
+        //- Set NaN memory initialisation on/off.
+        //  \return the previous value
+        static bool nanActive(bool on) noexcept
+        {
+            bool old(nanActive_);
+            nanActive_ = on;
+            return old;
+        }
+
         //- Activate SIGFPE handler when FOAM_SIGFPE is enabled.
         //- Activate fill memory with signaling_NaN when FOAM_SETNAN is enabled
         static void set(bool verbose=false);
@@ -131,11 +159,36 @@ public:
         //- Deactivate SIGFPE handler and NaN memory initialisation
         static void unset(bool verbose=false);
 
-        //- Fill data block with signaling_NaN values
-        static void fillNan(char* buf, size_t count);
+        //- Fill data block with signaling_NaN values if nanActive().
+        //- Does a reinterpret to \c Foam::scalar
+        static void fillNan_if(void* buf, size_t count)
+        {
+            if (nanActive_)
+            {
+                fill_with_NaN
+                (
+                    reinterpret_cast<Foam::scalar*>(buf),
+                    (count/sizeof(Foam::scalar))
+                );
+            }
+        }
 
-        //- Fill data block with signaling_NaN values
-        static void fillNan(UList<scalar>& list);
+        //- Fill data block with signaling_NaN values.
+        //- Does a reinterpret to \c Foam::scalar
+        static void fillNan(char* buf, size_t count)
+        {
+            fill_with_NaN
+            (
+                reinterpret_cast<Foam::scalar*>(buf),
+                (count/sizeof(Foam::scalar))
+            );
+        }
+
+        //- Fill data block with (float) signaling_NaN values
+        static void fillNan(UList<float>& list);
+
+        //- Fill data block with (double) signaling_NaN values
+        static void fillNan(UList<double>& list);
 
 
     // Helpers
diff --git a/src/OSspecific/POSIX/signals/sigFpe.C b/src/OSspecific/POSIX/signals/sigFpe.cxx
similarity index 80%
rename from src/OSspecific/POSIX/signals/sigFpe.C
rename to src/OSspecific/POSIX/signals/sigFpe.cxx
index 079d254bafa..7b458ac0db2 100644
--- a/src/OSspecific/POSIX/signals/sigFpe.C
+++ b/src/OSspecific/POSIX/signals/sigFpe.cxx
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2015 OpenFOAM Foundation
-    Copyright (C) 2016-2023 OpenCFD Ltd.
+    Copyright (C) 2016-2025 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -33,11 +33,9 @@ License
 #include "IOstreams.H"
 #include "UList.H"
 #include "Switch.H"
-#include <algorithm>
-#include <limits>
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 #if defined(__linux__) && defined(__GNUC__)
     #ifndef __USE_GNU
@@ -91,24 +89,12 @@ extern "C"
         // Call the low-level GLIBC malloc function
         void* ptr = __libc_malloc(size);
 
-        if (Foam::sigFpe::nanActive())
-        {
-            // Fill with signaling_NaN
-            const auto val = std::numeric_limits<Foam::scalar>::signaling_NaN();
-
-            // Can dispatch with
-            // - std::execution::parallel_unsequenced_policy
-            // - std::execution::unsequenced_policy
-            std::fill_n
-            (
-                reinterpret_cast<Foam::scalar*>(ptr),
-                (size/sizeof(Foam::scalar)),
-                val
-            );
-        }
+        // Optionally fill with NaN (depends on current flags)
+        Foam::sigFpe::fillNan_if(ptr, size);
 
         return ptr;
     }
+
 } // End extern C
 
 #endif  // __linux__
@@ -248,37 +234,15 @@ void Foam::sigFpe::unset(bool verbose)
 }
 
 
-void Foam::sigFpe::fillNan(char* buf, size_t count)
+void Foam::sigFpe::fillNan(UList<float>& list)
 {
-    if (!buf || !count) return;
-
-    // Fill with signaling_NaN
-    const auto val = std::numeric_limits<scalar>::signaling_NaN();
-
-    // Can dispatch with
-    // - std::execution::parallel_unsequenced_policy
-    // - std::execution::unsequenced_policy
-    std::fill_n
-    (
-        reinterpret_cast<scalar*>(buf), (count/sizeof(scalar)), val
-    );
+    sigFpe::fill_with_NaN(list.data(), list.size());
 }
 
 
-void Foam::sigFpe::fillNan(UList<scalar>& list)
+void Foam::sigFpe::fillNan(UList<double>& list)
 {
-    if (list.empty()) return;
-
-    // Fill with signaling_NaN
-    const auto val = std::numeric_limits<scalar>::signaling_NaN();
-
-    // Can dispatch with
-    // - std::execution::parallel_unsequenced_policy
-    // - std::execution::unsequenced_policy
-    std::fill_n
-    (
-        list.data(), list.size(), val
-    );
+    sigFpe::fill_with_NaN(list.data(), list.size());
 }
 
 
diff --git a/src/OSspecific/POSIX/signals/sigInt.H b/src/OSspecific/POSIX/signals/sigInt.H
index df9c39ee953..2f3f30f4a4f 100644
--- a/src/OSspecific/POSIX/signals/sigInt.H
+++ b/src/OSspecific/POSIX/signals/sigInt.H
@@ -41,7 +41,7 @@ See also
     Foam::JobInfo
 
 SourceFiles
-    sigInt.C
+    sigInt.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/POSIX/signals/sigInt.C b/src/OSspecific/POSIX/signals/sigInt.cxx
similarity index 98%
rename from src/OSspecific/POSIX/signals/sigInt.C
rename to src/OSspecific/POSIX/signals/sigInt.cxx
index f50b20dca83..6ddd9a9f319 100644
--- a/src/OSspecific/POSIX/signals/sigInt.C
+++ b/src/OSspecific/POSIX/signals/sigInt.cxx
@@ -32,7 +32,7 @@ License
 #include "IOstreams.H"
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
diff --git a/src/OSspecific/POSIX/signals/sigQuit.H b/src/OSspecific/POSIX/signals/sigQuit.H
index 7525647bfb9..a7a7de630f5 100644
--- a/src/OSspecific/POSIX/signals/sigQuit.H
+++ b/src/OSspecific/POSIX/signals/sigQuit.H
@@ -40,7 +40,7 @@ See also
     Foam::JobInfo
 
 SourceFiles
-    sigQuit.C
+    sigQuit.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/POSIX/signals/sigQuit.C b/src/OSspecific/POSIX/signals/sigQuit.cxx
similarity index 98%
rename from src/OSspecific/POSIX/signals/sigQuit.C
rename to src/OSspecific/POSIX/signals/sigQuit.cxx
index dda6ff025bd..6c406062547 100644
--- a/src/OSspecific/POSIX/signals/sigQuit.C
+++ b/src/OSspecific/POSIX/signals/sigQuit.cxx
@@ -32,7 +32,7 @@ License
 #include "IOstreams.H"
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
diff --git a/src/OSspecific/POSIX/signals/sigSegv.H b/src/OSspecific/POSIX/signals/sigSegv.H
index 5c0f6d4833d..615b833e046 100644
--- a/src/OSspecific/POSIX/signals/sigSegv.H
+++ b/src/OSspecific/POSIX/signals/sigSegv.H
@@ -40,7 +40,7 @@ See also
     Foam::JobInfo
 
 SourceFiles
-    sigSegv.C
+    sigSegv.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/MSwindows/signals/sigSegv.C b/src/OSspecific/POSIX/signals/sigSegv.cxx
similarity index 98%
rename from src/OSspecific/MSwindows/signals/sigSegv.C
rename to src/OSspecific/POSIX/signals/sigSegv.cxx
index 9fe56674f49..1c147c2e836 100644
--- a/src/OSspecific/MSwindows/signals/sigSegv.C
+++ b/src/OSspecific/POSIX/signals/sigSegv.cxx
@@ -32,7 +32,7 @@ License
 #include "IOstreams.H"
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
diff --git a/src/OSspecific/POSIX/signals/sigStopAtWriteNow.H b/src/OSspecific/POSIX/signals/sigStopAtWriteNow.H
index 200e96f8b28..22f040764e7 100644
--- a/src/OSspecific/POSIX/signals/sigStopAtWriteNow.H
+++ b/src/OSspecific/POSIX/signals/sigStopAtWriteNow.H
@@ -32,7 +32,7 @@ Description
     The interrupt is defined by OptimisationSwitches::stopAtWriteNowSignal
 
 SourceFiles
-    sigStopAtWriteNow.C
+    sigStopAtWriteNow.cxx
 
 See also
     Foam::JobInfo
diff --git a/src/OSspecific/POSIX/signals/sigStopAtWriteNow.C b/src/OSspecific/POSIX/signals/sigStopAtWriteNow.cxx
similarity index 99%
rename from src/OSspecific/POSIX/signals/sigStopAtWriteNow.C
rename to src/OSspecific/POSIX/signals/sigStopAtWriteNow.cxx
index d2579f0dbd8..1de20fc2c7c 100644
--- a/src/OSspecific/POSIX/signals/sigStopAtWriteNow.C
+++ b/src/OSspecific/POSIX/signals/sigStopAtWriteNow.cxx
@@ -34,7 +34,7 @@ License
 #include "Time.H"
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
diff --git a/src/OSspecific/POSIX/signals/sigWriteNow.H b/src/OSspecific/POSIX/signals/sigWriteNow.H
index 0d8372f4105..bc203f4043b 100644
--- a/src/OSspecific/POSIX/signals/sigWriteNow.H
+++ b/src/OSspecific/POSIX/signals/sigWriteNow.H
@@ -32,7 +32,7 @@ Description
     The interrupt is defined by OptimisationSwitches::writeNowSignal
 
 SourceFiles
-    sigWriteNow.C
+    sigWriteNow.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/POSIX/signals/sigWriteNow.C b/src/OSspecific/POSIX/signals/sigWriteNow.cxx
similarity index 99%
rename from src/OSspecific/POSIX/signals/sigWriteNow.C
rename to src/OSspecific/POSIX/signals/sigWriteNow.cxx
index aac7f8844e5..a14b123c294 100644
--- a/src/OSspecific/POSIX/signals/sigWriteNow.C
+++ b/src/OSspecific/POSIX/signals/sigWriteNow.cxx
@@ -32,7 +32,7 @@ License
 #include "IOstreams.H"
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
diff --git a/src/OSspecific/POSIX/signals/signalMacros.C b/src/OSspecific/POSIX/signals/signalMacros.cxx
similarity index 99%
rename from src/OSspecific/POSIX/signals/signalMacros.C
rename to src/OSspecific/POSIX/signals/signalMacros.cxx
index c4c0ae240d4..ca9cfc477f8 100644
--- a/src/OSspecific/POSIX/signals/signalMacros.C
+++ b/src/OSspecific/POSIX/signals/signalMacros.cxx
@@ -27,7 +27,7 @@ Description
     File-local code for setting/resetting signal handlers.
 
 SourceFiles
-    signalMacros.C
+    signalMacros.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/POSIX/signals/timer.H b/src/OSspecific/POSIX/signals/timer.H
index 90ce3bee800..01350cf499e 100644
--- a/src/OSspecific/POSIX/signals/timer.H
+++ b/src/OSspecific/POSIX/signals/timer.H
@@ -57,7 +57,7 @@ Note
     ?something to do with stack frames.
 
 SourceFiles
-    timer.C
+    timer.cxx
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/src/OSspecific/POSIX/signals/timer.C b/src/OSspecific/POSIX/signals/timer.cxx
similarity index 99%
rename from src/OSspecific/POSIX/signals/timer.C
rename to src/OSspecific/POSIX/signals/timer.cxx
index 24b92b86899..adb7feb8aec 100644
--- a/src/OSspecific/POSIX/signals/timer.C
+++ b/src/OSspecific/POSIX/signals/timer.cxx
@@ -33,7 +33,7 @@ License
 #include <unistd.h>
 
 // File-local functions
-#include "signalMacros.C"
+#include "signalMacros.cxx"
 
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
-- 
GitLab