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