SURFEX v8.1
General documentation of Surfex
ifssig.c
Go to the documentation of this file.
1 /***********************************************************************
2 .TITLE ECMWF Utility
3 .NAME IFSSIG
4 .SECTION METAPPS
5 .AUTHOR Otto Pesonen
6 .DATE 29-JUL-1996 / 22-JUL-1996 / OP
7 .VERSION 1.0
8 .LANGUAGE ANSI-C
9 .FILE ifssig.c
10 .DATE 22-AUG-1996 / 22-AUG-1996 / OP
11 .VERSION 1.1
12 *
13 * IFS signal handler to produce checkpoint files.
14 *
15 * Compile:
16 *
17 * cc -c ifssig.c
18 *
19 ***********************************************************************/
20 
21 #include <stdio.h>
22 #include <signal.h>
23 #include <unistd.h>
24 
25 #undef SIGNAL_STACK /* Signals do not stack */
26 
27 #define CHECKPOINT SIGHUP
28 #define RESTART SIGINT
29 
30 #define IFSSIGMASK (1<<(CHECKPOINT-1)) | (1<<(RESTART-1))
31 
32 static int *re_start;
33 static int *go_on;
34 
35 static void (*sigcheck)();
36 static void (*sigrestart)();
37 
38 static int mask;
39 
40 static void catch(int sig)
41 {
42  switch(sig)
43  {
44  case CHECKPOINT:
45  *go_on = 0;
46  *re_start = 1;
47 
48 #ifdef SIGNAL_STACK
49  if( sigcheck != SIG_DFL && sigcheck != SIG_IGN )
50  sigcheck(sig);
51 #endif
52  signal(sig,catch);
53  printf("ifssig:got CHECKPOINT signal\n");
54  break;
55 
56  case RESTART:
57  *go_on = 1;
58  *re_start = 1;
59 
60 #ifdef SIGNAL_STACK
61  if( sigrestart != SIG_DFL && sigrestart != SIG_IGN )
62  sigrestart(sig);
63 #endif
64 
65  signal(sig,catch);
66  printf("ifssig:got RESTART signal\n");
67  break;
68  }
69  fflush(stdout);
70 }
71 
72 void ifssigb()
73 /**************************************************************************
74 ? Unblock IFS signals. This will call the signal-handler if there is any
75 | such signals pending.
76 | Once the signals are processed, block them until we come in here again
77 ***********************************************************************/
78 {
79  sigset_t set;
80 
81  sigemptyset(&set);
82  sigaddset(&set, CHECKPOINT);
83  sigaddset(&set, RESTART);
84  sigprocmask(SIG_UNBLOCK, &set, 0);
85 
86  sigemptyset(&set);
87  sigaddset(&set, CHECKPOINT);
88  sigaddset(&set, RESTART);
89  sigprocmask(SIG_BLOCK, &set, 0);
90 }
91 
92 void ifssigb_() { ifssigb(); }
93 void ifssig(int *goon, int *restart)
94 /***********************************************************************
95 ? Register for IFS signals.
96 | And block them untill we want to process them.
97 ***********************************************************************/
98 {
99  go_on = goon;
100  re_start = restart;
101 
102  *go_on = 0;
103  *re_start = 0;
104 
105  if( cmpl_myrank_() == 1 )
106  {
107  sigcheck = signal(CHECKPOINT, catch);
108  sigrestart = signal(RESTART, catch);
109  }
110  else
111  {
112  sigcheck = signal(CHECKPOINT, SIG_IGN);
113  sigrestart = signal(RESTART, SIG_IGN);
114  }
115 
116  ifssigb();
117  fflush(stdout);
118 }
119 
120 void ifssig_(int *goon, int *restart) { ifssig(goon, restart); }
121 
122 #ifdef DEBUG
123 
125 {
126  int i;
127  int goon = 0;
128  int restart = 0;
129 
130  printf("PID is %d\n",getpid());
131 
132  ifssig(&goon, &restart);
133 
134  for( i=0 ; i<33 && !goon ; i++ )
135  {
136  sleep(3);
137 
138  ifssigb();
139 
140  if(goon)
141  {
142  printf("i=%d goon %d\n",i,goon);
143  }
144 
145  if(restart)
146  {
147  printf("i=%d restart %d\n",i,restart);
148  restart=0;
149  }
150  }
151 }
152 
154 {
155  return 1;
156 }
157 
158 #endif
159 
161 {
162  FILE *out;
163  char v1[132];
164  int i;
165  size_t len;
166  len=132;
167 /* out=popen("hostname","r"); */
168  i=gethostname(v1,len);
169  i=getpid();
170  fprintf(stderr,"MASTER-HOSTNAME-PID %s %d\n",v1,i);
171 }
172 
173 
void ifssigb_()
Definition: ifssig.c:92
static int * go_on
Definition: ifssig.c:33
void sigmaster_()
Definition: ifssig.c:160
void ifssig_(int *goon, int *restart)
Definition: ifssig.c:120
static void(* sigrestart)()
Definition: ifssig.c:36
void ifssigb()
Definition: ifssig.c:72
int cmpl_myrank_()
Definition: ifssig.c:153
void ifssig(int *goon, int *restart)
Definition: ifssig.c:93
static int mask
Definition: ifssig.c:38
static void(* sigcheck)()
Definition: ifssig.c:35
main()
Definition: ifssig.c:124
static int * re_start
Definition: ifssig.c:32