ST / ST_Events-old

Dependents:   HelloWorld_CCA01M1 HelloWorld_CCA02M1 CI-data-logger-server HelloWorld_CCA02M1 ... more

This is a fork of the events subdirectory of https://github.com/ARMmbed/mbed-os.

Note, you must import this library with import name: events!!!

Revision:
8542:2e1ef628fbee
Parent:
201:dd058cec5f28
--- a/source/mbed_trace.c	Mon Oct 03 14:40:33 2016 +0300
+++ b/source/mbed_trace.c	Wed Oct 05 16:09:58 2016 +0300
@@ -454,10 +454,20 @@
 
 end:
     if ( m_trace.mutex_release_f ) {
-        while (m_trace.mutex_lock_count > 0) {
-            m_trace.mutex_lock_count--;
+        // Store the mutex lock count to temp variable so that it won't get
+        // clobbered during last loop iteration when mutex gets released
+        int count = m_trace.mutex_lock_count;
+        m_trace.mutex_lock_count = 0;
+        // Since the helper functions (eg. mbed_trace_array) are used like this:
+        //   mbed_tracef(TRACE_LEVEL_INFO, "grp", "%s", mbed_trace_array(some_array))
+        // The helper function MUST acquire the mutex if it modifies any buffers. However
+        // it CANNOT unlock the mutex because that would allow another thread to acquire
+        // the mutex after helper function unlocks it and before mbed_tracef acquires it
+        // for itself. This means that here we have to unlock the mutex as many times
+        // as it was acquired by trace function and any possible helper functions.
+        do {
             m_trace.mutex_release_f();
-        }
+        } while (--count > 0);
     }
 }
 static void mbed_trace_reset_tmp(void)