[Ecls-list] make_stream_from_fd - buffering modes?
Juan Jose Garcia Ripoll
lisp at arrakis.es
Tue Apr 25 05:43:10 UTC 2006
On Sun, 2006-04-23 at 11:26 -0700, daniel jay macdonald wrote:
> I was trying to use slime noticed that the output stream is not
> buffered, causing my compiles to be about 10x slower than normal. The
> problem appears to be in ecl_make_stream_from_fd:
> setbuf(fp, NULL);
> #if !defined(GBC_BOEHM)
> setbuf(fp, NULL);
> setbuf(fp, stream->stream.buffer = cl_alloc_atomic(BUFSIZ));
> I interpret this to mean that without boehm-gc I would get buffered
> output. Is there a deep reason this cant be done with the boehm-gc
> enabled? I dont feel comfortable hacking this since GBC_BOEHM seems to
> exclude stream.buffer even being defined.
No, not really. The point is that ECL's own garbage collector needs to
keep track of the buffer and hence it is stored in a separate variable
-- if we do not do so, then we would need to deal with the internals of
the FILE structure, which is not portable.
The Boehm-Weiser garbage collector does not require this fix, because it
scans the content of all variables. Now, I do not explicitely set the
buffer of files because I assumed files are buffered by default.
According to GNU libc's manual:
"Newly opened streams are normally fully buffered, with one
exception: a stream connected to an interactive device such as a
terminal is initially line buffered."
The problem is that the line setbuf(fp,NULL) above the #ifdef should not
be there. I have made several changes in ECL in order to allow changing
the buffering mode of an ordinary stream. Sockets can now be created
with a :BUFFERING-MODE option. Perhaps you should try rebuilding ECL
from CVS and using Slime with the following untested patch:
RCS file: /project/slime/cvsroot/slime/swank-ecl.lisp,v
retrieving revision 1.5
diff -u -u -r1.5 swank-ecl.lisp
--- swank-ecl.lisp 22 Mar 2006 16:40:01 -0000 1.5
+++ swank-ecl.lisp 25 Apr 2006 12:36:53 -0000
@@ -55,7 +55,8 @@
- :element-type 'base-char))
+ :element-type 'base-char
+ :buffering-mode :line-buffering))
(defun accept (socket)
"Like socket-accept, but retry on EAGAIN."
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 189 bytes
Desc: This is a digitally signed message part
More information about the ecl-devel