Thursday, 19 September 2013

set flag in signal handler

set flag in signal handler

In C++11, what is the safest (and perferrably most efficient) way to
execute unsafe code on a signal being caught, given a type of request-loop
(as part of a web request loop)?
It is acceptable for the 'unsafe code' to be run on the next request being
fired, and no information is lost if the signal is fired multiple times
before the unsafe code is run.
For example, my current code is:
static bool globalFlag = false;
void signalHandler(int sig_num, siginfo_t * info, void * context) {
globalFlag = true;
}
void doUnsafeThings() {
// thigns like std::vector push_back, new char[1024], set global vars,
etc.
}
void doRegularThings() {
// read filesystem, read global variables, etc.
}
void main(void) {
// set up signal handler (for SIGUSR1) ...
struct sigaction sigact;
sigact.sa_sigaction = onSyncSignal;
sigact.sa_flags = SA_RESTART | SA_SIGINFO;
sigaction(SIGUSR1, &sigact, (struct sigaction *)NULL);
// main loop ...
while(acceptMoreRequests()) { // blocks until new request received
if (globalFlag) {
globalFlag = false;
doUnsafeThings();
}
doRegularThings();
}
}
where I know there could be problems in the main loop testing+setting the
globalFlag boolean.

No comments:

Post a Comment