jmutex.cpp 2.77 KB
/***************************************************************************
 *   Copyright (C) 2005 by Jeff Ferr                                       *
 *   root@sat                                                              *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include "jmutex.h"
#include "jmutexexception.h"

#include <errno.h>
#include <pthread.h>

namespace jthread {

Mutex::Mutex(MUTEXTYPE type_)
{
/*
	pthread_mutexattr_t mutex;
    
	pthread_mutexattr_init(&mutex);
    
	if (type_ == FAST_MUTEX) {
		pthread_mutexattr_settype(&mutex, PTHREAD_MUTEX_NORMAL);
	} else if (type_ == RECURSIVE_MUTEX) {
		pthread_mutexattr_settype(&mutex, PTHREAD_MUTEX_RECURSIVE);
	} else if (type_ == ERROR_CHECK_MUTEX) {
		pthread_mutexattr_settype(&mutex, PTHREAD_MUTEX_ERRORCHECK);
	}
*/

	pthread_mutex_init(&_mutex, NULL);
}

Mutex::~Mutex()
{
	/*
	while (pthread_mutex_destroy(&_mutex) == EBUSY) {
		Lock();
		Unlock();
	}
	*/

	pthread_mutex_destroy(&_mutex);
}

void Mutex::Lock()
{
	if (pthread_mutex_lock(&_mutex)) {
/*
		if (errno == EDEADLK) {
			throw MutexException("Error check monitor, calling thread has a ... !");
		} else {
			throw MutexException("Unknown monitor error !");
		}
*/
	}
}

void Mutex::Unlock()
{
	if (pthread_mutex_unlock(&_mutex) != 0) {
		if (errno == EPERM) {
			throw MutexException("Error check monitor, calling thread does ... !");
		} else {
			throw MutexException("Unknown monitor error !");
		}
	}
}

bool Mutex::TryLock()
{
	if (pthread_mutex_trylock(&_mutex) != 0) {
		if (errno == EBUSY) {
			return false;
		} else {
			throw MutexException("Unknown monitor error !");
		}
	}
    
	return true;
}

};