On 04/18/2012 01:39 PM, Chase Douglas wrote: > This only takes effect if the program links in the provided main() > function. If you provide your own main() you must handle signals > yourself. > > Signed-off-by: Chase Douglas <[email protected]>
Reviewed-by: Stephen M. Webb <[email protected]> > --- > src/xorg-gtest_main.cpp | 56 > ++++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 55 insertions(+), 1 deletions(-) > > diff --git a/src/xorg-gtest_main.cpp b/src/xorg-gtest_main.cpp > index 5e5a748..8953afa 100644 > --- a/src/xorg-gtest_main.cpp > +++ b/src/xorg-gtest_main.cpp > @@ -27,6 +27,8 @@ > > #include <getopt.h> > > +#include <csignal> > + > #include <gtest/gtest.h> > > #include "xorg/gtest/environment.h" > @@ -53,12 +55,64 @@ const struct option longopts[] = { > > } // namespace > > +xorg::testing::Environment* environment = NULL; > + > +static void signal_handler(int signum) { > + if (environment) > + environment->Kill(); > + > + /* This will call the default handler because we used SA_RESETHAND */ > + raise(signum); > +} > + > +static void setup_signal_handlers() { > + static const int signals[] = { > + SIGHUP, > + SIGTERM, > + SIGQUIT, > + SIGILL, > + SIGABRT, > + SIGFPE, > + SIGSEGV, > + SIGPIPE, > + SIGALRM, > + SIGTERM, > + SIGUSR1, > + SIGUSR2, > + SIGBUS, > + SIGPOLL, > + SIGPROF, > + SIGSYS, > + SIGTRAP, > + SIGVTALRM, > + SIGXCPU, > + SIGXFSZ, > + SIGIOT, > + SIGSTKFLT, > + SIGIO, > + SIGPWR, > + SIGUNUSED, > + }; > + > + struct sigaction action; > + action.sa_handler = signal_handler; > + sigemptyset(&action.sa_mask); > + action.sa_flags = SA_RESETHAND; > + > + for (unsigned i = 0; i < sizeof(signals) / sizeof(signals[0]); ++i) > + if (sigaction(signals[i], &action, NULL)) > + std::cerr << "Warning: Failed to set signal handler for signal " > + << signals[i] << "\n"; > +} > + > int main(int argc, char *argv[]) { > std::string xorg_conf_path; > std::string xorg_log_file_path; > int xorg_display = -1; > std::string server; > > + setup_signal_handlers(); > + > testing::InitGoogleTest(&argc, argv); > > /* Reset getopt state */ > @@ -110,7 +164,7 @@ int main(int argc, char *argv[]) { > } > > if (!no_dummy_server) { > - xorg::testing::Environment* environment = new xorg::testing::Environment; > + environment = new xorg::testing::Environment; > > if (xorg_conf_specified) > environment->set_conf_file(xorg_conf_path); -- Stephen M. Webb <[email protected]>
signature.asc
Description: OpenPGP digital signature
_______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
