33 #if defined(FOAM_HAVE_FEENABLEEXCEPT) && defined(FOAM_HAVE_FENV_H)
38 #elif defined(FOAM_HAVE_HANDLE_SIGFPES) && defined(FOAM_HAVE_SIGFPE_H)
42 #ifdef FOAM_USE_MALLOC_HOOK
49 struct sigaction Foam::sigFpeImpl::oldAction_;
52 #ifdef FOAM_USE_MALLOC_HOOK
54 void *(*Foam::sigFpeImpl::old_malloc_hook)(size_t, const void *) = NULL;
56 void* Foam::sigFpeImpl::my_malloc_hook(size_t size, const void *caller)
61 __malloc_hook = old_malloc_hook;
64 result = malloc (size);
69 const uint32_t sNAN = 0x7ff7fffflu;
71 int nScalars = size /
sizeof(scalar);
73 uint32_t* dPtr =
reinterpret_cast<uint32_t*
>(result);
75 for (
int i = 0; i < nScalars; i++)
82 const uint64_t sNAN = 0x7ff7ffffffffffffllu;
84 int nScalars = size/
sizeof(scalar);
86 uint64_t* dPtr =
reinterpret_cast<uint64_t*
>(result);
88 for (
int i = 0; i < nScalars; i++)
96 __malloc_hook = my_malloc_hook;
104 #ifdef FOAM_USE_FPE_HANDLING
106 void Foam::sigFpeImpl::sigFpeHandler(
int)
109 if (sigaction(SIGFPE, &oldAction_, NULL) < 0)
113 "Foam::sigFpeImpl::sigFpeHandler()"
114 ) <<
"Cannot reset SIGFPE trapping"
134 oldAction_.sa_handler = NULL;
142 #ifdef FOAM_USE_FPE_HANDLING
143 if (
env(
"FOAM_SIGFPE"))
147 if (oldAction_.sa_handler && sigaction(SIGFPE, &oldAction_, NULL) < 0)
151 "Foam::sigFpeImpl::~sigFpeImpl()"
152 ) <<
"Cannot reset SIGFPE trapping"
159 #ifdef FOAM_USE_MALLOC_HOOK
160 if (
env(
"FOAM_SETNAN"))
164 if (oldAction_.sa_handler)
166 __malloc_hook = old_malloc_hook;
178 if (oldAction_.sa_handler)
182 "Foam::sigFpeImpl::set()"
183 ) <<
"Cannot call sigFpeImpl::set() more than once"
187 #ifdef FOAM_USE_FPE_HANDLING
188 if (
env(
"FOAM_SIGFPE"))
190 # if defined(FOAM_HAVE_FEENABLEEXCEPT)
193 Info<<
"SigFpe : Enabling floating point exception trapping"
194 <<
" (FOAM_SIGFPE)." <<
endl;
204 struct sigaction newAction;
205 newAction.sa_handler = sigFpeHandler;
206 newAction.sa_flags = SA_NODEFER;
207 sigemptyset(&newAction.sa_mask);
208 if (sigaction(SIGFPE, &newAction, &oldAction_) < 0)
212 "Foam::sigFpeImpl::set()"
213 ) <<
"Cannot set SIGFPE trapping"
218 # elif defined(FOAM_HAVE_HANDLE_SIGFPES)
220 sigfpe_[_DIVZERO].abort=1;
221 sigfpe_[_OVERFL].abort=1;
222 sigfpe_[_INVALID].abort=1;
224 sigfpe_[_DIVZERO].trace=1;
225 sigfpe_[_OVERFL].trace=1;
226 sigfpe_[_INVALID].trace=1;
241 #endif // FOAM_USE_FPE_HANDLING
244 #ifdef FOAM_USE_MALLOC_HOOK
245 if (
env(
"FOAM_SETNAN"))
249 Info<<
"SetNaN : Initialising allocated memory to NaN"
250 <<
" (FOAM_SETNAN)." <<
endl;
254 __malloc_hook = Foam::sigFpeImpl::my_malloc_hook;