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

Last change on this file since 70 was 70, checked in by g7moreau, 12 years ago
  • Begin error code return Not finish...
  • Property svn:keywords set to Id
File size: 3.7 KB
Line 
1!--------------------------------------------------------------!
2! 2012/04/20 (C) Gabriel Moreau
3! Licence LGPLv2 or letter
4! $Id: signal_checkpoint.F90 70 2012-05-25 16:16:35Z g7moreau $
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
28integer, public :: INTERNAL_ERROR_ON_EXIT_  = 0
29integer, public :: INTERNAL_SIGNAL_EXIT_    = 0
30
31public :: SIGHUP
32public :: SIGINT
33public :: SIGQUIT
34public :: SIGUSR1
35public :: SIGUSR2
36public :: SIGTERM
37public :: signal_checkpoint_connect
38public :: signal_checkpoint_is_received
39public :: signal_checkpoint_received_times
40public :: signal_checkpoint_ask_for_exit_code
41
42!--------------------------------------------------------------!
43contains
44!--------------------------------------------------------------!
45
46subroutine signal_checkpoint_connect (SIG_NUM, EXIT)
47   integer, intent(in) :: SIG_NUM
48   logical, intent(in), optional :: EXIT
49
50
51#ifdef __INTEL_COMPILER
52   integer :: ERR
53
54   if (present(EXIT)) then
55      INTERNAL_SIGNAL_EXIT_ = SIG_NUM
56   end if
57
58   ERR = signal(SIG_NUM, signal_checkpoint_trap_callback_intel_, -1)
59#endif
60
61#ifdef __GNUC__
62   intrinsic signal
63
64   if (present(EXIT)) then
65      INTERNAL_SIGNAL_EXIT_ = SIG_NUM
66   end if
67
68   call signal(SIG_NUM, signal_checkpoint_trap_callback_gfortran_)
69#endif
70
71end subroutine
72
73!--------------------------------------------------------------!
74
75function signal_checkpoint_is_received () result (IS_RECEIVED)
76   logical :: IS_RECEIVED
77
78   IS_RECEIVED = (INTERNAL_RECEIVED_COUNT_ > 0)
79end function
80
81!--------------------------------------------------------------!
82
83function signal_checkpoint_received_times () result (RECEIVED_TIMES)
84   integer :: RECEIVED_TIMES
85
86   RECEIVED_TIMES = INTERNAL_RECEIVED_COUNT_
87end function
88
89!--------------------------------------------------------------!
90
91function signal_checkpoint_ask_for_exit_code () result (EXIT)
92   logical :: EXIT
93   
94   EXIT = ( INTERNAL_ERROR_ON_EXIT_ /= 0 )
95end function
96
97!--------------------------------------------------------------!
98end module
99!--------------------------------------------------------------!
100
101
102!--------------------------------------------------------------!
103! Internal trap procedure and function
104! Must be external to be C compatible
105!--------------------------------------------------------------!
106
107subroutine signal_checkpoint_trap_callback_gfortran_ (SIG_NUM)
108   use Signal_Checkpoint
109   integer, intent(in) :: SIG_NUM
110
111!       print *, "SIG1 : ", SIG_NUM
112!  if (SIG_NUM == INTERNAL_SIGNAL_EXIT_) then
113!      print *, "SIG2 : ", INTERNAL_SIGNAL_EXIT_
114!      INTERNAL_ERROR_ON_EXIT_ = 1
115!      print *, "SIG3 : ", INTERNAL_SIGNAL_EXIT_
116!   end if
117   INTERNAL_RECEIVED_COUNT_ = INTERNAL_RECEIVED_COUNT_ + 1
118end subroutine
119
120!--------------------------------------------------------------!
121
122function signal_checkpoint_trap_callback_intel_ (SIG_NUM) result (ONE)
123   use Signal_Checkpoint
124   integer, intent(in) :: SIG_NUM
125   integer :: ONE
126
127!   if (SIG_NUM == INTERNAL_SIGNAL_EXIT_) then
128!      INTERNAL_ERROR_ON_EXIT_ = 1
129!   end if
130   INTERNAL_RECEIVED_COUNT_ = INTERNAL_RECEIVED_COUNT_ + 1
131   ONE = 1
132end
133
134!--------------------------------------------------------------!
135!--------------------------------------------------------------!
Note: See TracBrowser for help on using the repository browser.