[Ecls-list] Problems with slime

Ram Krishnan kriyative at gmail.com
Wed Feb 10 00:58:08 UTC 2010


On Tue, Feb 9, 2010 at 3:16 PM, Ram Krishnan <kriyative at gmail.com> wrote:
> On Tue, Feb 9, 2010 at 2:18 PM, Tobias C. Rittweiler <tcr at freebits.de> wrote:
>>
>> Ram Krishnan writes:
>>
>> > Tobias,
>> >
>> > I ran into this issue on MacOSX, and it turned out to be because SLIME
>> > has multiple threads (control and reader threads) which want to read
>> > and write the connection socket stream. The issue (on MacOSX atleast)
>> > was that the standard buffered I/O library (which handles the FILE*
>> > data structure and functions), has been made thread safe, and locks
>> > the file stream when any thread uses it. The tragedy is that there
>> > seems to be only one lock, for both read and write, which means if one
>> > thread locks the stream to read then another thread cannot do anything
>> > with it, not even write. Anyway, the hack I came up with was to modify
>> > the swank-ecl backend to return a two-way-stream with two independent
>> > file-streams for the two directions:
>> >
>> > (defun socket-make-stream (socket &rest args)
>> >   (let ((stream (apply 'sb-bsd-sockets:socket-make-stream socket args)))
>> >     (setf (slot-value socket 'sb-bsd-sockets::stream) nil)
>> >     stream))
>> >
>> > (defun make-socket-io-stream (socket)
>> >   (case (preferred-communication-style)
>> >     (:fd-handler
>> >      (sb-bsd-sockets:socket-make-stream socket
>> >                                         :output t
>> >                                         :input t
>> >                                         :element-type 'base-char))
>> >     (:spawn
>> >      (let* ((input (socket-make-stream socket
>> >                                        :direction :input
>> >                                        :element-type 'base-char))
>> >             (output (socket-make-stream socket
>> >                                         :direction :output
>> >                                         :element-type 'base-char))
>> >             (stream (make-two-way-stream input output)))
>> >        (setf (slot-value socket 'sb-bsd-sockets::stream) stream)
>> >        stream))))
>> >
>> > Admittedly this hack is ugly, as it knows way too much about what the
>> > underlying socket implementation is doing. The right place to fix this
>> > is probably in SOCKETS::SOCKET-MAKE-STREAM, based on a DIRECTION
>> > keyword arg or something.
>>
>> Hi Ram,
>>
>> thanks for commenting. I saw your patch earlier, and I actually
>> copy&pasted the above implementation of MAKE-SOCKET-IO-STREAM into my
>> swank-ecl.lisp to see whether it makes a difference, but it does _not_.
>>
>> I'm on Ubuntu 9.10, FWIW.
>>
>> How did you find out about the locking?
>>
>>
>> > Here's a link to the complete set of patches:
>> >
>> >   http://github.com/kriyative/ecl-iphone-builder/blob/master/swank-ecl-patches.txt
>> >
>> > Anyway, hope this is useful in your efforts.
>>
>> Thanks, I'll try to get the :FD-HANDLER communication style into the
>> official swank-ecl when I find time. Why did you change AUTO-FLUSH-LOOP?
>>
>>  -T.
>
> Well, I'm not too surprised that the patch didn't work. I'll try
> resurrecting an older Ubuntu (8.4 I think) VMWare image that I have,
> and seeing if I can reproduce ECL, SLIME, and this problem on it.
>
> I found the blocking issue through a combination of dtrace/dtruss and
> gdb -- not pretty. I couldn't find any official Apple documentation
> confirming the behaviour of their thread-safe stdio, but all symptoms
> pointed to it.
>
> The AUTO-FLUSH-LOOP change may not be necessary any more; as late as
> ECL 9.12.3, open-stream-p was raising a TYPE-ERROR condition
> (something like "<a SLIME-OUTPUT-STREAM> is not of type STREAM"), when
> testing a fundamental-character-output-stream derivative stream. I
> didn't have a chance to chase this down, but I suspect the
> implementation of cl_open_stream in file.d is excluding gray streams.
>
> -ram
>

Interestingly, I was able to compile ecl 9.12.3, with threads and run
SLIME with my patches successfully on an Ubuntu 8.4 VMWare
image. Here's what I ran:

  ./configure --prefix=/mnt/ecl \
	--enable-threads \
	--enable-unicode \
	--enable-longdouble \
	--enable-gengc \
	--with-asdf=yes \
	--with-tcp=yes
  make
  make install

Then using the following script in ~/bin/ecl.sh:

  #!/bin/sh
  export LD_LIBRARY_PATH=/mnt/ecl/lib:${LD_LIBRARY_PATH}
  exec /mnt/ecl/bin/ecl "$@"

I loaded slime (with my patches), with the following command:

  (defun ecl ()
    (interactive)
    (let ((slime-lisp-implementations
           `((ecl ,(list (expand-file-name "~/bin/ecl.sh"))))))
      (slime)))

  M-x ecl

And, it just worked (tm).

Cheers,

-ram




More information about the ecl-devel mailing list