diff --git a/src/OSspecific/POSIX/signals/sigFpe.C b/src/OSspecific/POSIX/signals/sigFpe.C index bcf0c8e6b3..e86c206ab8 100644 --- a/src/OSspecific/POSIX/signals/sigFpe.C +++ b/src/OSspecific/POSIX/signals/sigFpe.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -23,9 +23,8 @@ License \*---------------------------------------------------------------------------*/ -#include "error.H" #include "sigFpe.H" - +#include "error.H" #include "JobInfo.H" #include "OSspecific.H" #include "IOstreams.H" @@ -52,51 +51,42 @@ License struct sigaction Foam::sigFpe::oldAction_; -#if defined(LINUX) +#ifdef LINUX -void *(*Foam::sigFpe::old_malloc_hook)(size_t, const void *) = NULL; +void *(*Foam::sigFpe::oldMallocHook_)(size_t, const void *) = NULL; -void* Foam::sigFpe::my_malloc_hook(size_t size, const void *caller) +void* Foam::sigFpe::nanMallocHook_(size_t size, const void *caller) { void *result; // Restore all old hooks - __malloc_hook = old_malloc_hook; + __malloc_hook = oldMallocHook_; // Call recursively - result = malloc (size); + result = malloc(size); - // initialize to signalling nan + // initialize to signalling NaN # ifdef WM_SP const uint32_t sNAN = 0x7ff7fffflu; - - int nScalars = size / sizeof(scalar); - uint32_t* dPtr = reinterpret_cast(result); - for (int i = 0; i < nScalars; i++) - { - *dPtr++ = sNAN; - } - # else const uint64_t sNAN = 0x7ff7ffffffffffffllu; - - int nScalars = size/sizeof(scalar); - uint64_t* dPtr = reinterpret_cast(result); - for (int i = 0; i < nScalars; i++) +# endif + + const size_t nScalars = size/sizeof(scalar); + for (size_t i = 0; i < nScalars; ++i) { *dPtr++ = sNAN; } -# endif // Restore our own hooks - __malloc_hook = my_malloc_hook; + __malloc_hook = nanMallocHook_; return result; } @@ -106,14 +96,14 @@ void* Foam::sigFpe::my_malloc_hook(size_t size, const void *caller) #ifdef LINUX_GNUC -void Foam::sigFpe::sigFpeHandler(int) +void Foam::sigFpe::sigHandler(int) { // Reset old handling if (sigaction(SIGFPE, &oldAction_, NULL) < 0) { FatalErrorIn ( - "Foam::sigSegv::sigFpeHandler()" + "Foam::sigSegv::sigHandler()" ) << "Cannot reset SIGFPE trapping" << abort(FatalError); } @@ -166,7 +156,7 @@ Foam::sigFpe::~sigFpe() // Reset to standard malloc if (oldAction_.sa_handler) { - __malloc_hook = old_malloc_hook; + __malloc_hook = oldMallocHook_; } # endif @@ -189,13 +179,10 @@ void Foam::sigFpe::set(const bool verbose) if (env("FOAM_SIGFPE")) { - if (verbose) - { - Info<< "SigFpe : Enabling floating point exception trapping" - << " (FOAM_SIGFPE)." << endl; - } + bool supported = false; # ifdef LINUX_GNUC + supported = true; feenableexcept ( @@ -205,7 +192,7 @@ void Foam::sigFpe::set(const bool verbose) ); struct sigaction newAction; - newAction.sa_handler = sigFpeHandler; + newAction.sa_handler = sigHandler; newAction.sa_flags = SA_NODEFER; sigemptyset(&newAction.sa_mask); if (sigaction(SIGFPE, &newAction, &oldAction_) < 0) @@ -219,6 +206,7 @@ void Foam::sigFpe::set(const bool verbose) # elif defined(sgiN32) || defined(sgiN32Gcc) + supported = true; sigfpe_[_DIVZERO].abort=1; sigfpe_[_OVERFL].abort=1; @@ -240,23 +228,50 @@ void Foam::sigFpe::set(const bool verbose) ); # endif + + + if (verbose) + { + if (supported) + { + Info<< "sigFpe : Enabling floating point exception trapping" + << " (FOAM_SIGFPE)." << endl; + } + else + { + Info<< "sigFpe : Floating point exception trapping" + << " - not supported on this platform" << endl; + } + } } if (env("FOAM_SETNAN")) { - if (verbose) - { - Info<< "SetNaN : Initialising allocated memory to NaN" - << " (FOAM_SETNAN)." << endl; - } + bool supported = false; # ifdef LINUX_GNUC + supported = true; // Set our malloc - __malloc_hook = Foam::sigFpe::my_malloc_hook; + __malloc_hook = Foam::sigFpe::nanMallocHook_; # endif + + + if (verbose) + { + if (supported) + { + Info<< "SetNaN : Initialising allocated memory to NaN" + << " (FOAM_SETNAN)." << endl; + } + else + { + Info<< "SetNaN : Initialise allocated memory to NaN" + << " - not supported on this platform" << endl; + } + } } } diff --git a/src/OSspecific/POSIX/signals/sigFpe.H b/src/OSspecific/POSIX/signals/sigFpe.H index 220e1fc0e0..bc31630b49 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) 1991-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -43,7 +43,6 @@ SourceFiles #ifndef sigFpe_H #define sigFpe_H -#include "OSspecific.H" #include #if defined(linux) || defined(linuxAMD64) || defined(linuxIA64) @@ -73,10 +72,10 @@ class sigFpe # ifdef LINUX //- Saved old malloc - static void *(*old_malloc_hook)(size_t, const void *); + static void *(*oldMallocHook_)(size_t, const void *); - //- nan malloc function. From malloc_hook manpage. - static void* my_malloc_hook(size_t size, const void *caller); + //- NaN malloc function. From malloc_hook manpage. + static void* nanMallocHook_(size_t size, const void *caller); # endif @@ -86,7 +85,7 @@ class sigFpe # ifdef LINUX_GNUC //- Handler for caught signals - static void sigFpeHandler(int); + static void sigHandler(int); # endif @@ -96,6 +95,7 @@ public: // Constructors + //- Construct null sigFpe(); @@ -105,6 +105,8 @@ public: // Member functions + //- Activate SIGFPE signal handler when FOAM_SIGFPE is %set + // Fill memory with NaN when FOAM_SETNAN is %set void set(const bool verbose); }; diff --git a/src/OSspecific/POSIX/signals/sigInt.C b/src/OSspecific/POSIX/signals/sigInt.C index 429e426f6b..000d514971 100644 --- a/src/OSspecific/POSIX/signals/sigInt.C +++ b/src/OSspecific/POSIX/signals/sigInt.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -23,8 +23,8 @@ License \*---------------------------------------------------------------------------*/ -#include "error.H" #include "sigInt.H" +#include "error.H" #include "JobInfo.H" #include "IOstreams.H" @@ -32,16 +32,17 @@ License struct sigaction Foam::sigInt::oldAction_; + // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void Foam::sigInt::sigIntHandler(int) +void Foam::sigInt::sigHandler(int) { // Reset old handling if (sigaction(SIGINT, &oldAction_, NULL) < 0) { FatalErrorIn ( - "Foam::sigInt::sigIntHandler()" + "Foam::sigInt::sigHandler()" ) << "Cannot reset SIGINT trapping" << abort(FatalError); } @@ -80,7 +81,7 @@ Foam::sigInt::~sigInt() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -void Foam::sigInt::set(const bool verbose) +void Foam::sigInt::set(const bool) { if (oldAction_.sa_handler) { @@ -92,7 +93,7 @@ void Foam::sigInt::set(const bool verbose) } struct sigaction newAction; - newAction.sa_handler = sigIntHandler; + newAction.sa_handler = sigHandler; newAction.sa_flags = SA_NODEFER; sigemptyset(&newAction.sa_mask); if (sigaction(SIGINT, &newAction, &oldAction_) < 0) diff --git a/src/OSspecific/POSIX/signals/sigInt.H b/src/OSspecific/POSIX/signals/sigInt.H index 635434f12e..8a11b4f23f 100644 --- a/src/OSspecific/POSIX/signals/sigInt.H +++ b/src/OSspecific/POSIX/signals/sigInt.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -38,7 +38,9 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#include "OSspecific.H" +#ifndef sigInt_H +#define sigInt_H + #include // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -60,13 +62,14 @@ class sigInt // Private Member Functions - static void sigIntHandler(int); + static void sigHandler(int); public: // Constructors + //- Construct null sigInt(); @@ -76,6 +79,7 @@ public: // Member functions + //- Activate SIGINT signal handler void set(const bool verbose); }; @@ -84,4 +88,8 @@ public: } // End namespace Foam +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + // ************************************************************************* // diff --git a/src/OSspecific/POSIX/signals/sigQuit.C b/src/OSspecific/POSIX/signals/sigQuit.C index a9fee8c9d4..bd0ea7b835 100644 --- a/src/OSspecific/POSIX/signals/sigQuit.C +++ b/src/OSspecific/POSIX/signals/sigQuit.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -23,8 +23,8 @@ License \*---------------------------------------------------------------------------*/ -#include "error.H" #include "sigQuit.H" +#include "error.H" #include "JobInfo.H" #include "IOstreams.H" @@ -32,16 +32,17 @@ License struct sigaction Foam::sigQuit::oldAction_; + // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void Foam::sigQuit::sigQuitHandler(int) +void Foam::sigQuit::sigHandler(int) { // Reset old handling if (sigaction(SIGQUIT, &oldAction_, NULL) < 0) { FatalErrorIn ( - "Foam::sigQuit::sigQuitHandler()" + "Foam::sigQuit::sigHandler()" ) << "Cannot reset SIGQUIT trapping" << abort(FatalError); } @@ -94,7 +95,7 @@ void Foam::sigQuit::set(const bool verbose) } struct sigaction newAction; - newAction.sa_handler = sigQuitHandler; + newAction.sa_handler = sigHandler; newAction.sa_flags = SA_NODEFER; sigemptyset(&newAction.sa_mask); if (sigaction(SIGQUIT, &newAction, &oldAction_) < 0) diff --git a/src/OSspecific/POSIX/signals/sigQuit.H b/src/OSspecific/POSIX/signals/sigQuit.H index a7ed668f43..bc1b705048 100644 --- a/src/OSspecific/POSIX/signals/sigQuit.H +++ b/src/OSspecific/POSIX/signals/sigQuit.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -38,7 +38,9 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#include "OSspecific.H" +#ifndef sigQuit_H +#define sigQuit_H + #include // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -60,13 +62,15 @@ class sigQuit // Private Member Functions - static void sigQuitHandler(int); + //- Handler for caught signals + static void sigHandler(int); public: // Constructors + //- Construct null sigQuit(); @@ -76,6 +80,7 @@ public: // Member functions + //- Activate SIGQUIT signal handler void set(const bool verbose); }; @@ -84,4 +89,8 @@ public: } // End namespace Foam +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + // ************************************************************************* // diff --git a/src/OSspecific/POSIX/signals/sigSegv.C b/src/OSspecific/POSIX/signals/sigSegv.C index 084a4df215..39688c0c00 100644 --- a/src/OSspecific/POSIX/signals/sigSegv.C +++ b/src/OSspecific/POSIX/signals/sigSegv.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -23,8 +23,8 @@ License \*---------------------------------------------------------------------------*/ -#include "error.H" #include "sigSegv.H" +#include "error.H" #include "JobInfo.H" #include "IOstreams.H" @@ -32,16 +32,17 @@ License struct sigaction Foam::sigSegv::oldAction_; + // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void Foam::sigSegv::sigSegvHandler(int) +void Foam::sigSegv::sigHandler(int) { // Reset old handling if (sigaction(SIGSEGV, &oldAction_, NULL) < 0) { FatalErrorIn ( - "Foam::sigSegv::sigSegvHandler()" + "Foam::sigSegv::sigHandler()" ) << "Cannot reset SIGSEGV trapping" << abort(FatalError); } @@ -82,7 +83,7 @@ Foam::sigSegv::~sigSegv() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -void Foam::sigSegv::set(const bool verbose) +void Foam::sigSegv::set(const bool) { if (oldAction_.sa_handler) { @@ -94,7 +95,7 @@ void Foam::sigSegv::set(const bool verbose) } struct sigaction newAction; - newAction.sa_handler = sigSegvHandler; + newAction.sa_handler = sigHandler; newAction.sa_flags = SA_NODEFER; sigemptyset(&newAction.sa_mask); if (sigaction(SIGSEGV, &newAction, &oldAction_) < 0) diff --git a/src/OSspecific/POSIX/signals/sigSegv.H b/src/OSspecific/POSIX/signals/sigSegv.H index 5410c45ba3..f8c64022cc 100644 --- a/src/OSspecific/POSIX/signals/sigSegv.H +++ b/src/OSspecific/POSIX/signals/sigSegv.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -38,7 +38,9 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#include "OSspecific.H" +#ifndef sigSegv_H +#define sigSegv_H + #include // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -60,13 +62,15 @@ class sigSegv // Private Member Functions - static void sigSegvHandler(int); + //- Handler for caught signals + static void sigHandler(int); public: // Constructors + //- Construct null sigSegv(); @@ -76,6 +80,7 @@ public: // Member functions + //- Activate SIGSEGV signal handler void set(const bool verbose); }; @@ -84,4 +89,8 @@ public: } // End namespace Foam +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + // ************************************************************************* // diff --git a/src/OpenFOAM/global/argList/argList.H b/src/OpenFOAM/global/argList/argList.H index a8ad105b05..09588f8128 100644 --- a/src/OpenFOAM/global/argList/argList.H +++ b/src/OpenFOAM/global/argList/argList.H @@ -83,6 +83,7 @@ SourceFiles #include "fileName.H" #include "parRun.H" #include "IStringStream.H" +#include "OSspecific.H" #include "sigFpe.H" #include "sigInt.H"