diff options
| author | David 'Digit' Turner <digit@google.com> | 2011-11-16 07:31:31 -0800 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-11-16 07:31:31 -0800 |
| commit | b38522983712432ba143c046343ba4fa01baf7c8 (patch) | |
| tree | dda761ca6d2ea14ee7f181fb89625fc4c97e1f28 /libc/stdio/fileext.h | |
| parent | 90c4c1e82b946c838f22be9c0bb3dcf81eaf26ca (diff) | |
| parent | 9831ad3ce6bd5b22da16a275ed67e7236eae3d1f (diff) | |
| download | bionic-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.h | 17 |
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); \ |
