From a69b4b55ca447dccbf8593bbdc7b6056b9a39828 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Tue, 10 May 2011 17:25:47 -0700 Subject: [PATCH] Consolidate signal-masking into a utility class * util.h (stap_sigmasker): New, masks our usual signals for the life of the stap_sigmasker object. * remote.cxx (direct_stapsh::direct_stapsh): Use stap_sigmasker while spawning the stapsh child process. (ssh_remote::connect): Ditto for the ssh process. (remote::run): Use stap_sigmasker around the polling loop. --- remote.cxx | 75 ++++++++++++++++++++---------------------------------- util.h | 23 ++++++++++++++++- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/remote.cxx b/remote.cxx index 37b690f68..9c025f717 100644 --- a/remote.cxx +++ b/remote.cxx @@ -406,18 +406,10 @@ class direct_stapsh : public stapsh { // mask signals while we spawn, so we can simulate manual signals to // the "remote" target, as we must for the real ssh_remote case. - sigset_t mask, oldmask; - sigemptyset (&mask); - sigaddset (&mask, SIGHUP); - sigaddset (&mask, SIGPIPE); - sigaddset (&mask, SIGINT); - sigaddset (&mask, SIGTERM); - sigprocmask (SIG_BLOCK, &mask, &oldmask); - - child = stap_spawn_piped(s.verbose, cmd, &in, &out); - - // back to normal signals - sigprocmask (SIG_SETMASK, &oldmask, NULL); + { + stap_sigmasker masked; + child = stap_spawn_piped(s.verbose, cmd, &in, &out); + } if (child <= 0) throw runtime_error(_("error launching stapsh")); @@ -485,18 +477,10 @@ class ssh_remote : public stapsh { // mask signals while we spawn, so we can manually send even tty // signals *through* ssh rather than to ssh itself - sigset_t mask, oldmask; - sigemptyset (&mask); - sigaddset (&mask, SIGHUP); - sigaddset (&mask, SIGPIPE); - sigaddset (&mask, SIGINT); - sigaddset (&mask, SIGTERM); - sigprocmask (SIG_BLOCK, &mask, &oldmask); - - child = stap_spawn_piped(s->verbose, cmd, &in, &out); - - // back to normal signals - sigprocmask (SIG_SETMASK, &oldmask, NULL); + { + stap_sigmasker masked; + child = stap_spawn_piped(s->verbose, cmd, &in, &out); + } if (child <= 0) throw runtime_error(_("error launching stapsh")); @@ -874,31 +858,26 @@ remote::run(const vector& remotes) } // mask signals while we're preparing to poll - sigset_t mask, oldmask; - sigemptyset (&mask); - sigaddset (&mask, SIGHUP); - sigaddset (&mask, SIGPIPE); - sigaddset (&mask, SIGINT); - sigaddset (&mask, SIGTERM); - sigprocmask (SIG_BLOCK, &mask, &oldmask); - - for (;;) // polling loop for remotes that have fds to watch - { - vector fds; - for (unsigned i = 0; i < remotes.size(); ++i) - remotes[i]->prepare_poll (fds); - if (fds.empty()) - break; - - rc = ppoll (&fds[0], fds.size(), NULL, &oldmask); - if (rc < 0 && errno != EINTR) - break; - - for (unsigned i = 0; i < remotes.size(); ++i) - remotes[i]->handle_poll (fds); - } + { + stap_sigmasker masked; - sigprocmask (SIG_SETMASK, &oldmask, NULL); + // polling loop for remotes that have fds to watch + for (;;) + { + vector fds; + for (unsigned i = 0; i < remotes.size(); ++i) + remotes[i]->prepare_poll (fds); + if (fds.empty()) + break; + + rc = ppoll (&fds[0], fds.size(), NULL, &masked.old); + if (rc < 0 && errno != EINTR) + break; + + for (unsigned i = 0; i < remotes.size(); ++i) + remotes[i]->handle_poll (fds); + } + } for (unsigned i = 0; i < remotes.size(); ++i) { diff --git a/util.h b/util.h index 9ee331bf5..055758526 100644 --- a/util.h +++ b/util.h @@ -7,9 +7,10 @@ #include #include #include +extern "C" { #include #include -extern "C" { +#include #include } @@ -184,4 +185,24 @@ endswith(const std::string & s, const char * suffix) } +// Mask our usual signals for the life of this object. +struct stap_sigmasker { + sigset_t old; + stap_sigmasker() + { + sigset_t mask; + sigemptyset (&mask); + sigaddset (&mask, SIGHUP); + sigaddset (&mask, SIGPIPE); + sigaddset (&mask, SIGINT); + sigaddset (&mask, SIGTERM); + sigprocmask (SIG_BLOCK, &mask, &old); + } + ~stap_sigmasker() + { + sigprocmask (SIG_SETMASK, &old, NULL); + } +}; + + /* vim: set sw=2 ts=8 cino=>4,n-2,{2,^-2,t0,(0,u0,w1,M1 : */ -- 2.43.5