84 lines
1.8 KiB
C
84 lines
1.8 KiB
C
/**
|
|
* @file synchronization.h
|
|
* @brief Provides synchronization locks.
|
|
*/
|
|
#pragma once
|
|
|
|
/// A light lock.
|
|
typedef s32 LightLock;
|
|
|
|
/// A recursive lock.
|
|
typedef struct
|
|
{
|
|
LightLock lock; ///< Inner light lock.
|
|
u32 thread_tag; ///< Tag of the thread that currently has the lock.
|
|
u32 counter; ///< Lock count.
|
|
} RecursiveLock;
|
|
|
|
/// Performs a clrex operation.
|
|
static inline void __clrex(void)
|
|
{
|
|
__asm__ __volatile__("clrex");
|
|
}
|
|
|
|
/**
|
|
* @brief Performs a ldrex operation.
|
|
* @param addr Address to perform the operation on.
|
|
* @return The resulting value.
|
|
*/
|
|
static inline s32 __ldrex(s32* addr)
|
|
{
|
|
s32 val;
|
|
__asm__ __volatile__("ldrex %[val], %[addr]" : [val] "=r" (val) : [addr] "Q" (*addr));
|
|
return val;
|
|
}
|
|
|
|
/**
|
|
* @brief Performs a strex operation.
|
|
* @param addr Address to perform the operation on.
|
|
* @param val Value to store.
|
|
* @return Whether the operation was successful.
|
|
*/
|
|
static inline bool __strex(s32* addr, s32 val)
|
|
{
|
|
bool res;
|
|
__asm__ __volatile__("strex %[res], %[val], %[addr]" : [res] "=&r" (res) : [val] "r" (val), [addr] "Q" (*addr));
|
|
return res;
|
|
}
|
|
|
|
/**
|
|
* @brief Initializes a light lock.
|
|
* @param lock Pointer to the lock.
|
|
*/
|
|
void LightLock_Init(LightLock* lock);
|
|
|
|
/**
|
|
* @brief Locks a light lock.
|
|
* @param lock Pointer to the lock.
|
|
*/
|
|
void LightLock_Lock(LightLock* lock);
|
|
|
|
/**
|
|
* @brief Unlocks a light lock.
|
|
* @param lock Pointer to the lock.
|
|
*/
|
|
void LightLock_Unlock(LightLock* lock);
|
|
|
|
/**
|
|
* @brief Initializes a recursive lock.
|
|
* @param lock Pointer to the lock.
|
|
*/
|
|
void RecursiveLock_Init(RecursiveLock* lock);
|
|
|
|
/**
|
|
* @brief Locks a recursive lock.
|
|
* @param lock Pointer to the lock.
|
|
*/
|
|
void RecursiveLock_Lock(RecursiveLock* lock);
|
|
|
|
/**
|
|
* @brief Unlocks a recursive lock.
|
|
* @param lock Pointer to the lock.
|
|
*/
|
|
void RecursiveLock_Unlock(RecursiveLock* lock);
|