ENH: sigFpe: split off Nan handling

This commit is contained in:
mattijs 2013-09-18 16:59:44 +01:00
parent b332841f26
commit a501d0ff3c
2 changed files with 34 additions and 19 deletions

View File

@ -51,6 +51,31 @@ License
struct sigaction Foam::sigFpe::oldAction_;
void Foam::sigFpe::fillSignallingNan(UList<scalar>& lst)
{
#ifdef LINUX
// initialize to signalling NaN
# ifdef WM_SP
const uint32_t sNAN = 0x7ff7fffflu;
uint32_t* dPtr = reinterpret_cast<uint32_t*>(lst.begin());
# else
const uint64_t sNAN = 0x7ff7ffffffffffffllu;
uint64_t* dPtr = reinterpret_cast<uint64_t*>(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<uint32_t*>(result);
# else
const uint64_t sNAN = 0x7ff7ffffffffffffllu;
uint64_t* dPtr = reinterpret_cast<uint64_t*>(result);
# endif
const size_t nScalars = size/sizeof(scalar);
for (size_t i = 0; i < nScalars; ++i)
{
*dPtr++ = sNAN;
}
UList<scalar> lst(reinterpret_cast<scalar*>(result), size/sizeof(scalar));
fillSignallingNan(lst);
// Restore our own hooks
__malloc_hook = nanMallocHook_;

View File

@ -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<scalar>&);
};