IOT-1828 Fix oc_mutex_assert_owner bug 57/19857/3
authorWay Vadhanasin <wayvad@microsoft.com>
Thu, 27 Apr 2017 17:12:45 +0000 (10:12 -0700)
committerRandeep Singh <randeep.s@samsung.com>
Mon, 22 May 2017 11:47:50 +0000 (11:47 +0000)
When a mutex goes through the condition variable wait API, there is a
bug that causes oc_mutex_assert_owner to fail. This patch fixes that
bug.

Change-Id: I0d60188af9bce866f5ba18800292204c78daba12
Signed-off-by: Way Vadhanasin <wayvad@microsoft.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/19373
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
Reviewed-by: Dan Mihai <Daniel.Mihai@microsoft.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/19857
Reviewed-by: Kevin Kane <kkane@microsoft.com>
Reviewed-by: Dmitriy Zhuravlev <d.zhuravlev@samsung.com>
Reviewed-by: Oleksii Beketov <ol.beketov@samsung.com>
Reviewed-by: Randeep Singh <randeep.s@samsung.com>
resource/c_common/octhread/src/posix/octhread.c
resource/c_common/octhread/src/windows/octhread.c

index 4440820..f69a0d5 100644 (file)
@@ -491,8 +491,16 @@ OCWaitResult_t oc_cond_wait_for(oc_cond cond, oc_mutex mutex, uint64_t microseco
              abstime = oc_get_current_time();
             oc_add_microseconds_to_timespec(&abstime, microseconds);
 
-            //Wait for the given time
+            // Wait for the given time
+#ifndef NDEBUG
+            // The conditional variable wait API used will atomically release the mutex, but the
+            // best we can do here is to just clear the owner info before the API is called.
+            mutexInfo->owner = OC_INVALID_THREAD_ID;
+#endif
             ret = pthread_cond_timedwait(&(eventInfo->cond), &(mutexInfo->mutex), &abstime);
+#ifndef NDEBUG
+            mutexInfo->owner = oc_get_current_thread_id();
+#endif
         }
 
         switch (ret)
@@ -517,8 +525,16 @@ OCWaitResult_t oc_cond_wait_for(oc_cond cond, oc_mutex mutex, uint64_t microseco
     else
     {
         // Wait forever
+#ifndef NDEBUG
+        // The conditional variable wait API used will atomically release the mutex, but the
+        // best we can do here is to just clear the owner info before the API is called.
+        mutexInfo->owner = OC_INVALID_THREAD_ID;
+#endif
         int ret = pthread_cond_wait(&eventInfo->cond, &mutexInfo->mutex);
-        retVal = ret == 0 ? OC_WAIT_SUCCESS : OC_WAIT_INVAL;
+        retVal = (ret == 0) ? OC_WAIT_SUCCESS : OC_WAIT_INVAL;
+#ifndef NDEBUG
+        mutexInfo->owner = oc_get_current_thread_id();
+#endif
     }
     return retVal;
 }
index bc580ea..656ae40 100644 (file)
@@ -321,6 +321,12 @@ OCWaitResult_t oc_cond_wait_for(oc_cond cond, oc_mutex mutex, uint64_t microseco
         milli = INFINITE;
     }
 
+#ifndef NDEBUG
+    // The conditional variable wait API used will atomically release the mutex, but the
+    // best we can do here is to just clear the owner info before the API is called.
+    mutexInfo->owner = OC_INVALID_THREAD_ID;
+#endif
+
     // Wait for the given time        
     if (!SleepConditionVariableCS(&eventInfo->cond, &mutexInfo->mutex, milli))
     {
@@ -339,6 +345,10 @@ OCWaitResult_t oc_cond_wait_for(oc_cond cond, oc_mutex mutex, uint64_t microseco
         retVal = OC_WAIT_SUCCESS;
     }
 
+#ifndef NDEBUG
+    mutexInfo->owner = oc_get_current_thread_id();
+#endif
+
     return retVal;
 }