1 /* Implementation of the SIGNAL and ALARM g77 intrinsics
2 Copyright (C) 2005-2013 Free Software Foundation, Inc.
3 Contributed by François-Xavier Coudert <coudert@clipper.ens.fr>
5 This file is part of the GNU Fortran runtime library (libgfortran).
7 Libgfortran is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public
9 License as published by the Free Software Foundation; either
10 version 3 of the License, or (at your option) any later version.
12 Libgfortran is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
21 You should have received a copy of the GNU General Public License and
22 a copy of the GCC Runtime Library Exception along with this program;
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 <http://www.gnu.org/licenses/>. */
26 #include "libgfortran.h"
34 #ifdef HAVE_INTTYPES_H
40 /* SIGNAL subroutine with PROCEDURE as handler */
41 extern void signal_sub (int *, void (*)(int), int *);
42 iexport_proto(signal_sub
);
45 signal_sub (int *number
, void (*handler
)(int), int *status
)
51 ret
= (intptr_t) signal (*number
, handler
);
55 signal (*number
, handler
);
60 /* SIGNAL subroutine with INTEGER as handler */
61 extern void signal_sub_int (int *, int *, int *);
62 iexport_proto(signal_sub_int
);
65 signal_sub_int (int *number
, int *handler
, int *status
)
67 intptr_t ptr
= *handler
, ret
;
71 ret
= (intptr_t) signal (*number
, (void (*)(int)) ptr
);
75 signal (*number
, (void (*)(int)) ptr
);
77 iexport(signal_sub_int
);
80 /* SIGNAL function with PROCEDURE as handler */
81 extern int signal_func (int *, void (*)(int));
82 iexport_proto(signal_func
);
85 signal_func (int *number
, void (*handler
)(int))
88 signal_sub (number
, handler
, &status
);
94 /* SIGNAL function with INTEGER as handler */
95 extern int signal_func_int (int *, int *);
96 iexport_proto(signal_func_int
);
99 signal_func_int (int *number
, int *handler
)
102 signal_sub_int (number
, handler
, &status
);
105 iexport(signal_func_int
);
109 /* ALARM intrinsic with PROCEDURE as handler */
110 extern void alarm_sub_i4 (int *, void (*)(int), GFC_INTEGER_4
*);
111 iexport_proto(alarm_sub_i4
);
114 alarm_sub_i4 (int * seconds
__attribute__ ((unused
)),
115 void (*handler
)(int) __attribute__ ((unused
)),
116 GFC_INTEGER_4
*status
)
118 #if defined (SIGALRM) && defined (HAVE_ALARM)
121 if (signal (SIGALRM
, handler
) == SIG_ERR
)
124 *status
= alarm (*seconds
);
128 signal (SIGALRM
, handler
);
137 iexport(alarm_sub_i4
);
140 extern void alarm_sub_i8 (int *, void (*)(int), GFC_INTEGER_8
*);
141 iexport_proto(alarm_sub_i8
);
144 alarm_sub_i8 (int *seconds
__attribute__ ((unused
)),
145 void (*handler
)(int) __attribute__ ((unused
)),
146 GFC_INTEGER_8
*status
)
148 #if defined (SIGALRM) && defined (HAVE_ALARM)
151 if (signal (SIGALRM
, handler
) == SIG_ERR
)
154 *status
= alarm (*seconds
);
158 signal (SIGALRM
, handler
);
167 iexport(alarm_sub_i8
);
170 /* ALARM intrinsic with INTEGER as handler */
171 extern void alarm_sub_int_i4 (int *, int *, GFC_INTEGER_4
*);
172 iexport_proto(alarm_sub_int_i4
);
175 alarm_sub_int_i4 (int *seconds
__attribute__ ((unused
)),
176 int *handler
__attribute__ ((unused
)),
177 GFC_INTEGER_4
*status
)
179 #if defined (SIGALRM) && defined (HAVE_ALARM)
182 if (signal (SIGALRM
, (void (*)(int)) (intptr_t) *handler
) == SIG_ERR
)
185 *status
= alarm (*seconds
);
189 signal (SIGALRM
, (void (*)(int)) (intptr_t) *handler
);
198 iexport(alarm_sub_int_i4
);
201 extern void alarm_sub_int_i8 (int *, int *, GFC_INTEGER_8
*);
202 iexport_proto(alarm_sub_int_i8
);
205 alarm_sub_int_i8 (int *seconds
__attribute__ ((unused
)),
206 int *handler
__attribute__ ((unused
)),
207 GFC_INTEGER_8
*status
)
209 #if defined (SIGALRM) && defined (HAVE_ALARM)
212 if (signal (SIGALRM
, (void (*)(int)) (intptr_t) *handler
) == SIG_ERR
)
215 *status
= alarm (*seconds
);
219 signal (SIGALRM
, (void (*)(int)) (intptr_t) *handler
);
228 iexport(alarm_sub_int_i8
);