diff options
author | peter <peter@FreeBSD.org> | 1998-05-27 15:19:23 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1998-05-27 15:19:23 +0000 |
commit | 474b0e97b33ea1b8cf3639ea1281615f977d2255 (patch) | |
tree | 4241f49d3f0269e45c607b0578e2be9c0206286a /contrib/cvs | |
parent | 0e1be7affa9cc69189e3c787140b797e78fe6482 (diff) | |
download | FreeBSD-src-474b0e97b33ea1b8cf3639ea1281615f977d2255.zip FreeBSD-src-474b0e97b33ea1b8cf3639ea1281615f977d2255.tar.gz |
Remove my hacks for capturing stdout/stderr through the protocol channel
while calling libdiff. It's too ugly and not worth the recursion problems
when there is a malloc failure (which writes to stderr - now diverted via
the buf system, which calls malloc, which causes another error message etc).
We can live with the standard artificial slowdown, but reduce the time a
bit and only delay when we really need to (ie: when running as a server).
The usleep time could probably use some tuning, it basically needs to
replace the time that it used to take to fork a large process, exec gnudiff
and the time that gnudiff took before writing the initial output.
This eliminates a whole mess of other hacks I was considering that changed
use of xmalloc to alloca() etc. It was going too fast in the wrong
direction.
Diffstat (limited to 'contrib/cvs')
-rw-r--r-- | contrib/cvs/src/rcscmds.c | 108 |
1 files changed, 2 insertions, 106 deletions
diff --git a/contrib/cvs/src/rcscmds.c b/contrib/cvs/src/rcscmds.c index e290b68..490bf68 100644 --- a/contrib/cvs/src/rcscmds.c +++ b/contrib/cvs/src/rcscmds.c @@ -135,29 +135,10 @@ call_diff_add_arg (s) /* diff_run is imported from libdiff.a. */ extern int diff_run PROTO ((int argc, char **argv, char *out)); -#if defined(__FreeBSD__) && defined(SERVER_SUPPORT) -/* Some 4.4BSD Glue to hack stdout and stderr to call cvs_output */ - -static -int writehook(cookie, buf, len) - void *cookie; /* really [struct bufcookie *] */ - const char *buf; /* characters to copy */ - int len; /* length to copy */ -{ - void (*fn)(const char *, size_t) = - (void (*)(const char *, size_t))cookie; - - (*fn)(buf, len); - - return 0; -} -#endif - static int call_diff (out) char *out; { -#if !defined(__FreeBSD__) || !defined(SERVER_SUPPORT) /* Try to keep the out-of-order bugs at bay (protocol_pipe for cvs_output with has "Index: foo" and such; stdout and/or stderr for diff's output). I think the only reason that this used to not be such @@ -170,55 +151,13 @@ call_diff (out) #if defined(SERVER_SUPPORT) /* only do this on the server if it's in protocol mode */ if (error_use_protocol || server_active) - sleep (1); + usleep (50); #endif if (out == RUN_TTY) return diff_run (call_diff_argc, call_diff_argv, NULL); else return diff_run (call_diff_argc, call_diff_argv, out); -#else - /* avoid that sleep "by any means necessary".. */ - void *save_out, *save_err; - void *cookie_out, *cookie_err; - int rv; - - /* XXX: the cvs_out*() funcs call the buf routines which can call - cvs_outerr(), and also calls malloc which might printf something. - FreeBSD's malloc doesn't do this at the moment, so recursion should - be avoided. No guarantees for other BSD4.4-Lite* systems though. */ - if (error_use_protocol || server_active) { - save_out = stdout->_write; - save_err = stderr->_write; - cookie_out = stdout->_cookie; - cookie_err = stderr->_cookie; - - fflush(stdout); - fflush(stderr); - - stdout->_write = writehook; - stderr->_write = writehook; - stdout->_cookie = cvs_output; - stderr->_cookie = cvs_outerr; - } - - if (out == RUN_TTY) - rv = diff_run (call_diff_argc, call_diff_argv, NULL); - else - rv = diff_run (call_diff_argc, call_diff_argv, out); - - if (error_use_protocol || server_active) { - fflush(stdout); - fflush(stderr); - - stdout->_write = save_out; - stderr->_write = save_err; - stdout->_cookie = cookie_out; - stderr->_cookie = cookie_err; - } - - return (rv); -#endif } extern int diff3_run PROTO ((int argc, char **argv, char *out)); @@ -227,7 +166,6 @@ static int call_diff3 (out) char *out; { -#if !defined(__FreeBSD__) || !defined(SERVER_SUPPORT) /* Try to keep the out-of-order bugs at bay (protocol_pipe for cvs_output with has "Index: foo" and such; stdout and/or stderr for diff's output). I think the only reason that this used to not be such @@ -240,55 +178,13 @@ call_diff3 (out) #if defined(SERVER_SUPPORT) /* only do this on the server if it's in protocol mode */ if (error_use_protocol || server_active) - sleep (1); + usleep (50); #endif if (out == RUN_TTY) return diff3_run (call_diff_argc, call_diff_argv, NULL); else return diff3_run (call_diff_argc, call_diff_argv, out); -#else - /* avoid that sleep "by any means necessary".. */ - void *save_out, *save_err; - void *cookie_out, *cookie_err; - int rv; - - /* XXX: the cvs_out*() funcs call the buf routines which can call - cvs_outerr(), and also calls malloc which might printf something. - FreeBSD's malloc doesn't do this at the moment, so recursion should - be avoided. No guarantees for other BSD4.4-Lite* systems though. */ - if (error_use_protocol || server_active) { - save_out = stdout->_write; - save_err = stderr->_write; - cookie_out = stdout->_cookie; - cookie_err = stderr->_cookie; - - fflush(stdout); - fflush(stderr); - - stdout->_write = writehook; - stderr->_write = writehook; - stdout->_cookie = cvs_output; - stderr->_cookie = cvs_outerr; - } - - if (out == RUN_TTY) - rv = diff3_run (call_diff_argc, call_diff_argv, NULL); - else - rv = diff3_run (call_diff_argc, call_diff_argv, out); - - if (error_use_protocol || server_active) { - fflush(stdout); - fflush(stderr); - - stdout->_write = save_out; - stderr->_write = save_err; - stdout->_cookie = cookie_out; - stderr->_cookie = cookie_err; - } - - return (rv); -#endif } |