From 22c52834eb703c132b4e7c6bd591610f1129d32d Mon Sep 17 00:00:00 2001 From: davidxu Date: Tue, 9 Dec 2003 02:20:56 +0000 Subject: Rename _thr_enter_cancellation_point to _thr_cancel_enter, rename _thr_leave_cancellation_point to _thr_cancel_leave, add a parameter to _thr_cancel_leave to indicate whether cancellation point should be checked, this gives us an option to not check cancallation point if a syscall successfully returns to avoid any leaks, current I have creat(), open() and fcntl(F_DUPFD) to not check cancellation point after they sucessfully returned. Replace some members in structure kse with bit flags to same some memory. Conditionally compile THR_ASSERT to nothing if _PTHREAD_INVARIANTS is not defined. Inline some small functions in thr_cancel.c. Use __predict_false in thr_kern.c for some executed only once code. Reviewd by: deischen --- lib/libpthread/thread/thr_fcntl.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'lib/libpthread/thread/thr_fcntl.c') diff --git a/lib/libpthread/thread/thr_fcntl.c b/lib/libpthread/thread/thr_fcntl.c index 0b4a990..947bc11 100644 --- a/lib/libpthread/thread/thr_fcntl.c +++ b/lib/libpthread/thread/thr_fcntl.c @@ -44,14 +44,21 @@ int __fcntl(int fd, int cmd,...) { struct pthread *curthread = _get_curthread(); - int ret; + int ret, check = 1; va_list ap; - _thr_enter_cancellation_point(curthread); + _thr_cancel_enter(curthread); va_start(ap, cmd); switch (cmd) { case F_DUPFD: + ret = __sys_fcntl(fd, cmd, va_arg(ap, int)); + /* + * To avoid possible file handle leak, + * only check cancellation point if it is failure + */ + check = (ret == -1); + break; case F_SETFD: case F_SETFL: ret = __sys_fcntl(fd, cmd, va_arg(ap, int)); @@ -65,7 +72,7 @@ __fcntl(int fd, int cmd,...) } va_end(ap); - _thr_leave_cancellation_point(curthread); + _thr_cancel_leave(curthread, check); return (ret); } -- cgit v1.1