summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/uthread/uthread_close.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* Make internal file descriptor handling async-signal safe by eliminatingkurt2009-12-061-3/+3
| | | | | | the use of spinlocks and malloc. All needed memory is allocated upfront and _thread_kern_sig_defer/undefer() is now used to protect critical sections. okay guenther@
* Use rlimit nofiles max to size fd/fdp tables instead of cur. Fixeskurt2007-04-271-2/+2
| | | | applications that increase nofiles using setrlimit(2). ok marc@
* Part 2 of file descriptor race and deadlock corrections.kurt2006-09-261-8/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Adjust design of file descriptor table to eliminate races with both opening and closing of file descriptor entries and eliminates one class of deadlocks. One nice side effect of this change in design should be better performance for applications that open and close many file descriptors due to reduced fd_table_lock contention and fd entry reuse. - Add entry states to manage use of entry and eliminate some closing races. fd entries are not deallocated upon close() now. - Call _thread_fd_table_init with one of five discreet modes to properly initialize an entry and manage the state transition to open. - When closing an entry hold the entry spinlock locked across the state transition and the _thread_sys_close call to close another race. - Introduce a new lock type FD_RDWR_CLOSE that transitions either a closed entry or an open entry into closing state and then waits for a RDWR lock so that the lock queue can unwind normally. All subsequent fd lock attempts for that entry are rejected with EBADF until the fd is fully closed, or reopened by dup2(). Once a thread holds the FD_RDWR_LOCK it is safe to close() it or dup2() on it. - When a thread creates a new fd there is a window of time when another thread could attempt to use the fd before the creating thread has initialized the entry for it. This can result in improper status_flags for the entry, so record the entries init mode, detect when this has happened and correct the status_flags when needed. reviewed by marc@ & brad@, tested by several, okay brad@
* Part 1 of file descriptor race and deadlock corrections.kurt2006-09-221-39/+1
| | | | | | | | | | | | | | | | | | | | File status flags should be shared for dup'ed file descriptors. However fd_table_entry's should not be shared for dup'ed file descriptors so they can be independently be closed without interfering with dup'ed fd's. - split out file status flags into its own structure fs_flags to manage sharing of status flags between dup'ed file descriptors. - when duplicating a fd, initialize a new fd_table_entry for the new fd, but share the status flags via status_flags. - consolidate the code that sets the underlying system fd to be non-blocking to a new function _thread_fs_flags_init() - consolidate the code that sets the underlying system fd back to blocking into a new function _thread_fs_flags_replace() This change is needed as a prerequisite to the coming race and deadlock corrections. okay marc@
* Based upon a freebsd change:marc2003-12-231-10/+6
| | | | | | | | | | | | | | If an application closes one of its stdio descriptors (0..2), an excessive close() on one of these descriptors would cause a memory for this descriptor to be allocated in the internal descriptor table. When this descriptor gets used again, e.g. through the call to open() or socket(), the descriptor would be erroneously left in the blocking mode, and the whole application would get stuck on a blocking operation, e.g., in accept(2). but changed to not eat fds when a file that the thread kernel doesn't know about is closed.
* fix bug that would leave an FD locked if dup'd, then closed.marc2003-02-141-7/+2
| | | | Also, for safety lock the _thread_fd_table when removing entries.
* Part 1 of thread fd handling fixes. In the new scheme fd_table_entriesmarc2003-02-041-2/+3
| | | | | | | | | | | | | | | | | for dup-ed fds are shared to ensure proper flag handling. A refcnt was added to control when entries should be freed. Specific changes: close: don't free entry unless refcnt is zero dup: rewrite to use new function _thread_fd_table_dup dup2: rewrite to use new function _thread_fd_table_dup fcntl: use _thread_fd_table_dup uthread_fd: initialize thread fd table, searching for dup-ed fds. Add function to share _thread_fd_table entries when an fd is dup-ed. uthread_init: make it readable. Call fd init functions. All current regression tests plus the mysql torture test pass. The new stdfiles regression test fails (I/O redirection problem). Part 2 is intended to fix that problem
* if fstat fails fails, as it will on some sockets, close anyway.d2000-10-041-4/+10
|
* unused variabled2000-01-061-2/+1
|
* sync with FreeBSDd1999-11-251-10/+25
|
* document cancellation point handling a bit betterd1999-06-091-1/+6
|
* pthread_cancel() and cancellation pointsd1999-01-171-1/+3
|
* identd1999-01-061-0/+1
|
* sync with FreeBSD (rwlock, gc thread, man pages)d1998-11-091-1/+0
| | | | | | | add (broken) mips md stuff fix some const warnings add sigaltstack() stub another hash at getting shlib auto-init to work (mips/elf and i386/a.out)
* experimental threaded libc - kernel onlyd1998-08-271-0/+89