libm
When a math function detects an error, it sets the static variable
errno
. Depending upon the severity of the error, it may also
print a message to stderr
. None of this behavior is reentrant.
When one process detects an error, it sets errno
. If another
process is testing errno
, it detects the change and probably
fails. Note that failing system calls can also set errno
. This
problem can only be fixed by either ignoring errno
, or treating
it as part of the context of a process and switching it along with the
rest of a processor state. In normal debugged programs, there are
usually no math subroutine errors--and therefore no matherr
calls; in that situation, the math functions behave reentrantly.
As an alternative, you can use the reentrant versions of the mathematical functions: these versions have a different name, normally formed by prepending `_' and appending `_r', and use an extra argument--a pointer to the particular reentrancy structure to use. See section `Reentrancy' in The Cygnus C Support Library, for more discussion of this approach to reentrancy.
The reentrancy structure is always an additional first argument; for example, the reentrant version of `double acos (double x)' is `double _acos_r (void *reent, double x)'.
Here is a list of the names for reentrant versions of the mathematical library functions:
_acos_r _gammaf_r_r _log10f_r _acosf_r _hypot_r _log_r _acosh_r _hypotf_r _logf_r _acoshf_r _j0_r _pow_r _asin_r _j0f_r _powf_r _asinf_r _j1_r _remainder_r _atanh_r _j1f_r _sinh_r _atanhf_r _jn_r _sinhf_r _cosh_r _jnf_r _sqrt_r _coshf_r _ldexp_r _sqrtf_r _exp_r _ldexpf_r _y0_r _expf_r _lgamma_r _y0f_r _fmod_r _lgamma_r_r _y1_r _fmodf_r _lgammaf_r _y1f_r _gamma_r _lgammaf_r_r _yn_r _gamma_r_r _log10_r _ynf_r _gammaf_r