From a501d0ff3c8061c1b80b6a979dc2b632f00dbe31 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 18 Sep 2013 16:59:44 +0100 Subject: [PATCH] ENH: sigFpe: split off Nan handling --- src/OSspecific/POSIX/signals/sigFpe.C | 45 ++++++++++++++++----------- src/OSspecific/POSIX/signals/sigFpe.H | 8 ++++- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/OSspecific/POSIX/signals/sigFpe.C b/src/OSspecific/POSIX/signals/sigFpe.C index 501ff95c4e..0f74e43a69 100644 --- a/src/OSspecific/POSIX/signals/sigFpe.C +++ b/src/OSspecific/POSIX/signals/sigFpe.C @@ -51,6 +51,31 @@ License struct sigaction Foam::sigFpe::oldAction_; +void Foam::sigFpe::fillSignallingNan(UList& lst) +{ +#ifdef LINUX + + // initialize to signalling NaN +# ifdef WM_SP + + const uint32_t sNAN = 0x7ff7fffflu; + uint32_t* dPtr = reinterpret_cast(lst.begin()); + +# else + + const uint64_t sNAN = 0x7ff7ffffffffffffllu; + uint64_t* dPtr = reinterpret_cast(lst.begin()); + +# endif + + forAll(lst, i) + { + *dPtr++ = sNAN; + } +#endif +} + + #ifdef LINUX void *(*Foam::sigFpe::oldMallocHook_)(size_t, const void *) = NULL; @@ -66,24 +91,8 @@ void* Foam::sigFpe::nanMallocHook_(size_t size, const void *caller) result = malloc(size); // initialize to signalling NaN -# ifdef WM_SP - - const uint32_t sNAN = 0x7ff7fffflu; - uint32_t* dPtr = reinterpret_cast(result); - -# else - - const uint64_t sNAN = 0x7ff7ffffffffffffllu; - uint64_t* dPtr = reinterpret_cast(result); - -# endif - - const size_t nScalars = size/sizeof(scalar); - for (size_t i = 0; i < nScalars; ++i) - { - *dPtr++ = sNAN; - } - + UList lst(reinterpret_cast(result), size/sizeof(scalar)); + fillSignallingNan(lst); // Restore our own hooks __malloc_hook = nanMallocHook_; diff --git a/src/OSspecific/POSIX/signals/sigFpe.H b/src/OSspecific/POSIX/signals/sigFpe.H index b7fdec8dce..4129749cc7 100644 --- a/src/OSspecific/POSIX/signals/sigFpe.H +++ b/src/OSspecific/POSIX/signals/sigFpe.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -53,6 +53,8 @@ SourceFiles # define LINUX_GNUC #endif +#include "UList.H" + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam @@ -108,6 +110,10 @@ public: //- Activate SIGFPE signal handler when FOAM_SIGFPE is %set // Fill memory with NaN when FOAM_SETNAN is %set void set(const bool verbose); + + //- Helper: fill block of data with NaN + static void fillSignallingNan(UList&); + };