diff --git a/libc/src/__support/threads/linux/mutex.h b/libc/src/__support/threads/linux/mutex.h index 6702de4651686..7b5d8766d3163 100644 --- a/libc/src/__support/threads/linux/mutex.h +++ b/libc/src/__support/threads/linux/mutex.h @@ -116,7 +116,26 @@ struct Mutex { } } - MutexError trylock(); + MutexError trylock() { + FutexWordType mutex_status = FutexWordType(LockState::Free); + FutexWordType locked_status = FutexWordType(LockState::Locked); + + if (futex_word.compare_exchange_strong(mutex_status, + FutexWordType(LockState::Locked))) { + return MutexError::NONE; + } + + switch (LockState(mutex_status)) { + case LockState::Locked: + if (recursive && this == owner) { + lock_count++; + } + return MutexError::NONE; + case LockState::Free: + // If it was LockState::Free, we shouldn't be here at all. + return MutexError::BAD_LOCK_STATE; + } + } }; } // namespace LIBC_NAMESPACE