[usocket-devel] SBCL/Win32: finalizer problem, etc.

Chun Tian (binghe) binghe.lisp at gmail.com
Tue Mar 22 03:44:41 UTC 2011


Hi, Anton!

Thank you very much.  Actually I just realized that you're the author of sbcl-win32-threads.  Among other things, I want to say how important your packages are, because I know there's a commercial Lisp-based product (Gensym G2) which heavily depends on SBCL/win32 (for development, they use Lisp->C translator to build final product), but it's so big and memory-costs that cannot continuously running on 32-bit SBCL. And its threading version can be tested on SBCL now (used to be LispWorks 6).

I've installed your every binary release and just yesterday night was I thinking that I should have a test of USOCKET with Hunchentoot on the new threading SBCL ... and your mail come in! But, obviously, I can never figure out what you've already found.  I thought the SB-EXT:FINALIZE I wrote was already working, but your test confirm it wasn't.

I think I cannot understand why the closure must close over those components of WAIT-LIST but WAIT-LIST itself, but since this is a fact (as you confirmed), I'd like to adopt your patches and quote all your explanations and put with the new code together.  I hope, with your SBCL and USOCKET work, Hunchentoot (and other Lisp-based servers) could have a beautiful future on Windows platform.

Anyway, I merged all your work, as r588 on USOCKET 0.5.x branch [1].  There're other fixes after 0.5.0 was releasd, and Zach's Quicklisp can automatically test/accept new USOCKET releases now, I'll do rest of scheduled fixes quickly and make a new 0.5.1 release soon.

Best Regards,

Chun Tian (binghe)

[1] svn://common-lisp.net/project/usocket/svn/usocket/branches/0.5.x

在 2011-3-22,02:31, Anton Kovalenko 写道:

> 
> Greetings to all USOCKET developers and contributors.
> 
> First, thank you for the wonderful package. But of course, I'm posting
> here to report some problems (on a particular platform: #+(and sbcl win32))
> 
> 1. Event handles are leaking in current SBCL backend implementation,
>   because of SBCL-unfriendly usage of finalizers.
> 
>   SBCL never calls a finalizer that closes over a finalized object: a
>   reference from that closure prevents its collection forever. That's
>   the case with USOCKET in %SETUP-WAIT-LIST.
> 
>   I use the following redefinition of %SETUP-WAIT-LIST:
> 
> (defun %setup-wait-list (wait-list)
>  (setf (wait-list-%wait wait-list) (sb-alien:make-alien ws-event))
>  (setf (os-wait-list-%wait wait-list) (wsa-event-create))
>  (sb-ext:finalize wait-list
> 		   (let ((event-handle (os-wait-list-%wait wait-list))
> 			 (alien (wait-list-%wait wait-list)))
> 		     #'(lambda ()
> 			 (wsa-event-close event-handle)
> 			 (unless (null alien)
> 			   (sb-alien:free-alien alien))))))
> 
>   Of course it may be rewritten with more clarity, but you can see the
>   core idea: I'm closing over those components of WAIT-LIST that I need
>   for finalization, not the wait-list itself. With the original
>   %SETUP-WAIT-LIST, hunchentoot stops working after ~100k accepted
>   connections; it doesn't happen with redefined %SETUP-WAIT-LIST.
> 
> 
> 2. SB-BSD-SOCKETS:SOCKET-ACCEPT method returns NIL for EAGAIN/EINTR,
>   instead of raising a condition. It's always possible for
>   SOCKET-ACCEPT on non-blocking socket to fail, even after the socket
>   was detected to be ready: connection might be reset, for example.
> 
>   I had to redefine SOCKET-ACCEPT method of STREAM-SERVER-USOCKET to
>   handle this situation. Here is the redefinition:
> 
> (defmethod socket-accept ((socket stream-server-usocket) &key element-type)
>  (with-mapped-conditions (socket)
>    (let ((sock (sb-bsd-sockets:socket-accept (socket socket))))
>      (if sock
> 	  (make-stream-socket
> 	   :socket sock
> 	   :stream (sb-bsd-sockets:socket-make-stream
> 		    sock
> 		    :input t :output t :buffering :full
> 		    :element-type (or element-type
> 				      (element-type socket))))
> 
>          ;; next time wait for event again if we had EAGAIN/EINTR
>          ;; or else we'd enter a tight loop of failed accepts
> 
> 	  (setf (%ready-p socket) nil)))))   
> 
> 
> P.S. For some months I'm working on threading support for
> SBCL/Windows (X86 and AMD64)
> [ http://github.com/akovalenko/sbcl-win32-threads/wiki ], continuing the
> work of Dmitry Kalyanov, who implemented threading support initially.
> Traditionally, I use HUNCHENTOOT as a kind of smoke test for my builds,
> and it's a wonderful choice.
> 
> Two issues described above, however, are universal -- it's not something
> that we meet (only) on my experimental threads builds. #1 applies to
> _any_ SBCL/Windows, #2 might not apply to some earlier versions that are
> still in use; both deserves fixing.
> 
> Here is another issue with USOCKET that _can't_ affect upstream SBCL
> until Windows/AMD64 support is accepted:
> 
> 3. SOCKET is defined as intptr_t in Windows headers; however, WS-SOCKET
>   is defined as unsigned-int, i.e. 32-bit even on 64-bit platform.  It
>   seems to be a good thing to redefine WS-SOCKET as SB-ALIEN:SIGNED,
>   which is always machine word-sized (exactly as intptr_t;
>   N.B. as of Windows/x64, long and signed-long are 32-bit, and thus not
>   enough -- potentially).
> 
> Fortunately, this last issue doesn't cause any actual damage now:
> HUNCHENTOOT works on my x64 build (when redefinitions mentioned above
> are loaded).  However, it happens just because SBCL does more than MS
> ABI specification requires, i.e. doesn't leave garbage in the upper 32
> bits of the argument.  I'm afraid that some future optimization (and/or
> reimplementation) of SBCL FFI callout may eventually break this behavior
> -- so it still makes sense to define WS-SOCKET according to Windows
> headers.
> 
> -- 
> Regards, Anton Kovalenko
> +7(916)345-34-02 | Elektrostal' MO, Russia
> 
> _______________________________________________
> usocket-devel mailing list
> usocket-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/usocket-devel





More information about the usocket-devel mailing list