close() of active socket does not work on FreeBSD 6
David Xu
davidxu at freebsd.org
Thu Dec 21 18:43:15 PST 2006
John-Mark Gurney wrote:
> Robert Watson wrote this message on Thu, Dec 21, 2006 at 15:22 +0000:
>
>>>I think you are only intersted in treads that are sleeping.. so you allow
>>>a sleeping thread to save a pointer to the fd (or whatever) on which it is
>>>sleeping, along with the sleep address.
>>>
>>>items that are not sleeping are either already returning, or are going to
>>>sleep, in which case they can check at that time.
>>
>>Hence my question about select and poll: should they throw an exception
>>state when a file descriptor is closed out from under them? They often
>>sleep on hundreds or thousands of file descriptors, and not just one.
>
>
> IMO, your program is buggy if you close the file descriptor before
> everything is out of the kernel wrt the fd... It means that your close
> statement isn't waiting for things to be cleanly shut down, and that
> you still have dangling reference counts to the parts of the code that
> is in the kernel...
>
> I used to expect something similar w/ an kqueue based event driven
> web server, and found that I had bugs due to assuming that I could
> close it whenever I want... What happens if you close the fd between
> the time select returns and you process it? What happens if the fd
> gets closed, and another thread (or an earlier fd that accepts
> connections) reuses that fd? And then youre state machine isn't read
> to get an event since it isn't suppose to get one yet...
>
> The kernel isn't buggy wrt closing a fd when another thread is using
> it, it's the program that's buggy...
>
I agree with you here, as I said before, kernel may can do things
correctly, but user code has to struggle with race condition between
multiple threads, so if user code still has to work out a way to avoid
many race conditions, why don't they just use a signal to interrupt
target thread and do synchronization between threads. The requested
extra close() feature seems to be a wrongly defined problem.
Regards,
David Xu
More information about the freebsd-arch
mailing list