[libc-commits] [libc] [libc] implement pthread_mutex_trylock (PR #93359)

Nhat Nguyen via libc-commits libc-commits at lists.llvm.org
Fri May 24 17:55:57 PDT 2024


https://github.com/changkhothuychung updated https://github.com/llvm/llvm-project/pull/93359

>From 2e257d35d0da487b738c6e8f877df36470ea63cc Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Fri, 24 May 2024 20:30:13 -0400
Subject: [PATCH 1/2] init attempt

---
 libc/src/__support/threads/linux/mutex.h | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/libc/src/__support/threads/linux/mutex.h b/libc/src/__support/threads/linux/mutex.h
index 6702de4651686..c7f9b4f320dc3 100644
--- a/libc/src/__support/threads/linux/mutex.h
+++ b/libc/src/__support/threads/linux/mutex.h
@@ -116,7 +116,27 @@ 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

>From 58e693b227f8d6a5ae5aafe2f3b7ec3d2e15c060 Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Fri, 24 May 2024 20:55:44 -0400
Subject: [PATCH 2/2] return

---
 libc/src/__support/threads/linux/mutex.h | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/libc/src/__support/threads/linux/mutex.h b/libc/src/__support/threads/linux/mutex.h
index c7f9b4f320dc3..7b5d8766d3163 100644
--- a/libc/src/__support/threads/linux/mutex.h
+++ b/libc/src/__support/threads/linux/mutex.h
@@ -129,9 +129,8 @@ struct Mutex {
     case LockState::Locked:
       if (recursive && this == owner) {
         lock_count++;
-        return MutexError::NONE;
       }
-
+      return MutexError::NONE;
     case LockState::Free:
       // If it was LockState::Free, we shouldn't be here at all.
       return MutexError::BAD_LOCK_STATE;



More information about the libc-commits mailing list