31 #ifdef F___lock___sfp_recursive_mutex
32 struct __lock __lock___sfp_recursive_mutex;
35 #ifdef F___lock___atexit_recursive_mutex
36 struct __lock __lock___atexit_recursive_mutex;
39 #ifdef F___lock___at_quick_exit_mutex
40 struct __lock __lock___at_quick_exit_mutex;
43 #ifdef F___lock___malloc_recursive_mutex
44 struct __lock __lock___malloc_recursive_mutex;
47 #ifdef F___lock___env_recursive_mutex
48 struct __lock __lock___env_recursive_mutex;
51 #ifdef F___lock___tz_mutex
52 struct __lock __lock___tz_mutex;
55 #ifdef F___lock___dd_hash_mutex
56 struct __lock __lock___dd_hash_mutex;
59 #ifdef F___lock___arc4random_mutex
60 struct __lock __lock___arc4random_mutex;
63 static inline void __common_lock_init(_LOCK_T lock)
70 sema.wait_threads = 0;
71 lock->sem_id = CreateSema(&sema);
76 static inline void __common_lock_init_recursive(_LOCK_T lock)
83 sema.wait_threads = 0;
84 lock->sem_id = CreateSema(&sema);
89 static inline void __common_lock_close(_LOCK_T lock)
91 DeleteSema(lock->sem_id);
94 static inline void __common_lock_close_recursive(_LOCK_T lock)
96 DeleteSema(lock->sem_id);
99 #ifdef F___retarget_lock_init
100 void __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
109 void __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
118 void __retarget_lock_close(_LOCK_T lock)
120 __common_lock_close(lock);
125 #ifdef F___retarget_lock_close_recursive
126 void __retarget_lock_close_recursive(_LOCK_T lock)
128 __common_lock_close_recursive(lock);
133 #ifdef F___retarget_lock_acquire
134 void __retarget_lock_acquire(_LOCK_T lock)
136 WaitSema(lock->sem_id);
140 #ifdef F___retarget_lock_acquire_recursive
141 void __retarget_lock_acquire_recursive(_LOCK_T lock)
143 int32_t thread_id = GetThreadId();
149 if (lock->count > 0 && lock->thread_id == thread_id) {
160 WaitSema(lock->sem_id);
161 lock->thread_id = thread_id;
166 #ifdef F___retarget_lock_try_acquire
167 int __retarget_lock_try_acquire(_LOCK_T lock)
169 return PollSema(lock->sem_id) > 0 ? 0 : 1;
173 #ifdef F___retarget_lock_try_acquire_recursive
174 int __retarget_lock_try_acquire_recursive(_LOCK_T lock)
176 int32_t thread_id = GetThreadId();
178 if (lock->count > 0 && lock->thread_id == thread_id) {
183 if (PollSema(lock->sem_id) <= 0) {
186 lock->thread_id = thread_id;
192 #ifdef F___retarget_lock_release
193 void __retarget_lock_release(_LOCK_T lock)
195 SignalSema(lock->sem_id);
199 #ifdef F___retarget_lock_release_recursive
200 void __retarget_lock_release_recursive(_LOCK_T lock)
202 bool tobeRelease =
false;
203 int32_t thread_id = GetThreadId();
204 if (lock->thread_id != thread_id) {
206 perror(
"Error: Trying to release a lock that was not acquired by the current thread");
210 tobeRelease = lock->count == 1;
212 if (lock->count == 0) {
213 lock->thread_id = -1;
216 SignalSema(lock->sem_id);
221 #ifdef F___locks_init
222 extern struct __lock __lock___malloc_recursive_mutex;
223 extern struct __lock __lock___atexit_recursive_mutex;
224 extern struct __lock __lock___at_quick_exit_mutex;
225 extern struct __lock __lock___sfp_recursive_mutex;
226 extern struct __lock __lock___env_recursive_mutex;
227 extern struct __lock __lock___tz_mutex;
228 extern struct __lock __lock___dd_hash_mutex;
229 extern struct __lock __lock___arc4random_mutex;
238 _REENT_CLEANUP(_REENT) = NULL;
240 _LOCK_T lock_malloc = &__lock___malloc_recursive_mutex;
241 _LOCK_T lock_atexit = &__lock___atexit_recursive_mutex;
242 _LOCK_T lock_quick_exit = &__lock___at_quick_exit_mutex;
243 _LOCK_T lock_sfp = &__lock___sfp_recursive_mutex;
244 _LOCK_T lock_env = &__lock___env_recursive_mutex;
245 _LOCK_T lock_tz = &__lock___tz_mutex;
246 _LOCK_T lock_dd_hash = &__lock___dd_hash_mutex;
247 _LOCK_T lock_arc4random = &__lock___arc4random_mutex;
249 __common_lock_init_recursive(lock_malloc);
250 __common_lock_init_recursive(lock_atexit);
251 __common_lock_init(lock_quick_exit);
252 __common_lock_init_recursive(lock_sfp);
253 __common_lock_init_recursive(lock_env);
254 __common_lock_init(lock_tz);
255 __common_lock_init(lock_dd_hash);
256 __common_lock_init(lock_arc4random);
260 #ifdef F___locks_deinit
261 extern struct __lock __lock___malloc_recursive_mutex;
262 extern struct __lock __lock___atexit_recursive_mutex;
263 extern struct __lock __lock___at_quick_exit_mutex;
264 extern struct __lock __lock___sfp_recursive_mutex;
265 extern struct __lock __lock___env_recursive_mutex;
266 extern struct __lock __lock___tz_mutex;
267 extern struct __lock __lock___dd_hash_mutex;
268 extern struct __lock __lock___arc4random_mutex;
270 void __locks_deinit()
272 _LOCK_T lock_malloc = &__lock___malloc_recursive_mutex;
273 _LOCK_T lock_atexit = &__lock___atexit_recursive_mutex;
274 _LOCK_T lock_quick_exit = &__lock___at_quick_exit_mutex;
275 _LOCK_T lock_sfp = &__lock___sfp_recursive_mutex;
276 _LOCK_T lock_env = &__lock___env_recursive_mutex;
277 _LOCK_T lock_tz = &__lock___tz_mutex;
278 _LOCK_T lock_dd_hash = &__lock___dd_hash_mutex;
279 _LOCK_T lock_arc4random = &__lock___arc4random_mutex;
282 __common_lock_close_recursive(lock_malloc);
283 __common_lock_close_recursive(lock_atexit);
284 __common_lock_close(lock_quick_exit);
285 __common_lock_close_recursive(lock_sfp);
286 __common_lock_close_recursive(lock_env);
287 __common_lock_close(lock_tz);
288 __common_lock_close(lock_dd_hash);
289 __common_lock_close(lock_arc4random);