1 /* Thread package specific definitions of stream lock type. NPTL version. 2 Copyright (C) 2000, 2001, 2002, 2003, 2007 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <http://www.gnu.org/licenses/>. */ 18 19 #ifndef _BITS_STDIO_LOCK_H 20 #define _BITS_STDIO_LOCK_H 1 21 22 #include <bits/libc-lock.h> 23 #include <lowlevellock.h> 24 25 26 /* The locking here is very inexpensive, even for inlining. */ 27 #define _IO_lock_inexpensive 1 28 29 typedef struct { int lock; int cnt; void *owner; } _IO_lock_t; 30 31 #define _IO_lock_initializer { LLL_LOCK_INITIALIZER, 0, NULL } 32 33 #define _IO_lock_init(_name) \ 34 ((_name) = (_IO_lock_t) _IO_lock_initializer , 0) 35 36 #define _IO_lock_fini(_name) \ 37 ((void) 0) 38 39 #define _IO_lock_lock(_name) \ 40 do { \ 41 void *__meself = THREAD_SELF; \ 42 if ((_name).owner != __meself) \ 43 { \ 44 lll_lock ((_name).lock, LLL_PRIVATE); \ 45 (_name).owner = __meself; \ 46 } \ 47 ++(_name).cnt; \ 48 } while (0) 49 50 #define _IO_lock_trylock(_name) \ 51 ({ \ 52 int __result = 0; \ 53 void *__meself = THREAD_SELF; \ 54 if ((_name).owner != __meself) \ 55 { \ 56 if (lll_trylock ((_name).lock) == 0) \ 57 { \ 58 (_name).owner = __meself; \ 59 (_name).cnt = 1; \ 60 } \ 61 else \ 62 __result = EBUSY; \ 63 } \ 64 else \ 65 ++(_name).cnt; \ 66 __result; \ 67 }) 68 69 #define _IO_lock_unlock(_name) \ 70 do { \ 71 if (--(_name).cnt == 0) \ 72 { \ 73 (_name).owner = NULL; \ 74 lll_unlock ((_name).lock, LLL_PRIVATE); \ 75 } \ 76 } while (0) 77 78 79 80 #define _IO_cleanup_region_start(_fct, _fp) \ 81 __libc_cleanup_region_start (((_fp)->_flags & _IO_USER_LOCK) == 0, _fct, _fp) 82 #define _IO_cleanup_region_start_noarg(_fct) \ 83 __libc_cleanup_region_start (1, _fct, NULL) 84 #define _IO_cleanup_region_end(_doit) \ 85 __libc_cleanup_region_end (_doit) 86 87 #if defined _LIBC && !defined NOT_IN_libc 88 89 # ifdef __EXCEPTIONS 90 # define _IO_acquire_lock(_fp) \ 91 do { \ 92 _IO_FILE *_IO_acquire_lock_file \ 93 __attribute__((cleanup (_IO_acquire_lock_fct))) \ 94 = (_fp); \ 95 _IO_flockfile (_IO_acquire_lock_file); 96 # define _IO_acquire_lock_clear_flags2(_fp) \ 97 do { \ 98 _IO_FILE *_IO_acquire_lock_file \ 99 __attribute__((cleanup (_IO_acquire_lock_clear_flags2_fct))) \ 100 = (_fp); \ 101 _IO_flockfile (_IO_acquire_lock_file); 102 # else 103 # define _IO_acquire_lock(_fp) _IO_acquire_lock_needs_exceptions_enabled 104 # define _IO_acquire_lock_clear_flags2(_fp) _IO_acquire_lock (_fp) 105 # endif 106 # define _IO_release_lock(_fp) ; } while (0) 107 108 #endif 109 110 #endif /* bits/stdio-lock.h */ 111