31#ifdef F___lock___sfp_recursive_mutex
32struct __lock __lock___sfp_recursive_mutex;
35#ifdef F___lock___atexit_recursive_mutex
36struct __lock __lock___atexit_recursive_mutex;
39#ifdef F___lock___at_quick_exit_mutex
40struct __lock __lock___at_quick_exit_mutex;
43#ifdef F___lock___malloc_recursive_mutex
44struct __lock __lock___malloc_recursive_mutex;
47#ifdef F___lock___env_recursive_mutex
48struct __lock __lock___env_recursive_mutex;
51#ifdef F___lock___tz_mutex
52struct __lock __lock___tz_mutex;
55#ifdef F___lock___dd_hash_mutex
56struct __lock __lock___dd_hash_mutex;
59#ifdef F___lock___arc4random_mutex
60struct __lock __lock___arc4random_mutex;
63static inline void __common_lock_init(_LOCK_T lock)
70 sema.wait_threads = 0;
71 lock->sem_id = CreateSema(&sema);
76static inline void __common_lock_init_recursive(_LOCK_T lock)
83 sema.wait_threads = 0;
84 lock->sem_id = CreateSema(&sema);
89static inline void __common_lock_close(_LOCK_T lock)
91 DeleteSema(lock->sem_id);
94static inline void __common_lock_close_recursive(_LOCK_T lock)
96 DeleteSema(lock->sem_id);
99#ifdef F___retarget_lock_init
100void __retarget_lock_init(_LOCK_T *lock)
102 _LOCK_T new_lock = (_LOCK_T)malloc(
sizeof(
struct __lock));
103 __common_lock_init(new_lock);
108#ifdef F___retarget_lock_init_recursive
109void __retarget_lock_init_recursive(_LOCK_T *lock)
111 _LOCK_T new_lock = (_LOCK_T)malloc(
sizeof(
struct __lock));
112 __common_lock_init_recursive(new_lock);
117#ifdef F___retarget_lock_close
118void __retarget_lock_close(_LOCK_T lock)
120 __common_lock_close(lock);
125#ifdef F___retarget_lock_close_recursive
126void __retarget_lock_close_recursive(_LOCK_T lock)
128 __common_lock_close_recursive(lock);
133#ifdef F___retarget_lock_acquire
134void __retarget_lock_acquire(_LOCK_T lock)
136 WaitSema(lock->sem_id);
140#ifdef F___retarget_lock_acquire_recursive
141void __retarget_lock_acquire_recursive(_LOCK_T lock)
143 bool starting =
false;
144 int32_t thread_id = GetThreadId();
145 starting = lock->count == 0;
147 lock->thread_id = thread_id;
149 if (lock->thread_id == thread_id) {
152 WaitSema(lock->sem_id);
155 WaitSema(lock->sem_id);
160 lock->thread_id = thread_id;
166#ifdef F___retarget_lock_try_acquire
167int __retarget_lock_try_acquire(_LOCK_T lock)
169 return PollSema(lock->sem_id) > 0 ? 0 : 1;
173#ifdef F___retarget_lock_try_acquire_recursive
174int __retarget_lock_try_acquire_recursive(_LOCK_T lock)
177 bool starting =
false;
178 int32_t thread_id = GetThreadId();
179 starting = lock->count == 0;
181 lock->thread_id = thread_id;
183 if (lock->thread_id == thread_id) {
186 res = PollSema(lock->sem_id) > 0 ? 0 : 1;
189 res = PollSema(lock->sem_id) > 0 ? 0 : 1;
194 lock->thread_id = thread_id;
201#ifdef F___retarget_lock_release
202void __retarget_lock_release(_LOCK_T lock)
204 SignalSema(lock->sem_id);
208#ifdef F___retarget_lock_release_recursive
209void __retarget_lock_release_recursive(_LOCK_T lock)
211 bool tobeRelease =
false;
212 int32_t thread_id = GetThreadId();
213 if (lock->thread_id != thread_id) {
215 perror(
"Error: Trying to release a lock that was not acquired by the current thread");
219 tobeRelease = lock->count == 1;
221 if (lock->count == 0) {
222 lock->thread_id = -1;
225 SignalSema(lock->sem_id);
231extern struct __lock __lock___malloc_recursive_mutex;
232extern struct __lock __lock___atexit_recursive_mutex;
233extern struct __lock __lock___at_quick_exit_mutex;
234extern struct __lock __lock___sfp_recursive_mutex;
235extern struct __lock __lock___env_recursive_mutex;
236extern struct __lock __lock___tz_mutex;
237extern struct __lock __lock___dd_hash_mutex;
238extern struct __lock __lock___arc4random_mutex;
247 _REENT_CLEANUP(_REENT) = NULL;
249 _LOCK_T lock_malloc = &__lock___malloc_recursive_mutex;
250 _LOCK_T lock_atexit = &__lock___atexit_recursive_mutex;
251 _LOCK_T lock_quick_exit = &__lock___at_quick_exit_mutex;
252 _LOCK_T lock_sfp = &__lock___sfp_recursive_mutex;
253 _LOCK_T lock_env = &__lock___env_recursive_mutex;
254 _LOCK_T lock_tz = &__lock___tz_mutex;
255 _LOCK_T lock_dd_hash = &__lock___dd_hash_mutex;
256 _LOCK_T lock_arc4random = &__lock___arc4random_mutex;
258 __common_lock_init_recursive(lock_malloc);
259 __common_lock_init_recursive(lock_atexit);
260 __common_lock_init(lock_quick_exit);
261 __common_lock_init_recursive(lock_sfp);
262 __common_lock_init_recursive(lock_env);
263 __common_lock_init(lock_tz);
264 __common_lock_init(lock_dd_hash);
265 __common_lock_init(lock_arc4random);
269#ifdef F___locks_deinit
270extern struct __lock __lock___malloc_recursive_mutex;
271extern struct __lock __lock___atexit_recursive_mutex;
272extern struct __lock __lock___at_quick_exit_mutex;
273extern struct __lock __lock___sfp_recursive_mutex;
274extern struct __lock __lock___env_recursive_mutex;
275extern struct __lock __lock___tz_mutex;
276extern struct __lock __lock___dd_hash_mutex;
277extern struct __lock __lock___arc4random_mutex;
281 _LOCK_T lock_malloc = &__lock___malloc_recursive_mutex;
282 _LOCK_T lock_atexit = &__lock___atexit_recursive_mutex;
283 _LOCK_T lock_quick_exit = &__lock___at_quick_exit_mutex;
284 _LOCK_T lock_sfp = &__lock___sfp_recursive_mutex;
285 _LOCK_T lock_env = &__lock___env_recursive_mutex;
286 _LOCK_T lock_tz = &__lock___tz_mutex;
287 _LOCK_T lock_dd_hash = &__lock___dd_hash_mutex;
288 _LOCK_T lock_arc4random = &__lock___arc4random_mutex;
291 __common_lock_close_recursive(lock_malloc);
292 __common_lock_close_recursive(lock_atexit);
293 __common_lock_close(lock_quick_exit);
294 __common_lock_close_recursive(lock_sfp);
295 __common_lock_close_recursive(lock_env);
296 __common_lock_close(lock_tz);
297 __common_lock_close(lock_dd_hash);
298 __common_lock_close(lock_arc4random);