[Ecls-list] [usocket-devel] ECL problem

Chun Tian binghe.lisp at gmail.com
Fri Oct 16 19:24:08 UTC 2009


Hi, dear ECL Developers

One of our usocket user found a strange issue of ECL (9.10.2)'s  
network function SB-BSD-SOCKETS:SOCKOPT-TCP-NODELAY:

 > (describe 'sb-bsd-sockets::sockopt-tcp-nodelay)

SB-BSD-SOCKETS:SOCKOPT-TCP-NODELAY - external symbol in SB-BSD-SOCKETS  
package
-----------------------------------------------------------------------------
SB-BSD-SOCKETS:SOCKOPT-TCP-NODELAY                                  
[Function]
-----------------------------------------------------------------------------

On Linux (2.6.18, 2.6.31), it can be read, but changing a socket's  
TCP_NODELAY socket option will cause a "Permission denied" error:

 > (require :sb-bsd-sockets)
 > (setq socket (make-instance 'sb-bsd-sockets:inet- 
socket :type :stream :protocol :tcp))
#<SB-BSD-SOCKETS:INET-SOCKET descriptor 3 43107648>
 > (sb-bsd-sockets::sockopt-tcp-nodelay socket)
T
 > (setf (sb-bsd-sockets::sockopt-tcp-nodelay socket) t)
Sockopt error: Permission denied
Available restarts:
1. (RESTART-TOPLEVEL) Go back to Top-Level REPL.
Broken at SI:BYTECODES. [Evaluation of: (SETF (SB-BSD-SOCKETS:SOCKOPT- 
TCP-NODELAY SOCKET) T)] In: #<process SI:TOP-LEVEL 0000000000741f60>.

On Mac OS X (10.6 here), changing a socket's TCP_NODELAY socket option  
has no effect (but no error) and default value is T:

 > (require :sb-bsd-sockets)
 > (setq socket (make-instance 'sb-bsd-sockets:inet- 
socket :type :stream :protocol :tcp))
#<SB-BSD-SOCKETS:INET-SOCKET descriptor 3 4321522432>
 > (sb-bsd-sockets::sockopt-tcp-nodelay socket)
T
 > (setf (sb-bsd-sockets::sockopt-tcp-nodelay socket) nil)
T
 > (sb-bsd-sockets::sockopt-tcp-nodelay socket)
T

I also tried SBCL 1.0.31 on Mac OS X, everything is fine there, and  
the default TCP_NODELAY value is NIL.

Old (don't know how old) ECL version has no such issue. I think this  
is a bug.  I'm not familiar with ECL's source code, by checking  
"sockets.lisp", I can only find this:

(define-sockopt sockopt-tcp-nodelay "TCP_NODELAY" bool)

I'm thinking, how does ECL build process detect the actual value  
behind C macro/constant "TCP_NODELAY" defined in OS's C header file?  
(I know SBCL will actually include them to get the actual value of  
them). Is there any possibility that ECL 9.10.2 is using an "old"  
value of the C macro/constant TCP_NODELAY which caused OS's setsockopt 
() function set a wrong flag to current socket fd?  Any way, it breaks  
usocket package now.

Help needed.

Regards,

Chun Tian (binghe)

>
> Chun Tian wrote:
>
>> What's your OS environment
>
> Linux wintermute 2.6.31-rc9-ARCH-CUSTOM #1 SMP PREEMPT
> Wed Sep 9 15:53:36 CEST 2009
> i686 AMD Phenom(tm) 9600 Quad-Core Processor AuthenticAMD
> GNU/Linux
>
>
>> and ECL build options?
>
>  ./configure --build=i686-pc-linux-gnu \
>              --prefix=/usr       \
>              --with-tcp          \
>              --with-clos-streams \
> 	      --with-serve-event \
>              --enable-shared \
> 	      --enable-unicode \
>              --enable-boehm=local \
>              --enable-threads \
>              --with-system-gmp \
>              --without-x \
>              --without-clx
>
>
>> And can you supply a simply test case code for this issue?
>
> Yes. I load Drakma (1.0) via ASDF and execute
>
>  (drakma:http-request "http://www.gnu.org/")
>
>
>> I ask this because I can't reproduce it in my environment (ECL 9.10.2
>> (default build options), Mac OS X 10.6, Latest usocket trunk code).  
>> If
>> you can help us re-produce this issue, we'll look into and try to fix
>> it as soon as possible.
>
> Thank you! :)
>
>  Leslie
>
> -- 
> http://www.linkedin.com/in/polzer
>





More information about the ecl-devel mailing list