DragonFly commits List (threaded) for 2006-05
cvs commit: src/sys/kern kern_checkpoint.c kern_descrip.c kern_event.c sys_pipe.c uipc_syscalls.c uipc_usrreq.c vfs_syscalls.c src/sys/opencrypto cryptodev.c src/sys/sys filedesc.h
dillon 2006/05/22 14:21:26 PDT
DragonFly src repository
sys/kern kern_checkpoint.c kern_descrip.c
kern_event.c sys_pipe.c uipc_syscalls.c
Do a major cleanup of the file descriptor handling code in preparation for
making the descriptor table MPSAFE. Introduce a new feature that allows a
file descriptor number to be reserved without having to assign a file
pointer to it. This allows code such as open(), dup(), etc to reserve
descriptors to work with without having to worry about the related file
being ripped out from under them by another thread sharing the descriptor
falloc() - This function allocates the file pointer and descriptor as
before, but does NOT associate the file pointer with the
Before this change another thread could access the file
pointer while the system call creating it was blocked,
before the system call had a chance to completely initialize
the file pointer.
The caller must call fsetfd() to assign or clear the
fsetfd() - Is now responsible for associating a file pointer with a
previously reserved descriptor or clearing the reservation.
fdealloc() - This hack existed to deal with open/dup races against other
threads. The above changes remove the possibility so this
routine has been deleted.
dup code - kern_dup() and dupfdopen() have been completely rewritten.
They are much cleaner and less obtuse now. Additional race
conditions in the original code were also found and fixed.
funsetfd() - Now returns the file pointer that was cleared and takes
responsibility for adjusting fd_lastfile.
NOTE: fd_lastfile is inclusive of any reserved descriptors.
fdcopy() - While not yet MPSAFE, fdcopy now properly handles races
against other threads.
This field was not being properly updated in certain failure
cases. This commit fixes that. Also, if all a process's
descriptors were closed this field was incorrectly left at
0 when it should have been set to -1.
fdp->fd_files - A number of code blocks were trying to optimize a for()
loop over all file descriptors by caching a pointer to
fd_files. This is a problem because fd_files can be
reallocated if code within the loop blocks. These loops
have been rewritten.
Revision Changes Path
1.8 +2 -1 src/sys/kern/kern_checkpoint.c
1.60 +199 -184 src/sys/kern/kern_descrip.c
1.24 +1 -0 src/sys/kern/kern_event.c
1.36 +4 -1 src/sys/kern/sys_pipe.c
1.68 +27 -27 src/sys/kern/uipc_syscalls.c
1.25 +4 -2 src/sys/kern/uipc_usrreq.c
1.92 +27 -49 src/sys/kern/vfs_syscalls.c
1.15 +1 -0 src/sys/opencrypto/cryptodev.c
1.17 +4 -5 src/sys/sys/filedesc.h