aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/intrinsics/signal.c
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-08-06 23:02:38 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-08-06 23:02:38 +0000
commit19c222f890b08f00f999b2853b09a0152ac423fb (patch)
tree22a8fdfdc53e25a6f6189de25babaa2d78f182d8 /libgfortran/intrinsics/signal.c
parent52f6c31a521d7304f8573ac78bf60e4bd521c4ce (diff)
downloadgcc-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.c72
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);