Browse code

シグナルハンドラの処理を安全にした

Masanobu Yasui authored on 2012/08/21 17:14:54
Showing 5 changed files
... ...
@@ -1,5 +1,7 @@
1 1
 1.3.3:
2
- - 通信量が多い時に刺さることがある不具合を修正
2
+ - 安定性の向上
3
+   通信量が多い時にハングアップすることがある不具合を修正
4
+   シグナルハンドラの処理を見なおした
3 5
  - iオプションを追加
4 6
    マルチキャストで利用するインターフェイスアドレスを指定できるようにした
5 7
 
... ...
@@ -1,6 +1,6 @@
1 1
 /*
2 2
  * common.c
3
- * Copyright (C) 2008 KLab Inc.
3
+ * Copyright (C) 2008-2012 KLab Inc.
4 4
  */
5 5
 #include "makuosan.h"
6 6
 
... ...
@@ -8,13 +8,14 @@ mopt moption;
8 8
 mfile *mftop[2]  = {NULL,NULL};
9 9
 mfile *mfreeobj  = NULL;
10 10
 mhost *members   = NULL;
11
-int loop_flag    = 1;
12 11
 int send_rate    = 0;
13 12
 int view_rate    = 0;
14 13
 time_t send_time = 0;
15 14
 struct timeval curtime;
16 15
 struct timeval lastpong;
17 16
 BF_KEY EncKey;
17
+volatile sig_atomic_t log_level = 0;
18
+volatile sig_atomic_t loop_flag = 1;
18 19
 
19 20
 char *yesno(int n)
20 21
 {
... ...
@@ -1,6 +1,6 @@
1 1
 /*
2 2
  * makuosan.c
3
- * Copyright (C) 2008 KLab Inc.
3
+ * Copyright (C) 2008-2012 KLab Inc.
4 4
  */
5 5
 #include "makuosan.h"
6 6
 
... ...
@@ -332,6 +332,10 @@ void mloop()
332 332
   fd_set rfds;
333 333
   fd_set wfds;
334 334
   while(loop_flag){
335
+    if(log_level != moption.loglevel){
336
+      lprintf(0,"%s: loglevel set %d to %d\n", __func__, moption.loglevel, log_level);
337
+      moption.loglevel = log_level;
338
+    }
335 339
     FD_ZERO(&rfds);
336 340
     FD_ZERO(&wfds);
337 341
     rfdset(moption.mcsocket, &rfds);
... ...
@@ -1,6 +1,6 @@
1 1
 /* 
2 2
  * makuosan.h
3
- * Copyright (C) 2008 KLab Inc. 
3
+ * Copyright (C) 2008-2012 KLab Inc. 
4 4
  */
5 5
 #ifdef HAVE_CONFIG_H
6 6
 #include "config.h"
... ...
@@ -309,7 +309,6 @@ extern int optind;
309 309
 extern int opterr;
310 310
 extern int optopt;
311 311
 extern int optreset;
312
-extern int loop_flag;
313 312
 extern int send_rate;
314 313
 extern int view_rate;
315 314
 extern time_t send_time;
... ...
@@ -319,6 +318,8 @@ extern char TZ[256];
319 319
 extern struct timeval curtime;
320 320
 extern struct timeval lastpong;
321 321
 extern BF_KEY EncKey;
322
+extern volatile sig_atomic_t log_level;
323
+extern volatile sig_atomic_t loop_flag;
322 324
 
323 325
 /*----- report -----*/
324 326
 char *strsstate(uint8_t n);
... ...
@@ -1,6 +1,6 @@
1 1
 /*
2 2
  * minit.c
3
- * Copyright (C) 2008 KLab Inc.
3
+ * Copyright (C) 2008-2012 KLab Inc.
4 4
  */
5 5
 #include "makuosan.h"
6 6
 
... ...
@@ -51,15 +51,13 @@ static void signal_handler(int n)
51 51
     case SIGPIPE:
52 52
       break;
53 53
     case SIGUSR1:
54
-      if(moption.loglevel<9){
55
-        moption.loglevel++;
56
-        lprintf(0,"%s: loglevel=%d\n", __func__, moption.loglevel);
54
+      if(log_level<9){
55
+        log_level++;
57 56
       }
58 57
       break;
59 58
     case SIGUSR2:
60
-      if(moption.loglevel>0){
61
-        moption.loglevel--;
62
-        lprintf(0,"%s: loglevel=%d\n", __func__, moption.loglevel);
59
+      if(log_level>0){
60
+        log_level--;
63 61
       }
64 62
       break;
65 63
   }
... ...
@@ -437,6 +435,7 @@ static void minit_getopt(int argc, char *argv[])
437 437
         exit(1);
438 438
     }
439 439
   }
440
+  log_level = moption.loglevel;
440 441
 }
441 442
 
442 443
 static void minit_syslog()