*/
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.
* @param lock Pointer to the 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.
* @param lock Pointer to the lock.
} 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)
{
s32 val;
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)
{
if (!--lock->counter)