1 /* libc-internal interface for mutex locks. Stub version. 2 Copyright (C) 1996-2022 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 <https://www.gnu.org/licenses/>. */ 18 19 #ifndef _LIBC_LOCK_H 20 #define _LIBC_LOCK_H 1 21 22 23 /* Define a lock variable NAME with storage class CLASS. The lock must be 24 initialized with __libc_lock_init before it can be used (or define it 25 with __libc_lock_define_initialized, below). Use `extern' for CLASS to 26 declare a lock defined in another module. In public structure 27 definitions you must use a pointer to the lock structure (i.e., NAME 28 begins with a `*'), because its storage size will not be known outside 29 of libc. */ 30 #define __libc_lock_define(CLASS,NAME) 31 #define __libc_lock_define_recursive(CLASS,NAME) 32 #define __rtld_lock_define_recursive(CLASS,NAME) 33 #define __libc_rwlock_define(CLASS,NAME) 34 35 /* Define an initialized lock variable NAME with storage class CLASS. */ 36 #define __libc_lock_define_initialized(CLASS,NAME) 37 #define __libc_rwlock_define_initialized(CLASS,NAME) 38 39 /* Define an initialized recursive lock variable NAME with storage 40 class CLASS. */ 41 #define __libc_lock_define_initialized_recursive(CLASS,NAME) 42 #define __rtld_lock_define_initialized_recursive(CLASS,NAME) 43 44 /* Initialize the named lock variable, leaving it in a consistent, unlocked 45 state. */ 46 #define __libc_lock_init(NAME) 47 #define __rtld_lock_initialize(NAME) 48 #define __libc_rwlock_init(NAME) 49 50 /* Same as last but this time we initialize a recursive mutex. */ 51 #define __libc_lock_init_recursive(NAME) 52 53 /* Finalize the named lock variable, which must be locked. It cannot be 54 used again until __libc_lock_init is called again on it. This must be 55 called on a lock variable before the containing storage is reused. */ 56 #define __libc_lock_fini(NAME) 57 #define __libc_rwlock_fini(NAME) 58 59 /* Finalize recursive named lock. */ 60 #define __libc_lock_fini_recursive(NAME) 61 62 /* Lock the named lock variable. */ 63 #define __libc_lock_lock(NAME) 64 #define __libc_rwlock_rdlock(NAME) 65 #define __libc_rwlock_wrlock(NAME) 66 67 /* Lock the recursive named lock variable. */ 68 #define __libc_lock_lock_recursive(NAME) 69 #define __rtld_lock_lock_recursive(NAME) 70 71 /* Try to lock the named lock variable. */ 72 #define __libc_lock_trylock(NAME) 0 73 #define __libc_rwlock_tryrdlock(NAME) 0 74 #define __libc_rwlock_trywrlock(NAME) 0 75 76 /* Try to lock the recursive named lock variable. */ 77 #define __libc_lock_trylock_recursive(NAME) 0 78 79 /* Unlock the named lock variable. */ 80 #define __libc_lock_unlock(NAME) 81 #define __libc_rwlock_unlock(NAME) 82 83 /* Unlock the recursive named lock variable. */ 84 #define __libc_lock_unlock_recursive(NAME) 85 #define __rtld_lock_unlock_recursive(NAME) 86 87 88 /* Define once control variable. */ 89 #define __libc_once_define(CLASS, NAME) CLASS int NAME = 0 90 91 /* Call handler iff the first call. */ 92 #define __libc_once(ONCE_CONTROL, INIT_FUNCTION) \ 93 do { \ 94 if ((ONCE_CONTROL) == 0) { \ 95 INIT_FUNCTION (); \ 96 (ONCE_CONTROL) = 1; \ 97 } \ 98 } while (0) 99 100 /* Get once control variable. */ 101 #define __libc_once_get(ONCE_CONTROL) \ 102 ((ONCE_CONTROL) == 1) 103 104 /* Start a critical region with a cleanup function */ 105 #define __libc_cleanup_region_start(DOIT, FCT, ARG) \ 106 { \ 107 typeof (***(FCT)) *__save_FCT = (DOIT) ? (FCT) : 0; \ 108 typeof (ARG) __save_ARG = ARG; \ 109 /* close brace is in __libc_cleanup_region_end below. */ 110 111 /* End a critical region started with __libc_cleanup_region_start. */ 112 #define __libc_cleanup_region_end(DOIT) \ 113 if ((DOIT) && __save_FCT != 0) \ 114 (*__save_FCT)(__save_ARG); \ 115 } 116 117 /* Sometimes we have to exit the block in the middle. */ 118 #define __libc_cleanup_end(DOIT) \ 119 if ((DOIT) && __save_FCT != 0) \ 120 (*__save_FCT)(__save_ARG); \ 121 122 #define __libc_cleanup_push(fct, arg) __libc_cleanup_region_start (1, fct, arg) 123 #define __libc_cleanup_pop(execute) __libc_cleanup_region_end (execute) 124 125 /* We need portable names for some of the functions. */ 126 #define __libc_mutex_unlock 127 128 #endif /* libc-lock.h */ 129