I have the same problem on a Dual Xeon Server running with Suse 10.0.
By coincident I debugged this problem today and came to the same
conclusion. I think it is a good idea to handle the
!APR_STATUS_IS_CHILD_DONE condition since we get a proper error
message.
But to really solve the problem I think we should disable the SIGCHLD
while the hook runs using the apr_signal function. I have done the
following changes to 1.3.2 of hooks.c. Until now my hooks seam to work.
But it would be great if someone else could test it !
Regards
Bernhard.
=======================================================================
--- hooks.c.org 2006-09-13 14:46:33.000000000 +0200
+++ hooks.c 2006-09-13 14:47:21.000000000 +0200
@@ -21,6 +21,7 @@
#include <apr_pools.h>
#include <apr_file_io.h>
+#include <apr_signal.h>
#include "svn_error.h"
#include "svn_path.h"
@@ -58,7 +59,8 @@ run_hook_cmd (const char *name,
int exitcode;
apr_exit_why_e exitwhy;
apr_proc_t cmd_proc;
-
+ apr_sigfunc_t * oldSigFunc;
+
/* Create a pipe to access stderr of the child. */
apr_err = apr_file_pipe_create(&read_errhandle, &write_errhandle,
pool);
if (apr_err)
@@ -92,6 +94,8 @@ run_hook_cmd (const char *name,
return svn_error_wrap_apr
(apr_err, _("Can't create null stdout for hook '%s'"), cmd);
+ oldSigFunc = apr_signal(SIGCHLD, SIG_DFL);
+
err = svn_io_start_cmd (&cmd_proc, ".", cmd, args, FALSE,
stdin_handle, null_handle, write_errhandle,
pool);
@@ -101,8 +105,12 @@ run_hook_cmd (const char *name,
pipe so we don't hang on the read end later, if we need to read
it. */
apr_err = apr_file_close (write_errhandle);
if (!err && apr_err)
+ {
+ apr_signal(SIGCHLD, oldSigFunc);
+
return svn_error_wrap_apr
(apr_err, _("Error closing write end of stderr pipe"));
+ }
if (err)
{
@@ -117,6 +125,7 @@ run_hook_cmd (const char *name,
err2 = svn_stringbuf_from_aprfile (&error, read_errhandle,
pool);
err = svn_io_wait_for_cmd(&cmd_proc, cmd, &exitcode, &exitwhy,
pool);
+
if (! err)
{
if (! APR_PROC_CHECK_EXIT (exitwhy) || exitcode != 0)
@@ -145,6 +154,9 @@ run_hook_cmd (const char *name,
}
}
+ apr_signal(SIGCHLD, oldSigFunc);
+
+
/* Hooks are fallible, and so hook failure is "expected" to occur at
times. When such a failure happens we still want to close the
pipe
and null file */
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Thu Sep 14 00:21:47 2006