perl
view release on metacpan or search on metacpan
# elif defined(MAX_SIG)
# define NSIG (MAX_SIG+1)
# elif defined(SIGARRAYSIZE)
# define NSIG SIGARRAYSIZE /* Assume ary[SIGARRAYSIZE] */
# elif defined(_sys_nsig)
# define NSIG (_sys_nsig) /* Solaris 2.5 */
# else
/* Default to some arbitrary number that's big enough to get most
* of the common signals. */
# define NSIG 50
# endif
#endif
/* <-- NSIG logic from Configure */
#ifndef NO_ENVIRON_ARRAY
# define USE_ENVIRON_ARRAY
#endif
#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
/* having sigaction(2) means that the OS supports both 1-arg and 3-arg
* signal handlers. But the perl core itself only fully supports 1-arg
* handlers, so don't enable for now.
* NB: POSIX::sigaction() supports both.
*
* # define PERL_USE_3ARG_SIGHANDLER
*/
#endif
/* Siginfo_t:
* This is an alias for the OS's siginfo_t, except that where the OS
* doesn't support it, declare a dummy version instead. This allows us to
* have signal handler functions which always have a Siginfo_t parameter
* regardless of platform, (and which will just be passed a NULL value
* where the OS doesn't support HAS_SIGACTION).
*/
#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
typedef siginfo_t Siginfo_t;
#else
#ifdef si_signo /* minix */
#undef si_signo
#endif
typedef struct {
int si_signo;
} Siginfo_t;
#endif
/*
* initialise to avoid floating-point exceptions from overflow, etc
*/
#ifndef PERL_FPU_INIT
# ifdef HAS_FPSETMASK
# if HAS_FLOATINGPOINT_H
# include <floatingpoint.h>
# endif
/* Some operating systems have this as a macro, which in turn expands to a comma
expression, and the last sub-expression is something that gets calculated,
and then they have the gall to warn that a value computed is not used. Hence
cast to void. */
# define PERL_FPU_INIT (void)fpsetmask(0)
# elif defined(SIGFPE) && defined(SIG_IGN)
# define PERL_FPU_INIT PL_sigfpe_saved = (Sighandler_t) signal(SIGFPE, SIG_IGN)
# define PERL_FPU_PRE_EXEC { Sigsave_t xfpe; rsignal_save(SIGFPE, PL_sigfpe_saved, &xfpe);
# define PERL_FPU_POST_EXEC rsignal_restore(SIGFPE, &xfpe); }
# else
# define PERL_FPU_INIT
# endif
#endif
#ifndef PERL_FPU_PRE_EXEC
# define PERL_FPU_PRE_EXEC {
# define PERL_FPU_POST_EXEC }
#endif
/* In Tru64 the cc -ieee enables the IEEE math but disables traps.
* We need to reenable the "invalid" trap because otherwise generation
* of NaN values leaves the IEEE fp flags in bad state, leaving any further
* fp ops behaving strangely (Inf + 1 resulting in zero, for example). */
#ifdef __osf__
# include <machine/fpu.h>
# define PERL_SYS_FPU_INIT \
STMT_START { \
ieee_set_fp_control(IEEE_TRAP_ENABLE_INV); \
signal(SIGFPE, SIG_IGN); \
} STMT_END
#endif
/* In IRIX the default for Flush to Zero bit is true,
* which means that results going below the minimum of normal
* floating points go to zero, instead of going denormal/subnormal.
* This is unlike almost any other system running Perl, so let's clear it.
* [perl #123767] IRIX64 blead (ddce084a) opbasic/arith.t failure, originally
* [perl #120426] small numbers shouldn't round to zero if they have extra floating digits
*
* XXX The flush-to-zero behaviour should be a Configure scan.
* To change the behaviour usually requires some system-specific
* incantation, though, like the below. */
#ifdef __sgi
# include <sys/fpu.h>
# define PERL_SYS_FPU_INIT \
STMT_START { \
union fpc_csr csr; \
csr.fc_word = get_fpc_csr(); \
csr.fc_struct.flush = 0; \
set_fpc_csr(csr.fc_word); \
} STMT_END
#endif
#ifndef PERL_SYS_FPU_INIT
# define PERL_SYS_FPU_INIT NOOP
#endif
#ifndef PERL_SYS_INIT3_BODY
# define PERL_SYS_INIT3_BODY(argvp,argcp,envp) PERL_SYS_INIT_BODY(argvp,argcp)
#endif
/*
=for apidoc_section $embedding
=for apidoc Am|void|PERL_SYS_INIT |int *argc|char*** argv
=for apidoc_item| |PERL_SYS_INIT3|int *argc|char*** argv|char*** env
( run in 0.420 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )