Sfoglia il codice sorgente

LibC: Move the __pthread_mutex_trylock function to LibC

Let's move this to LibC because the dynamic loader depends
on this function.
Gunnar Beutner 4 anni fa
parent
commit
549d9bd3ea

+ 1 - 0
Userland/Libraries/LibC/bits/pthread_integration.h

@@ -19,6 +19,7 @@ void __pthread_fork_atfork_register_parent(void (*)(void));
 void __pthread_fork_atfork_register_child(void (*)(void));
 
 int __pthread_mutex_lock(pthread_mutex_t*);
+int __pthread_mutex_trylock(pthread_mutex_t*);
 int __pthread_mutex_unlock(pthread_mutex_t*);
 int __pthread_mutex_init(pthread_mutex_t*, const pthread_mutexattr_t*);
 

+ 18 - 0
Userland/Libraries/LibC/pthread_integration.cpp

@@ -125,6 +125,24 @@ int __pthread_mutex_unlock(pthread_mutex_t* mutex)
 
 int pthread_mutex_unlock(pthread_mutex_t*) __attribute__((weak, alias("__pthread_mutex_unlock")));
 
+int __pthread_mutex_trylock(pthread_mutex_t* mutex)
+{
+    auto& atomic = reinterpret_cast<Atomic<u32>&>(mutex->lock);
+    u32 expected = false;
+    if (!atomic.compare_exchange_strong(expected, true, AK::memory_order_acq_rel)) {
+        if (mutex->type == __PTHREAD_MUTEX_RECURSIVE && mutex->owner == pthread_self()) {
+            mutex->level++;
+            return 0;
+        }
+        return EBUSY;
+    }
+    mutex->owner = pthread_self();
+    mutex->level = 0;
+    return 0;
+}
+
+int pthread_mutex_trylock(pthread_mutex_t* mutex) __attribute__((weak, alias("__pthread_mutex_trylock")));
+
 int __pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attributes)
 {
     mutex->lock = 0;

+ 1 - 12
Userland/Libraries/LibPthread/pthread.cpp

@@ -167,18 +167,7 @@ int pthread_mutex_lock(pthread_mutex_t* mutex)
 
 int pthread_mutex_trylock(pthread_mutex_t* mutex)
 {
-    auto& atomic = reinterpret_cast<Atomic<u32>&>(mutex->lock);
-    u32 expected = false;
-    if (!atomic.compare_exchange_strong(expected, true, AK::memory_order_acq_rel)) {
-        if (mutex->type == PTHREAD_MUTEX_RECURSIVE && mutex->owner == pthread_self()) {
-            mutex->level++;
-            return 0;
-        }
-        return EBUSY;
-    }
-    mutex->owner = pthread_self();
-    mutex->level = 0;
-    return 0;
+    return __pthread_mutex_trylock(mutex);
 }
 
 int pthread_mutex_unlock(pthread_mutex_t* mutex)