X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/9385eb3d10ebe5eb398c52040ec3dbfba9b0cdcf..refs/heads/master:/stdio/FreeBSD/_flock_stub.c?ds=inline diff --git a/stdio/FreeBSD/_flock_stub.c b/stdio/FreeBSD/_flock_stub.c index 2322a7f..330830f 100644 --- a/stdio/FreeBSD/_flock_stub.c +++ b/stdio/FreeBSD/_flock_stub.c @@ -10,10 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by John Birrell. - * 4. Neither the name of the author nor the names of any co-contributors + * 3. Neither the name of the author nor the names of any co-contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -38,9 +35,10 @@ */ #include -__FBSDID("$FreeBSD: src/lib/libc/stdio/_flock_stub.c,v 1.12 2002/03/22 21:53:04 obrien Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/stdio/_flock_stub.c,v 1.16 2008/04/17 22:17:53 jhb Exp $"); #include "namespace.h" +#include #include #include #include @@ -49,7 +47,6 @@ __FBSDID("$FreeBSD: src/lib/libc/stdio/_flock_stub.c,v 1.12 2002/03/22 21:53:04 #include "local.h" - /* * Weak symbols for externally visible functions in this file: */ @@ -58,32 +55,13 @@ __weak_reference(_flockfile_debug_stub, _flockfile_debug); __weak_reference(_ftrylockfile, ftrylockfile); __weak_reference(_funlockfile, funlockfile); -/* - * We need to retain binary compatibility for a while. So pretend - * that _lock is part of FILE * even though it is dereferenced off - * _extra now. When we stop encoding the size of FILE into binaries - * this can be changed in stdio.h. This will reduce the amount of - * code that has to change in the future (just remove this comment - * and #define). - */ -#define _lock _extra - void _flockfile(FILE *fp) { - pthread_t curthread = _pthread_self(); - - if (fp->_lock->fl_owner == curthread) - fp->_lock->fl_count++; - else { - /* - * Make sure this mutex is treated as a private - * internal mutex: - */ - _pthread_mutex_lock(&fp->_lock->fl_mutex); - fp->_lock->fl_owner = curthread; - fp->_lock->fl_count = 1; - } + // - preserve errno. + int save_errno = errno; + _pthread_mutex_lock(&fp->_fl_mutex); + errno = save_errno; } /* @@ -98,52 +76,22 @@ _flockfile_debug_stub(FILE *fp, char *fname, int lineno) int _ftrylockfile(FILE *fp) { - pthread_t curthread = _pthread_self(); int ret = 0; - if (fp->_lock->fl_owner == curthread) - fp->_lock->fl_count++; - /* - * Make sure this mutex is treated as a private - * internal mutex: - */ - else if (_pthread_mutex_trylock(&fp->_lock->fl_mutex) == 0) { - fp->_lock->fl_owner = curthread; - fp->_lock->fl_count = 1; - } - else + // - preserve errno. + int save_errno = errno; + if (_pthread_mutex_trylock(&fp->_fl_mutex) != 0) ret = -1; + errno = save_errno; + return (ret); } void _funlockfile(FILE *fp) { - pthread_t curthread = _pthread_self(); - - /* - * Check if this file is owned by the current thread: - */ - if (fp->_lock->fl_owner == curthread) { - /* - * Check if this thread has locked the FILE - * more than once: - */ - if (fp->_lock->fl_count > 1) - /* - * Decrement the count of the number of - * times the running thread has locked this - * file: - */ - fp->_lock->fl_count--; - else { - /* - * The running thread will release the - * lock now: - */ - fp->_lock->fl_count = 0; - fp->_lock->fl_owner = NULL; - _pthread_mutex_unlock(&fp->_lock->fl_mutex); - } - } + // - preserve errno. + int save_errno = errno; + _pthread_mutex_unlock(&fp->_fl_mutex); + errno = save_errno; }