[Spread-users] Spread and select

Matthew Gillen mgillen at bbn.com
Sat Apr 8 13:48:54 EDT 2006


Hua Zhong wrote:
> Matthew,
> 
> Thanks for the reply , see inline.
> 
>> Hua Zhong wrote:
>>> It doesn't seem to be very difficult to do considering the mbox is 
>>> actually a socket handle. I could certainly do a select on 
>> it myself, and hack SP_receive to do a non-blocking mode 
>> read. But I'd like to understand why it's not provided as a 
>> standard API.
>>> Thanks.
>>>
>>> Please let me know your opinion, thanks.
>> There's an example of using select() with the mbox fd in the 
>> event system that is provided with Spread.  You don't have to 
>> hack SP_receive at all (that's the whole point of using 
>> select()! ).  See the E_handle_events function of events.c
> 
> Good, but there are a couple of issues:
> 1. it's not documented, thus making me wonder if it's officially supported feature. In fact, there is not even a SP_mailbox_to_fd
> kind of helper. How could one assume mailbox == fd? It's implementation details that could change anytime, and nothing to depend on.

I'll admit that I don't know what the implications are on Windows.  However,
mailbox==fd should be a safe assumption on unix systems.

> 2. there is still not a non-blocking version SP_receive. As I explained earlier, it's not very nice to programers.

But it's perfectly valid to call select() on a non-blocking file descriptor.
   Just  I'm not sure I understand where you think the problem is.

> I just checked the spread code (v3.17.3) and find the following in sp.c:
> 
> 		while(((ret = recv( mbox, &scat_mess->elements[scat_index].buf[byte_index], to_read, 0 )) == -1 )
>                       		&& ((sock_errno == EINTR) || (sock_errno == EAGAIN) || (sock_errno == EWOULDBLOCK)) )
>  
> This is very weird. If it's a blocking socket, it should never return EGAIN. If it's a non-blocking socket, the above effectily will
> spin forever until there is data.

I'm not sure what that code is supposed to do, but EAGAIN is only one
possible cause of recv() returning -1.  If you check the docs for SP_receive():
http://spread.org/docs/spread_docs_3/docs/sp_receive.html
it says:
  "The SP_receive function will block if no messages are available."

> Anyway, I think it would be a great improvement if non-blocking API could be provided.

Matt




More information about the Spread-users mailing list