diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-08-06 23:02:38 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-08-06 23:02:38 +0000 |
commit | 19c222f890b08f00f999b2853b09a0152ac423fb (patch) | |
tree | 22a8fdfdc53e25a6f6189de25babaa2d78f182d8 /libgfortran/intrinsics/signal.c | |
parent | 52f6c31a521d7304f8573ac78bf60e4bd521c4ce (diff) | |
download | gcc-19c222f890b08f00f999b2853b09a0152ac423fb.zip gcc-19c222f890b08f00f999b2853b09a0152ac423fb.tar.gz gcc-19c222f890b08f00f999b2853b09a0152ac423fb.tar.bz2 |
re PR fortran/30947 (intrinsic: ALARM)
PR fortran/30947
* iresolve.c (gfc_resolve_alarm_sub): Suffix the subroutine name
with the kind of the STATUS argument.
* intrinsics/signal.c: Create specific versions of alarm_sub and
alarm_sub_int according to the integer kind of the last argument.
* gfortran.map (GFORTRAN_1.0): Remove _gfortran_alarm_sub and
_gfortran_alarm_sub_int, add _gfortran_alarm_sub_i4,
_gfortran_alarm_sub_i8, _gfortran_alarm_sub_int_i4 and
_gfortran_alarm_sub_int_i8.
From-SVN: r127259
Diffstat (limited to 'libgfortran/intrinsics/signal.c')
-rw-r--r-- | libgfortran/intrinsics/signal.c | 72 |
1 files changed, 64 insertions, 8 deletions
diff --git a/libgfortran/intrinsics/signal.c b/libgfortran/intrinsics/signal.c index 2c2f38d..c69efac 100644 --- a/libgfortran/intrinsics/signal.c +++ b/libgfortran/intrinsics/signal.c @@ -132,11 +132,11 @@ iexport(signal_func_int); /* ALARM intrinsic with PROCEDURE as handler */ -extern void alarm_sub (int *, void (*)(int), int *); -iexport_proto(alarm_sub); +extern void alarm_sub_i4 (int *, void (*)(int), GFC_INTEGER_4 *); +iexport_proto(alarm_sub_i4); void -alarm_sub (int *seconds, void (*handler)(int), int *status) +alarm_sub_i4 (int *seconds, void (*handler)(int), GFC_INTEGER_4 *status) { #if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL) if (status != NULL) @@ -157,15 +157,71 @@ alarm_sub (int *seconds, void (*handler)(int), int *status) *status = -1; #endif } -iexport(alarm_sub); +iexport(alarm_sub_i4); + + +extern void alarm_sub_i8 (int *, void (*)(int), GFC_INTEGER_8 *); +iexport_proto(alarm_sub_i8); + +void +alarm_sub_i8 (int *seconds, void (*handler)(int), GFC_INTEGER_8 *status) +{ +#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL) + if (status != NULL) + { + if (signal (SIGALRM, handler) == SIG_ERR) + *status = -1; + else + *status = alarm (*seconds); + } + else + { + signal (SIGALRM, handler); + alarm (*seconds); + } +#else + errno = ENOSYS; + if (status != NULL) + *status = -1; +#endif +} +iexport(alarm_sub_i8); /* ALARM intrinsic with INTEGER as handler */ -extern void alarm_sub_int (int *, int *, int *); -iexport_proto(alarm_sub_int); +extern void alarm_sub_int_i4 (int *, int *, GFC_INTEGER_4 *); +iexport_proto(alarm_sub_int_i4); + +void +alarm_sub_int_i4 (int *seconds, int *handler, GFC_INTEGER_4 *status) +{ +#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL) + if (status != NULL) + { + if (signal (SIGALRM, (void (*)(int)) *handler) == SIG_ERR) + *status = -1; + else + *status = alarm (*seconds); + } + else + { + signal (SIGALRM, (void (*)(int)) *handler); + alarm (*seconds); + } +#else + errno = ENOSYS; + if (status != NULL) + *status = -1; +#endif +} +iexport(alarm_sub_int_i4); + + +extern void alarm_sub_int_i8 (int *, int *, GFC_INTEGER_8 *); +iexport_proto(alarm_sub_int_i8); void -alarm_sub_int (int *seconds, int *handler, int *status) +alarm_sub_int_i8 (int *seconds, int *handler, GFC_INTEGER_8 *status) { #if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL) if (status != NULL) @@ -186,5 +242,5 @@ alarm_sub_int (int *seconds, int *handler, int *status) *status = -1; #endif } -iexport(alarm_sub_int); +iexport(alarm_sub_int_i8); |