subversion-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Philip Martin <>
Subject Moving cancellation support to libsvn_subr
Date Tue, 09 Feb 2016 18:19:02 GMT
Daniel Shahaf <> writes:

> This fixes the race I mentioned, but I think we have another problem
> here: signum_cancelled is accessed by the signal handler so it must be
> of type 'static volatile sig_atomic_t' (C89 ยง4.7.1.1)...  but I don't
> think anything guarantees that signal numbers are representable as
> a sig_atomic_t.  On Linux/amd64 and FreeBSD they are, but that need not
> be the case everywhere.
> If we can't assume sig_atomic_t is at least as large as an int, I think
> we have to use the following roundabout method:

I did something similar in r1729422.

This code keeps growing and I'm thinking of moving both the signal
handler and cancellation handler to libsvn_subr.  We need some storage
for the volatiles and using pool memory implies a limited lifetime that
interacts badly with the signal handlers so I'm thinking of using static
storage in the library.  Something like:

  /* Setup signal handlers and return a cancellation handler. */
  svn_cancel_func_t svn_cmdline__setup_cancellation_handler();

  /* Return a signal that triggered cancellation or zero if no such
     signal. */
  int svn_cmdline__get_cancelled_signum();

and the application would do:

int main()
  apr_pool_t *pool;
  SVN_ERR(svn_client_create_context2(&ctx, ..., pool));
  ctx->cancel_func = svn_cmdline__setup_cancellation_handler();
#ifndef WIN32
    int signum = svn_cmdline__get_cancelled_signum();
    if (signum)
      kill(getpid(), signum);

  return exit_code;

Philip Martin

View raw message