source: trunk/signal-checkpoint/signal_checkpoint.F90 @ 67

Last change on this file since 67 was 67, checked in by g7moreau, 12 years ago
  • Add parameter SIGUSR1, SIGINT...
File size: 2.9 KB
Line 
1!--------------------------------------------------------------!
2! 2012/04/20 (C) Gabriel Moreau
3! Licence LGPLv2 or letter
4! $Id:$
5!--------------------------------------------------------------!
6
7module Signal_Checkpoint
8
9#ifdef __INTEL_COMPILER
10use IFPORT, only: signal
11#endif
12
13implicit none
14private
15
16integer, external :: signal_checkpoint_trap_callback_intel_
17external          :: signal_checkpoint_trap_callback_gfortran_
18
19integer, parameter :: SIGHUP  =  1  ! Signal HUP
20integer, parameter :: SIGINT  =  2  ! Signal INT
21integer, parameter :: SIGQUIT =  3  ! Signal QUIT
22integer, parameter :: SIGUSR1 = 10  ! Signal USR1
23integer, parameter :: SIGUSR2 = 12  ! Signal USR2
24integer, parameter :: SIGTERM = 15  ! Signal TERM
25
26! False public, only for trap procedure
27integer, public :: INTERNAL_RECEIVED_COUNT_ = 0  ! Global Counter
28
29public :: SIGHUP
30public :: SIGINT
31public :: SIGQUIT
32public :: SIGUSR1
33public :: SIGUSR2
34public :: SIGTERM
35public :: signal_checkpoint_connect
36public :: signal_checkpoint_is_received
37public :: signal_checkpoint_received_times
38
39!--------------------------------------------------------------!
40contains
41!--------------------------------------------------------------!
42
43subroutine signal_checkpoint_connect (SIG_NUM)
44   integer, intent(in) :: SIG_NUM
45
46#ifdef __INTEL_COMPILER
47   integer :: ERR
48     
49   ERR = signal(SIG_NUM, signal_checkpoint_trap_callback_intel_, -1)
50#endif
51
52#ifdef __GNUC__
53   intrinsic signal
54
55   call signal(SIG_NUM, signal_checkpoint_trap_callback_gfortran_)
56#endif
57
58end subroutine
59
60!--------------------------------------------------------------!
61
62function signal_checkpoint_is_received () result (IS_RECEIVED)
63   logical :: IS_RECEIVED
64
65   IS_RECEIVED = (INTERNAL_RECEIVED_COUNT_ > 0)
66end function
67
68!--------------------------------------------------------------!
69
70function signal_checkpoint_received_times () result (RECEIVED_TIMES)
71   integer :: RECEIVED_TIMES
72
73   RECEIVED_TIMES = INTERNAL_RECEIVED_COUNT_
74end function
75
76!--------------------------------------------------------------!
77end module
78!--------------------------------------------------------------!
79
80
81!--------------------------------------------------------------!
82! Internal trap procedure and function
83! Must be external to be C compatible
84!--------------------------------------------------------------!
85
86subroutine signal_checkpoint_trap_callback_gfortran_ (SIG_NUM)
87   use Signal_Checkpoint
88   integer, intent(in) :: SIG_NUM
89
90   INTERNAL_RECEIVED_COUNT_ = INTERNAL_RECEIVED_COUNT_ + 1
91end subroutine
92
93!--------------------------------------------------------------!
94
95function signal_checkpoint_trap_callback_intel_ (SIG_NUM) result (ONE)
96   use Signal_Checkpoint
97   integer, intent(in) :: SIG_NUM
98   integer :: ONE
99
100   INTERNAL_RECEIVED_COUNT_ = INTERNAL_RECEIVED_COUNT_ + 1
101   ONE = 1
102end
103
104!--------------------------------------------------------------!
105!--------------------------------------------------------------!
Note: See TracBrowser for help on using the repository browser.