#define _DEFAULT_SOURCE
#define __ASSERT_QUIET
#include <stdint.h>
#include <assert.h>
#include <stdlib.h>
#include <sys/lock.h>
#ifndef __SINGLE_THREAD
#define _LOCK_T struct __lock *
struct __lock {
intptr_t val;
};
struct __lock __lock___libc_recursive_mutex;
#define MAX_LOCKS 32
static struct __lock locks[MAX_LOCKS];
static uint8_t in_use[MAX_LOCKS];
void
__retarget_lock_init(_LOCK_T *lock)
{
int lock_id = 0;
for (lock_id = 0; lock_id < MAX_LOCKS; lock_id++)
if (!in_use[lock_id]) {
in_use[lock_id] = 1;
*lock = &locks[lock_id];
(*lock)->val = 0;
return;
}
assert(0);
}
void
__retarget_lock_init_recursive(_LOCK_T *lock)
{
__retarget_lock_init(lock);
}
void
__retarget_lock_close(_LOCK_T lock)
{
assert(lock->val == 0);
int lock_id = lock - locks;
assert(0 <= lock_id && lock_id < MAX_LOCKS);
in_use[lock_id] = 0;
}
void
__retarget_lock_close_recursive(_LOCK_T lock)
{
__retarget_lock_close(lock);
}
void
__retarget_lock_acquire(_LOCK_T lock)
{
assert(lock->val == 0);
lock->val = 1;
}
void
__retarget_lock_acquire_recursive(_LOCK_T lock)
{
assert(lock->val >= 0);
++(lock->val);
}
void
__retarget_lock_release(_LOCK_T lock)
{
assert(lock->val == 1);
lock->val = 0;
}
void
__retarget_lock_release_recursive(_LOCK_T lock)
{
assert(lock->val > 0);
--(lock->val);
}
__attribute__((destructor)) static void
lock_validate(void)
{
int i;
for (i = 0; i < MAX_LOCKS; i++) {
assert(locks[i].val == 0);
}
assert(__lock___libc_recursive_mutex.val == 0);
}
#endif