/*
 *  Mutex.cpp
 *  iphone-gl-app
 *
 *  Created by John Ryland on 25/06/09.
 *  Copyright 2009 InvertedLogic. All rights reserved.
 *
 */

#include <pthread.h>
#include "Mutex.h"


struct MutexPrivate
{
	pthread_mutex_t	mutex;
};


Mutex::MutexAutoLock::MutexAutoLock(Mutex *mutex) : autoLockMutex(mutex)
{
	MutexPrivate *d = (MutexPrivate *)autoLockMutex->dptr;
	pthread_mutex_lock(&d->mutex);
}


Mutex::MutexAutoLock::~MutexAutoLock()
{
	MutexPrivate *d = (MutexPrivate *)autoLockMutex->dptr;
	pthread_mutex_unlock(&d->mutex);
}


Mutex::Mutex()
{
	pthread_mutex_t mutexInit = PTHREAD_MUTEX_INITIALIZER;
	MutexPrivate *d = new MutexPrivate;
	d->mutex = mutexInit;
	pthread_mutex_init(&d->mutex, NULL);
	dptr = (void *)d;
}


Mutex::~Mutex()
{
	MutexPrivate *d = (MutexPrivate *)dptr;
	pthread_mutex_destroy(&d->mutex);
	delete d;
}


Mutex::MutexAutoLock Mutex::lock()
{
	return Mutex::MutexAutoLock(this);
}

