close() of active socket does not work on FreeBSD 6

Robert Watson rwatson at FreeBSD.org
Thu Dec 21 07:22:17 PST 2006


On Wed, 20 Dec 2006, Julian Elischer wrote:

>> I think the main concern is if we will record every thread using a fd, that 
>> means, when you call read() on a fd, you record your thread pointer into 
>> the fd's thread list, when one wants to close the fd, it has to notify all 
>> the threads in the list, set a flag for each thread, the flag indicates a 
>> thread is interrupted because the fd was closed, when the thread returns 
>> from deep code path to read() syscall, it should check the flag, and return 
>> EBADF to user if it was set. whatever, a reserved signal or TDF_INTERRUPT 
>> may interrupt a thread. but since there are many file operations, I don't 
>> know if we are willing to pay such overheads to every file syscall, extra 
>> locking is not welcomed.
>
> 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.

Robert N M Watson
Computer Laboratory
University of Cambridge


More information about the freebsd-arch mailing list