/*
 * cci_mutex.h
 *
 *  Created on: Nov 7, 2012
 *      Author: siwankim
 */

#ifndef CCI_MUTEX_H_
#define CCI_MUTEX_H_

#include "porting.h"

namespace cci
{
  class _Mutex
  {
  private:
    pthread_mutex_t mutex;

  public:
    _Mutex ()
    {
      pthread_mutex_init (&mutex, NULL);
    }

     ~_Mutex ()
    {
      pthread_mutex_destroy (&mutex);
    }

    int lock ()
    {
      return pthread_mutex_lock (&mutex);
    }

    int unlock ()
    {
      return pthread_mutex_unlock (&mutex);
    }
  };

  class _MutexAutolock
  {
  public:
    explicit _MutexAutolock(_Mutex *mutex) :
      mutex(mutex), is_unlocked(true)
    {
      mutex->lock();
    }

    virtual ~_MutexAutolock()
    {
      unlock();
    }

    void unlock()
    {
      if (is_unlocked)
        {
          is_unlocked = false;
          mutex->unlock();
        }
    }

  private:
    _Mutex *mutex;
    bool is_unlocked;

    _MutexAutolock(const _MutexAutolock &);
    void operator=(const _MutexAutolock &);
  };
}


#endif /* CCI_MUTEX_H_ */
