summaryrefslogtreecommitdiffstats
path: root/libc/stdio/fileext.h
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2011-11-16 07:31:31 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-11-16 07:31:31 -0800
commitb38522983712432ba143c046343ba4fa01baf7c8 (patch)
treedda761ca6d2ea14ee7f181fb89625fc4c97e1f28 /libc/stdio/fileext.h
parent90c4c1e82b946c838f22be9c0bb3dcf81eaf26ca (diff)
parent9831ad3ce6bd5b22da16a275ed67e7236eae3d1f (diff)
downloadbionic-b38522983712432ba143c046343ba4fa01baf7c8.zip
bionic-b38522983712432ba143c046343ba4fa01baf7c8.tar.gz
bionic-b38522983712432ba143c046343ba4fa01baf7c8.tar.bz2
Merge "libc: speed-up flockfile()/funlockfile()"
Diffstat (limited to 'libc/stdio/fileext.h')
-rw-r--r--libc/stdio/fileext.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/libc/stdio/fileext.h b/libc/stdio/fileext.h
index 2d07043..b36a448 100644
--- a/libc/stdio/fileext.h
+++ b/libc/stdio/fileext.h
@@ -29,24 +29,41 @@
* $Citrus$
*/
+#include <pthread.h>
+#include "wcio.h"
+
/*
* file extension
*/
struct __sfileext {
struct __sbuf _ub; /* ungetc buffer */
struct wchar_io_data _wcio; /* wide char io status */
+ pthread_mutex_t _lock; /* file lock */
};
+#define _FILEEXT_INITIALIZER {{NULL,0},{0},PTHREAD_RECURSIVE_MUTEX_INITIALIZER}
+
#define _EXT(fp) ((struct __sfileext *)((fp)->_ext._base))
#define _UB(fp) _EXT(fp)->_ub
+#define _FLOCK(fp) _EXT(fp)->_lock
#define _FILEEXT_INIT(fp) \
do { \
_UB(fp)._base = NULL; \
_UB(fp)._size = 0; \
WCIO_INIT(fp); \
+ _FLOCK_INIT(fp); \
} while (0)
+/* Helper macros to avoid a function call when you know that fp is not NULL.
+ * Notice that we keep _FLOCK_INIT() fast by slightly breaking our pthread
+ * encapsulation.
+ */
+#define _FLOCK_INIT(fp) _FLOCK(fp).value = __PTHREAD_RECURSIVE_MUTEX_INIT_VALUE
+#define _FLOCK_LOCK(fp) pthread_mutex_lock(&_FLOCK(fp))
+#define _FLOCK_TRYLOCK(fp) pthread_mutex_trylock(&_FLOCK(fp))
+#define _FLOCK_UNLOCK(fp) pthread_mutex_unlock(&_FLOCK(fp))
+
#define _FILEEXT_SETUP(f, fext) \
do { \
(f)->_ext._base = (unsigned char *)(fext); \