OSDN Git Service

Remove harmful attempts to be helpful in pthread_mutex functions.
authorElliott Hughes <enh@google.com>
Wed, 11 Dec 2013 22:54:00 +0000 (14:54 -0800)
committerElliott Hughes <enh@google.com>
Wed, 11 Dec 2013 22:54:00 +0000 (14:54 -0800)
Most callers won't check for EINVAL, so it's best to fail early.
GCC takes the nonnull attribute as a guarantee that an argument
won't be NULL, so these hacks were already ineffective, which is
how we found that at least one commercial game was using NULL
as if it's a mutex, but actually getting no-op behavior.

Bug: 11971278
Change-Id: I89646e043d931778805a8b692e07a34d076ee6bf

libc/bionic/pthread_mutex.cpp

index 1010f11..8eaf95f 100644 (file)
@@ -282,21 +282,16 @@ int pthread_mutexattr_getpshared(const pthread_mutexattr_t* attr, int* pshared)
     return 0;
 }
 
-int pthread_mutex_init(pthread_mutex_t *mutex,
-                       const pthread_mutexattr_t *attr)
-{
-    int value = 0;
-
-    if (mutex == NULL)
-        return EINVAL;
-
+int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr) {
     if (__predict_true(attr == NULL)) {
         mutex->value = MUTEX_TYPE_BITS_NORMAL;
         return 0;
     }
 
-    if ((*attr & MUTEXATTR_SHARED_MASK) != 0)
+    int value = 0;
+    if ((*attr & MUTEXATTR_SHARED_MASK) != 0) {
         value |= MUTEX_SHARED_MASK;
+    }
 
     switch (*attr & MUTEXATTR_TYPE_MASK) {
     case PTHREAD_MUTEX_NORMAL:
@@ -473,9 +468,6 @@ int pthread_mutex_lock_impl(pthread_mutex_t *mutex)
 {
     int mvalue, mtype, tid, shared;
 
-    if (__predict_false(mutex == NULL))
-        return EINVAL;
-
     mvalue = mutex->value;
     mtype = (mvalue & MUTEX_TYPE_MASK);
     shared = (mvalue & MUTEX_SHARED_MASK);
@@ -565,9 +557,6 @@ int pthread_mutex_unlock_impl(pthread_mutex_t *mutex)
 {
     int mvalue, mtype, tid, shared;
 
-    if (__predict_false(mutex == NULL))
-        return EINVAL;
-
     mvalue = mutex->value;
     mtype  = (mvalue & MUTEX_TYPE_MASK);
     shared = (mvalue & MUTEX_SHARED_MASK);
@@ -630,9 +619,6 @@ int pthread_mutex_trylock_impl(pthread_mutex_t *mutex)
 {
     int mvalue, mtype, tid, shared;
 
-    if (__predict_false(mutex == NULL))
-        return EINVAL;
-
     mvalue = mutex->value;
     mtype  = (mvalue & MUTEX_TYPE_MASK);
     shared = (mvalue & MUTEX_SHARED_MASK);
@@ -705,9 +691,6 @@ int pthread_mutex_lock_timeout_np_impl(pthread_mutex_t *mutex, unsigned msecs)
     /* compute absolute expiration time */
     __timespec_to_relative_msec(&abstime, msecs, clock);
 
-    if (__predict_false(mutex == NULL))
-        return EINVAL;
-
     mvalue = mutex->value;
     mtype  = (mvalue & MUTEX_TYPE_MASK);
     shared = (mvalue & MUTEX_SHARED_MASK);