Closing a socket.

Chris Johns chrisj at rtems.org
Fri May 13 14:07:04 UTC 2005


Joel Sherrill <joel at OARcorp.com> wrote:
> 
> Yes it does appear that there are multiple points where blocking
> can occur but don't they all boil down to only a handful of calls
> to event_receive?
> 

Yes it does.

> 
> There are only 3 calls to soconnsleep()in addition to the accept()
> routine. They would just have to be fixed.
> 
> Also there are only a handful of event receive calls in the stack
> as well.
> 
> This shouldn't be a hard thing to do.  One approach is to send a
> deleted event and let the code after the receive check for that
> event.

The event is easy, knowing when to use it is not. The API from the 
networking code provides no way of doing this.

> simply avoid touching the socket memory, and return a
> "deleted" status.  Those calling a blocking helper would have
> to put the return status into a local variable and make sure it
> was OK to reference malloc'ed memory.
> 

I do not wish to touch the BSD code and this is what would be needed. 
This means the close thread that does a wake needs to block.

> If you don't use the deleted event, then you should be able to return
> status through the TCB and just use that.  Again if the socket is 
> deleted, then code has to avoid touching malloc'ed memory.
> 

I have a solution which I have tested accept and recv calls with and 
they work well. The other paths are much harder to generate tests for so 
I have done a code audit and it looks ok. I have tested this with 
OpenSSL and TSL connections and do not see any problems.

The fix uses a CONNABORT event to wake the sleeper and a socket state 
flag to cause the abort event to be used. The close sets the SS_ASYNC 
flag in the socket so the wake calls know to send the abort event. I 
checked the code and SS_ASYNC is not used anywhere. The error code 
returned is ECONNABORT.

The soconnsleep and sbwait work the same way when recovering from a close.

The twist to using the abort event is the wake caller (close thread) has 
to blocked until the woken thread is clear of the networking code.

-- 
  Chris Johns



More information about the users mailing list