1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define _GNU_SOURCE
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <string.h>
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <pthread.h>
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdlib.h>
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h>
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <fcntl.h>
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <unistd.h>
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <sys/types.h>
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <sys/syscall.h>
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <sched.h>
11eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include <signal.h>
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int loops = 15; // each thread+main will do this amount of loop
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int sleepms = 1000; // in each loop, will sleep "sleepms" milliseconds
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int burn = 0; // after each sleep, will burn cpu in a tight 'burn' loop
15eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void setup_sigusr_handler(void); // sigusr1 and 2 sigaction setup.
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic pid_t gettid()
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifdef __NR_gettid
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return syscall(__NR_gettid);
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return getpid();
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// will be invoked from gdb.
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void whoami(char *msg) __attribute__((unused));
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void whoami(char *msg)
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   fprintf(stderr, "pid %d Thread %d %s\n", getpid(), gettid(), msg);
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   fflush(stderr);
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void do_burn ()
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int i;
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int loopnr = 0;
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // one single line for the below, to ensure interrupt on this line.
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for (i = 0; i < burn; i++) loopnr++;
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int thread_ready = 0;
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic pthread_cond_t ready = PTHREAD_COND_INITIALIZER;
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER;
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void signal_ready (void)
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int rc;
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rc = pthread_mutex_lock(&ready_mutex);
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (rc != 0)
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      fprintf(stderr, "signal_ready lock error %d_n", rc);
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   thread_ready = 1;
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rc = pthread_cond_signal(&ready);
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (rc != 0)
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      fprintf(stderr, "signal_ready signal error %d_n", rc);
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rc = pthread_mutex_unlock(&ready_mutex);
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (rc != 0)
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      fprintf(stderr, "signal_ready unlock error %d_n", rc);
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct spec {
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   char *name;
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int sleep;
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int burn;
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int t;
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov};
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic struct timeval t[4];
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int nr_sleeper_or_burner = 0;
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic volatile int report_finished = 1;
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// set to 0 to have no finish msg (as order is non-deterministic)
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void *sleeper_or_burner(void *v)
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int i = 0;
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct spec* s = (struct spec*)v;
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   fprintf(stderr, "%s ready to sleep and/or burn\n", s->name);
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   fflush (stderr);
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   signal_ready();
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   nr_sleeper_or_burner++;
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for (i = 0; i < loops; i++) {
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (sleepms > 0 && s->sleep) {
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         t[s->t].tv_sec = sleepms / 1000;
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         t[s->t].tv_usec = (sleepms % 1000) * 1000;
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         select (0, NULL, NULL, NULL, &t[s->t]);
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (burn > 0 && s->burn)
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         do_burn();
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (report_finished) {
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      fprintf(stderr, "%s finished to sleep and/or burn\n", s->name);
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      fflush (stderr);
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return NULL;
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// wait till a thread signals it is ready
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void wait_ready(void)
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int rc;
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rc = pthread_mutex_lock(&ready_mutex);
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (rc != 0)
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      fprintf(stderr, "wait_ready lock error %d_n", rc);
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (! thread_ready && rc == 0) {
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      rc = pthread_cond_wait(&ready, &ready_mutex);
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (rc != 0)
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         fprintf(stderr, "wait_ready wait error %d_n", rc);
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   thread_ready = 0;
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rc = pthread_mutex_unlock(&ready_mutex);
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (rc != 0)
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      fprintf(stderr, "wait_ready unlock error %d_n", rc);
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// We will lock ourselves on one single cpu.
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// This bypasses the unfairness of the Valgrind scheduler
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// when a multi-cpu machine has enough cpu to run all the
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// threads wanting to burn cpu.
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void setaffinity(void)
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifdef VGO_linux
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cpu_set_t single_cpu;
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   CPU_ZERO(&single_cpu);
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   CPU_SET(1, &single_cpu);
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (void) sched_setaffinity(0, sizeof(single_cpu), &single_cpu);
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // GDBTD: equivalent for Darwin ?
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main (int argc, char *argv[])
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  char *threads_spec;
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  pthread_t ebbr, egll, zzzz;
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  struct spec b, l, p, m;
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  char *some_mem __attribute__((unused)) = malloc(100);
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  setaffinity();
136eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  setup_sigusr_handler();
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (argc > 1)
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     loops = atoi(argv[1]);
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (argc > 2)
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     sleepms = atoi(argv[2]);
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (argc > 3)
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     burn = atoll(argv[3]);
145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (argc > 4)
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     threads_spec = argv[4];
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  else
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     threads_spec = "BSBSBSBS";
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  fprintf(stderr, "loops/sleep_ms/burn/threads_spec:  %d %d %d %s\n",
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          loops, sleepms, burn, threads_spec);
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  fflush(stderr);
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  b.name = "Brussels";
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  b.burn = *threads_spec++ == 'B';
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  b.sleep = *threads_spec++ == 'S';
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  b.t = -1;
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (b.burn || b.sleep) {
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     b.t = 1;
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     pthread_create(&ebbr, NULL, sleeper_or_burner, &b);
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     wait_ready();
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  l.name = "London";
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  l.burn = *threads_spec++ == 'B';
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  l.sleep = *threads_spec++ == 'S';
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  l.t = -1;
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (l.burn || l.sleep) {
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     l.t = 2;
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     pthread_create(&egll, NULL, sleeper_or_burner, &l);
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     wait_ready();
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  p.name = "Petaouchnok";
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  p.burn = *threads_spec++ == 'B';
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  p.sleep = *threads_spec++ == 'S';
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  p.t = -1;
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (p.burn || p.sleep) {
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     p.t = 3;
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     pthread_create(&zzzz, NULL, sleeper_or_burner, &p);
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     wait_ready();
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  m.name = "main";
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  m.burn = *threads_spec++ == 'B';
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  m.sleep = *threads_spec++ == 'S';
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  m.t = 0;
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  sleeper_or_burner(&m);
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (b.t != -1) pthread_join(ebbr, NULL);
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (l.t != -1) pthread_join(egll, NULL);
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (p.t != -1) pthread_join(zzzz, NULL);
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  return 0;
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
197eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
198eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic int sigusr1_received = 0;
199eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void sigusr1_handler(int signr)
200eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
201eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   sigusr1_received++;
202eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
203eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void setup_sigusr_handler(void)
204eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
205eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   struct sigaction sa;
206eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   sa.sa_handler = sigusr1_handler;
207eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   sigemptyset(&sa.sa_mask);
208eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   sa.sa_flags = 0;
209eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
210eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   if (sigaction (SIGUSR1, &sa, NULL) != 0)
211eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      perror("sigaction SIGUSR1");
212eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
213eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   sa.sa_handler = SIG_IGN;
214eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   if (sigaction (SIGUSR2, &sa, NULL) != 0)
215eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      perror("sigaction SIGUSR2");
216eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
217eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
218