]> git.saurik.com Git - apple/libc.git/blobdiff - stdio/FreeBSD/_flock_stub.c
Libc-1439.100.3.tar.gz
[apple/libc.git] / stdio / FreeBSD / _flock_stub.c
index 07e02fd444dd8e3b24ab0ff0f18eddda88ac3fa7..330830f9e8d7c0a87407be55cfcae9df47c59176 100644 (file)
@@ -38,6 +38,7 @@
 __FBSDID("$FreeBSD: src/lib/libc/stdio/_flock_stub.c,v 1.16 2008/04/17 22:17:53 jhb Exp $");
 
 #include "namespace.h"
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -46,7 +47,6 @@ __FBSDID("$FreeBSD: src/lib/libc/stdio/_flock_stub.c,v 1.16 2008/04/17 22:17:53
 
 #include "local.h"
 
-
 /*
  * Weak symbols for externally visible functions in this file:
  */
@@ -58,19 +58,10 @@ __weak_reference(_funlockfile, funlockfile);
 void
 _flockfile(FILE *fp)
 {
-       pthread_t curthread = _pthread_self();
-
-       if (fp->_fl_owner == curthread)
-               fp->_fl_count++;
-       else {
-               /*
-                * Make sure this mutex is treated as a private
-                * internal mutex:
-                */
-               _pthread_mutex_lock(&fp->_fl_mutex);
-               fp->_fl_owner = curthread;
-               fp->_fl_count = 1;
-       }
+       // <rdar://problem/21533199> - preserve errno.
+       int save_errno = errno;
+       _pthread_mutex_lock(&fp->_fl_mutex);
+       errno = save_errno;
 }
 
 /*
@@ -85,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->_fl_owner == curthread)
-               fp->_fl_count++;
-       /*
-        * Make sure this mutex is treated as a private
-        * internal mutex:
-        */
-       else if (_pthread_mutex_trylock(&fp->_fl_mutex) == 0) {
-               fp->_fl_owner = curthread;
-               fp->_fl_count = 1;
-       }
-       else
+       // <rdar://problem/21533199> - 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->_fl_owner == curthread) {
-               /*
-                * Check if this thread has locked the FILE
-                * more than once:
-                */
-               if (fp->_fl_count > 1)
-                       /*
-                        * Decrement the count of the number of
-                        * times the running thread has locked this
-                        * file:
-                        */
-                       fp->_fl_count--;
-               else {
-                       /*
-                        * The running thread will release the
-                        * lock now:
-                        */
-                       fp->_fl_count = 0;
-                       fp->_fl_owner = NULL;
-                       _pthread_mutex_unlock(&fp->_fl_mutex);
-               }
-       }
+       // <rdar://problem/21533199> - preserve errno.
+       int save_errno = errno;
+       _pthread_mutex_unlock(&fp->_fl_mutex);
+       errno = save_errno;
 }