X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Ffatal-signal.c;h=21ebb5a84a8f6eea6b0b032b0342e27e4afc6ad3;hb=479df1769d51351d031482acaaf0c713726c05d1;hp=ed82173a4ad1cd2727c361b09777e1977e21bb84;hpb=b3c01ed3308e7899e98e981bf465f74be86f5f12;p=openvswitch diff --git a/lib/fatal-signal.c b/lib/fatal-signal.c index ed82173a..21ebb5a8 100644 --- a/lib/fatal-signal.c +++ b/lib/fatal-signal.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,10 +27,17 @@ #include "poll-loop.h" #include "shash.h" #include "sset.h" +#include "signals.h" #include "socket-util.h" #include "util.h" #include "vlog.h" +#include "type-props.h" + +#ifndef SIG_ATOMIC_MAX +#define SIG_ATOMIC_MAX TYPE_MAXIMUM(sig_atomic_t) +#endif + VLOG_DEFINE_THIS_MODULE(fatal_signal); /* Signals to catch. */ @@ -67,11 +74,9 @@ fatal_signal_init(void) inited = true; - if (pipe(signal_fds)) { - ovs_fatal(errno, "could not create pipe"); - } - set_nonblocking(signal_fds[0]); - set_nonblocking(signal_fds[1]); + xpipe(signal_fds); + xset_nonblocking(signal_fds[0]); + xset_nonblocking(signal_fds[1]); sigemptyset(&fatal_signal_set); for (i = 0; i < ARRAY_SIZE(fatal_signals); i++) { @@ -79,12 +84,10 @@ fatal_signal_init(void) struct sigaction old_sa; sigaddset(&fatal_signal_set, sig_nr); - if (sigaction(sig_nr, NULL, &old_sa)) { - ovs_fatal(errno, "sigaction"); - } + xsigaction(sig_nr, NULL, &old_sa); if (old_sa.sa_handler == SIG_DFL && signal(sig_nr, fatal_signal_handler) == SIG_ERR) { - ovs_fatal(errno, "signal"); + VLOG_FATAL("signal failed (%s)", strerror(errno)); } } atexit(atexit_handler); @@ -149,12 +152,14 @@ fatal_signal_handler(int sig_nr) void fatal_signal_run(void) { - int sig_nr; + sig_atomic_t sig_nr; fatal_signal_init(); sig_nr = stored_sig_nr; if (sig_nr != SIG_ATOMIC_MAX) { + VLOG_WARN("terminating with signal %d (%s)", + (int)sig_nr, signal_name(sig_nr)); call_hooks(sig_nr); /* Re-raise the signal with the default handling so that the program