[PATCH xorg-gtest 1/8] xserver: don't throw exceptions on failed startup

Chase Douglas chase.douglas at ubuntu.com
Wed Oct 10 08:00:46 PDT 2012


On Tue, Oct 9, 2012 at 10:14 PM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> Startup failure can be a valid test-case, avoid throwing exceptions around.
> Instead, update the process state on SIGCHLD, otherwise continue quietly
> after the timeout.
> A test that needs the server to be running, will figure out that it isn't
> once XOpenDisplay() fails.
>
> If the signal handling fails, still throw an exception, that's an actual
> error case.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
>  src/xserver.cpp | 18 +++++++++++-------
>  1 file changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/src/xserver.cpp b/src/xserver.cpp
> index 082818c..1ba4e08 100644
> --- a/src/xserver.cpp
> +++ b/src/xserver.cpp
> @@ -308,6 +308,7 @@ void xorg::testing::XServer::Start(const std::string &program) {
>    /* add SIGUSR1 to the signal mask */
>    sigemptyset(&sig_mask);
>    sigaddset(&sig_mask, SIGUSR1);
> +  sigaddset(&sig_mask, SIGCHLD);
>    if (sigprocmask(SIG_BLOCK, &sig_mask, NULL)) {
>      err_msg.append("Failed to set signal mask: ");
>      err_msg.append(std::strerror(errno));
> @@ -337,16 +338,19 @@ void xorg::testing::XServer::Start(const std::string &program) {
>        raise(SIGSTOP);
>
>      /* wait for SIGUSR1 from XServer */
> -    if (SIGUSR1 != sigtimedwait(&sig_mask, NULL, &sig_timeout)) {
> -      if (errno == EAGAIN) {
> -        err_msg.append("XServer startup timed out: ");
> -      } else {
> +    int recv_sig = sigtimedwait(&sig_mask, NULL, &sig_timeout);
> +    if (recv_sig == SIGCHLD) {
> +      GetState();
> +    } else if (recv_sig != SIGUSR1 && errno != EAGAIN) {
>          err_msg.append("Error while waiting for XServer startup: ");
> -      }
> -      err_msg.append(std::strerror(errno));
> -      throw std::runtime_error(err_msg);
> +        err_msg.append(std::strerror(errno));
> +        throw std::runtime_error(err_msg);
>      }
>    }
> +
> +  sigemptyset(&sig_mask);
> +  sigaddset(&sig_mask, SIGCHLD);
> +  sigprocmask(SIG_UNBLOCK, &sig_mask, NULL);
>  }
>
>  bool xorg::testing::XServer::Terminate(unsigned int timeout) {

Everything looks reasonable to me. For the series:

Reviewed-by: Chase Douglas <chase.douglas at ubuntu.com>


More information about the xorg-devel mailing list