[PATCH xorg-gtest 2/3] Kill dummy Xorg server when a terminating signal arrives
Stephen M. Webb
stephen.webb at bregmasoft.ca
Mon Apr 23 07:30:07 PDT 2012
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 <chase.douglas at canonical.com>
Reviewed-by: Stephen M. Webb <stephen.webb at bregmasoft.ca>
> ---
> 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 <stephen.webb at bregmasoft.ca>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 900 bytes
Desc: OpenPGP digital signature
URL: <http://lists.x.org/archives/xorg-devel/attachments/20120423/6481bc69/attachment.pgp>
More information about the xorg-devel
mailing list