Add LightLock_TryLock and RecursiveLock_TryLock

This commit is contained in:
fincs 2015-11-21 11:48:20 +01:00
parent e554f11999
commit 9b57720cee
2 changed files with 42 additions and 0 deletions

View File

@ -75,6 +75,13 @@ void LightLock_Init(LightLock* lock);
*/ */
void LightLock_Lock(LightLock* lock); void LightLock_Lock(LightLock* lock);
/**
* @brief Attempts to lock a light lock.
* @param lock Pointer to the lock.
* @return Zero on success, non-zero on failure.
*/
int LightLock_TryLock(LightLock* lock);
/** /**
* @brief Unlocks a light lock. * @brief Unlocks a light lock.
* @param lock Pointer to the lock. * @param lock Pointer to the lock.
@ -93,6 +100,13 @@ void RecursiveLock_Init(RecursiveLock* lock);
*/ */
void RecursiveLock_Lock(RecursiveLock* lock); void RecursiveLock_Lock(RecursiveLock* lock);
/**
* @brief Attempts to lock a recursive lock.
* @param lock Pointer to the lock.
* @return Zero on success, non-zero on failure.
*/
int RecursiveLock_TryLock(RecursiveLock* lock);
/** /**
* @brief Unlocks a recursive lock. * @brief Unlocks a recursive lock.
* @param lock Pointer to the lock. * @param lock Pointer to the lock.

View File

@ -39,6 +39,21 @@ _begin:
} while (__strex(lock, -val)); } while (__strex(lock, -val));
} }
int LightLock_TryLock(LightLock* lock)
{
s32 val;
do
{
val = __ldrex(lock);
if (val < 0)
{
__clrex();
return 1; // Failure
}
} while (__strex(lock, -val));
return 0; // Success
}
void LightLock_Unlock(LightLock* lock) void LightLock_Unlock(LightLock* lock)
{ {
s32 val; s32 val;
@ -73,6 +88,19 @@ void RecursiveLock_Lock(RecursiveLock* lock)
lock->counter ++; lock->counter ++;
} }
int RecursiveLock_TryLock(RecursiveLock* lock)
{
u32 tag = (u32)getThreadLocalStorage();
if (lock->thread_tag != tag)
{
if (LightLock_TryLock(&lock->lock))
return 1; // Failure
lock->thread_tag = tag;
}
lock->counter ++;
return 0; // Success
}
void RecursiveLock_Unlock(RecursiveLock* lock) void RecursiveLock_Unlock(RecursiveLock* lock)
{ {
if (!--lock->counter) if (!--lock->counter)