31struct __lock __lock___sfp_recursive_mutex;
33struct __lock __lock___atexit_recursive_mutex;
35struct __lock __lock___at_quick_exit_mutex;
37struct __lock __lock___malloc_recursive_mutex;
39struct __lock __lock___env_recursive_mutex;
41struct __lock __lock___tz_mutex;
43struct __lock __lock___dd_hash_mutex;
45struct __lock __lock___arc4random_mutex;
47static inline void __common_lock_init(_LOCK_T lock)
54 sema.wait_threads = 0;
55 lock->sem_id = CreateSema(&sema);
60static inline void __common_lock_init_recursive(_LOCK_T lock)
67 sema.wait_threads = 0;
68 lock->sem_id = CreateSema(&sema);
73static inline void __common_lock_close(_LOCK_T lock)
75 DeleteSema(lock->sem_id);
78static inline void __common_lock_close_recursive(_LOCK_T lock)
80 DeleteSema(lock->sem_id);
83void __retarget_lock_init(_LOCK_T *lock)
85 _LOCK_T new_lock = (_LOCK_T)malloc(
sizeof(
struct __lock));
86 __common_lock_init(new_lock);
90void __retarget_lock_init_recursive(_LOCK_T *lock)
92 _LOCK_T new_lock = (_LOCK_T)malloc(
sizeof(
struct __lock));
93 __common_lock_init_recursive(new_lock);
97void __retarget_lock_close(_LOCK_T lock)
99 __common_lock_close(lock);
103void __retarget_lock_close_recursive(_LOCK_T lock)
105 __common_lock_close_recursive(lock);
109void __retarget_lock_acquire(_LOCK_T lock)
111 WaitSema(lock->sem_id);
114void __retarget_lock_acquire_recursive(_LOCK_T lock)
116 int32_t thread_id = GetThreadId();
122 if (lock->count > 0 && lock->thread_id == thread_id) {
133 WaitSema(lock->sem_id);
134 lock->thread_id = thread_id;
138int __retarget_lock_try_acquire(_LOCK_T lock)
140 return PollSema(lock->sem_id) > 0 ? 0 : 1;
143int __retarget_lock_try_acquire_recursive(_LOCK_T lock)
145 int32_t thread_id = GetThreadId();
147 if (lock->count > 0 && lock->thread_id == thread_id) {
152 if (PollSema(lock->sem_id) <= 0) {
155 lock->thread_id = thread_id;
160void __retarget_lock_release(_LOCK_T lock)
162 SignalSema(lock->sem_id);
165void __retarget_lock_release_recursive(_LOCK_T lock)
167 bool tobeRelease =
false;
168 int32_t thread_id = GetThreadId();
169 if (lock->thread_id != thread_id) {
171 perror(
"Error: Trying to release a lock that was not acquired by the current thread");
175 tobeRelease = lock->count == 1;
177 if (lock->count == 0) {
178 lock->thread_id = -1;
181 SignalSema(lock->sem_id);
185extern struct __lock __lock___malloc_recursive_mutex;
186extern struct __lock __lock___atexit_recursive_mutex;
187extern struct __lock __lock___at_quick_exit_mutex;
188extern struct __lock __lock___sfp_recursive_mutex;
189extern struct __lock __lock___env_recursive_mutex;
190extern struct __lock __lock___tz_mutex;
191extern struct __lock __lock___dd_hash_mutex;
192extern struct __lock __lock___arc4random_mutex;
201 _REENT_CLEANUP(_REENT) = NULL;
203 _LOCK_T lock_malloc = &__lock___malloc_recursive_mutex;
204 _LOCK_T lock_atexit = &__lock___atexit_recursive_mutex;
205 _LOCK_T lock_quick_exit = &__lock___at_quick_exit_mutex;
206 _LOCK_T lock_sfp = &__lock___sfp_recursive_mutex;
207 _LOCK_T lock_env = &__lock___env_recursive_mutex;
208 _LOCK_T lock_tz = &__lock___tz_mutex;
209 _LOCK_T lock_dd_hash = &__lock___dd_hash_mutex;
210 _LOCK_T lock_arc4random = &__lock___arc4random_mutex;
212 __common_lock_init_recursive(lock_malloc);
213 __common_lock_init_recursive(lock_atexit);
214 __common_lock_init(lock_quick_exit);
215 __common_lock_init_recursive(lock_sfp);
216 __common_lock_init_recursive(lock_env);
217 __common_lock_init(lock_tz);
218 __common_lock_init(lock_dd_hash);
219 __common_lock_init(lock_arc4random);
222extern struct __lock __lock___malloc_recursive_mutex;
223extern struct __lock __lock___atexit_recursive_mutex;
224extern struct __lock __lock___at_quick_exit_mutex;
225extern struct __lock __lock___sfp_recursive_mutex;
226extern struct __lock __lock___env_recursive_mutex;
227extern struct __lock __lock___tz_mutex;
228extern struct __lock __lock___dd_hash_mutex;
229extern struct __lock __lock___arc4random_mutex;
233 _LOCK_T lock_malloc = &__lock___malloc_recursive_mutex;
234 _LOCK_T lock_atexit = &__lock___atexit_recursive_mutex;
235 _LOCK_T lock_quick_exit = &__lock___at_quick_exit_mutex;
236 _LOCK_T lock_sfp = &__lock___sfp_recursive_mutex;
237 _LOCK_T lock_env = &__lock___env_recursive_mutex;
238 _LOCK_T lock_tz = &__lock___tz_mutex;
239 _LOCK_T lock_dd_hash = &__lock___dd_hash_mutex;
240 _LOCK_T lock_arc4random = &__lock___arc4random_mutex;
243 __common_lock_close_recursive(lock_malloc);
244 __common_lock_close_recursive(lock_atexit);
245 __common_lock_close(lock_quick_exit);
246 __common_lock_close_recursive(lock_sfp);
247 __common_lock_close_recursive(lock_env);
248 __common_lock_close(lock_tz);
249 __common_lock_close(lock_dd_hash);
250 __common_lock_close(lock_arc4random);