Hi Chun,

On Wed, 2010-12-08 at 13:08 +0800, Chun Tian (binghe) wrote:
> Hello, Kamil Shakirov
> 
> Thank you for your work. You do this right.  For your question, actually it's 
> a long story:
> 
> As you know, LispWorks doesn't provide any UDP support in its COMM package.  
> Current UDP support in USOCKET trunk was from my LispWorks-UDP package [1], 
> and the function SEND-MESSAGE, RECEIVE-MESSAGE, ... was just copied from 
> there.
> 
> LispWorks-UDP's API was designed to be similar with the TCP interface in 
> LispWorks' COMM package: there's no OO, raw socket fd was used to handle 
> networking operations.  Therefore, I have to make a hard choice between 
> following two options:
> 
> 1. Use global receive and send buffers with locks to protect them from 
> concurrent access.
> 2. Create local buffers for SEND-MESSAGE and RECEIVE-MESSAGE when every time 
> they're called. (FLI need special created static array, so cannot just 
> simplify pass the argument to FLI functions)
> 
> Obviously, option 2 is not acceptable, too much cost. But I do have some 
> thoughts on concurrent recv/send: I've made the lock as special variables, 
> and user can supply their pre-created buffers for used by SEND-MESSAGE and 
> RECEIVE-MESSAGE. So, if you have multiple threads, just create per-threaded 
> buffers and specially bounded locks (but useless in this case), and it's 
> possible to do concurrent recv/send.
> 
> Unfortunately, when these work are merged into USOCKET, no correspond USOCKET 
> API can fit above design, and the design itself is not good at all.
> 
> USOCKET has a OO based design, each UDP datagram socket object actually 
> could/should have it's own buffers. I didn't realize this until I saw you 
> solution ... sorry for letting you take time and figure out the correct way 
> to have these buffers.
> 
> This is obviously the most important work for UDP/LispWorks support after 
> initial commit in USOCKET. I'll make sure you appear in our release notes and 
> let others take advantage of your work. Your patch was just merged into 
> USOCKET trunk (r570).

Thanks for the explanation, i am new to LispWorks. Looking forward to
the next Quicklisp update. :)

> Best Regards,
> 
> Chun Tian (binghe)
> 
> [1] http://common-lisp.net/projects/cl-net-snmp/lispworks.html
> 
> 在 2010-12-7,19:01, Kamil Shakirov 写道:
> 
> > Hello List,
> > 
> > I had a hard time figuring out why my app running on LispWorks 6.0
> > couldn't receive and send messages via multiple UDP sockets concurrently
> > until I discovered that a global lock was used on global recv/send
> > buffers.
> > 
> > Is there any reason why global recv/send buffers are used?
> > 
> > The attached patch fixes the problem. Tested with LispWorks 6.0.
> > 
> > --ska
> > <0001-Enable-mutiple-UDP-sockets.patch>_______________________________________________
> > usocket-devel mailing list
> > usocket-devel@common-lisp.net
> > http://common-lisp.net/cgi-bin/mailman/listinfo/usocket-devel
> 

--ska


_______________________________________________
usocket-devel mailing list
usocket-devel@common-lisp.net
http://common-lisp.net/cgi-bin/mailman/listinfo/usocket-devel

Reply via email to