summaryrefslogtreecommitdiff
path: root/cleopatre/application/managerd/src
diff options
context:
space:
mode:
authorYacine Belkadi2011-03-23 16:09:31 +0100
committerYacine Belkadi2011-03-23 16:56:02 +0100
commit66bfbac2284ade9adce80b278719426a7392f16f (patch)
treeb8974a7e3f5ffe0561b4b780e1d73673a2f860c5 /cleopatre/application/managerd/src
parentc579df90e4576b4de7d18e3fb35f102cda272b76 (diff)
cleo/app/managerd: fix possible signal loss, closes #2374
Fix: - a signal may be lost if it occurs in the middle of the decrementation of is_process_signal_needed. - the compiler could optimize operations on is_process_signal_needed in ways that may affect the expected behavior of the code.
Diffstat (limited to 'cleopatre/application/managerd/src')
-rw-r--r--cleopatre/application/managerd/src/managerd.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/cleopatre/application/managerd/src/managerd.c b/cleopatre/application/managerd/src/managerd.c
index c9d0e44d4a..cb7db96a52 100644
--- a/cleopatre/application/managerd/src/managerd.c
+++ b/cleopatre/application/managerd/src/managerd.c
@@ -34,7 +34,7 @@
/* Global variable indicating if a SIGHUP signal occurred,
* has been caught in managerd signal handler,
* and has now to be processed. */
-uint8_t is_process_signal_needed;
+volatile sig_atomic_t is_process_signal_needed;
/**
@@ -48,7 +48,7 @@ managerd_signal_handler (int signal_nb)
/* check that we received a SIGHUP signal (other signals must be ignored) */
if (SIGHUP == signal_nb)
{
- is_process_signal_needed++;
+ is_process_signal_needed = 1;
}
}
@@ -250,9 +250,10 @@ static int managerd_process(struct managerd_ctx *ctx)
if (is_process_signal_needed)
{
+ is_process_signal_needed = 0;
+
/* now handle all info file changes (from plcd) */
managerd_process_signal (ctx);
- is_process_signal_needed--;
}
}