[usocket-devel] usocket on LispWorks (non-win32 and no multiprocessing)

Chun Tian (binghe) binghe.lisp at gmail.com
Tue Oct 21 12:48:28 UTC 2008



> On Tue, Oct 21, 2008 at 1:24 PM, Chun Tian (binghe)
> <binghe.lisp at gmail.com> wrote:
>> Hi, usocket-devel
>>
>> (testing 0.4 branch)
>>
>> In LispWorks Professional and Enterprise Edition, user can save a
>> image without thread support. When such a lispworks image started,  
>> all
>> function in MP package is there but no thread running:
>>
>>       binghe at binghe-debian:~$ lispworks-cli
>>       LispWorks(R): The Common Lisp Programming Environment
>>       Copyright (C) 1987-2008 LispWorks Ltd.  All rights reserved.
>>       Version 5.1.1
>>       Saved by binghe as lispworks-5-1-1-64-bit-cli, at 12 Jun 2008  
>> 14:50
>>       User binghe on binghe-debian.local
>>
>>       CL-USER 1 > (mp:list-all-processes)
>>       NIL
>>
>>       CL-USER 3 > mp:*current-process*
>>       NIL
>>
>> When there's no thread support in LispWorks, USOCKET:WAIT-FOR-INPUT
>> cannot be used (on non-win32 platform) because it calls MP:PROCESS-
>> WAIT on current thread, that will cause a UNKNOWN-ERROR:
>
> Nice catch!
>
>> USOCKET 9 > (wait-for-input x)
>>
>> Error: The condition #<UNKNOWN-ERROR 405008A5B0> occurred
>>  1 (abort) Return to level 0.
>>  2 Restart top-level loop.
>>
>> Type :b for backtrace, :c <option number> to proceed,  or :? for  
>> other
>> options
>>
>> USOCKET 10 : 1 > :b
>> Call to ERROR
>> Call to RAISE-USOCK-ERR
>> Call to SIGNAL
>> Call to ERROR
>> Call to MP::WITHOUT-PREEMPTION-ERROR
>> Call to MP:PROCESS-WAIT
>> Call to WAIT-FOR-INPUT-INTERNAL
>> Call to WAIT-FOR-INPUT
>> Call to WAIT-FOR-INPUT
>> Call to EVAL
>>
>> I think may be there're some way not use MP-related function to
>> achieve the same effect, i.e. direct call select() or turn to use
>> LispWorks' SYS:WAIT-FOR-INPUT-STREAMS [1] instead (which works on all
>> platform include win32 but just for stream usocket).
>
> Well, that would severely limit the usability of WAIT-FOR-INPUT,
> because it wouldn't be usable with listening sockets or udp sockets.
>
> Could we just error out when someone tries to use WAIT-FOR-INPUT
> without MP support? I mean... Are there any problems with requiring
> the apps be built with mp support? (licensing from LW, for example)

Yes, I think just limit the use of WAIT-FOR-INPUT on "LispWorks with  
MP enabled" is OK, but following things should be done:

* When usocket is loading on LispWorks without MP enabled, a warn  
should be output. I found a piece of code in GBBopen's portable- 
threads.lisp, may help:

;;;  
---------------------------------------------------------------------------
;;;  Warn if multiprocessing is not running on Lispworks

#+lispworks
(defun check-for-multiprocessing-started (&optional errorp)
   (unless mp:*current-process*
     (funcall (if errorp 'error 'warn)
              "You must start multiprocessing on Lispworks by calling~
               ~%~3t(~s)~
               ~%for ~s, locks, and other thread operations to  
function ~
               properly."
              'initialize-multiprocessing
              'with-timeout)))

#+lispworks
(check-for-multiprocessing-started)

* When WAIT-FOR-INPUT is called on LispWorks without MP enabled, a  
better error should be signaled to tell user the MP should be enabled.

If you agree, I'll try to commit some code according to above two  
points.

--binghe





More information about the usocket-devel mailing list