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

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