Mutex Locker utility class to lock/unlock mbed RTOS mutexes. Create and pass a mutex, it locks the mutex then unlocks it when destroyed.

Dependents:   SmartLight HelloThreadsYo

Mutex Locker

This utility class is most useful when you have an activity that needs to be protected by a mutex that has multiple return points.

You would normally do this:

Using standard mutex access

Mutex myMutex;

void do_some_stuff()
{
  myMutex.lock();
  /* Do Stuff */

  if (condition) {
    myMutex.unlock();
    return 0;
  }

  /* Call other method */
  int temp = other_method();  // Temp so can unlock after function returns

  myMutex.unlock();
  return temp;
}

However, it's very easy to miss one of the unlock points which would later freeze the application.

Debugging this kind of error can be very hard.

The same example using MutexLocker:

Using a MutexLocker

Mutex myMutex;

int do_some_stuff()
{
  MutexLocker locker(myMutex);
  /* Do Stuff */

  if (condition) {
    return 0;
  }
  /* Call other method */
  return other_method();
  /* Mutex unlocks itself here */
}

No matter where or how your method returns, the mutex will always be unlocked as the MutexLocker goes out of scope.

Revision:
1:1a8b1de53954
Parent:
0:0714ae633eab
Child:
2:8bf85ca6ccee
--- a/mutexlocker.h	Thu Apr 10 21:59:11 2014 +0000
+++ b/mutexlocker.h	Thu Apr 10 22:06:40 2014 +0000
@@ -2,16 +2,21 @@
 
 #include "rtos.h"
 
+
+//! Lock/Unlokc Mutex using variable scope.
+//! Ensures always unlocked regardless of method exit
 class MutexLocker
 {
 public:
+    //! Lock the mutex
     MutexLocker(Mutex &mutex) :
-        m_mutex(&mutex) {
-        m_mutex->lock();
+        m_mutex(mutex) {
+        m_mutex.lock();
     }
+    //! Unlocks on destruction
     ~MutexLocker() {
-        m_mutex->unlock();
+        m_mutex.unlock();
     }
 private:
-    Mutex *m_mutex;
+    Mutex &m_mutex;
 };