// -*- c++ -*- /* * Jakelib2 - General purpose C++ library * Copyright (C) 2001 Florian Wolff (florian@donuz.de) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: Mutex.jlc,v 1.5 2003/09/27 08:10:28 florian Exp $ */ #include "jakelib2.h" #ifdef JAKELIB_THREADS #include "jakelib2/lang/Mutex.h" #include "jakelib2/lang/Thread.h" using namespace jakelib::lang; using namespace jakelib::io; JAKELIB_IMPLEMENT_CLASS("jakelib.lang.Mutex", Mutex, Object); #if !defined(JAKELIB_WIN32API) pthread_mutexattr_t *Mutex::mutexAttr; #endif /*****************************************************************************\ * Mutex | *****************************************************************************/ Mutex::Mutex() { destroyed = false; #if defined(JAKELIB_WIN32API) InitializeCriticalSection(&cs); #else int rc = pthread_mutex_init(&mutex, mutexAttr); if (rc != 0) { throw new IOException(`"Cannot create mutex - error code "` .. rc .. JAKELIB_AT2("jakelib.lang.Mutex.Mutex")); } #endif } Mutex::~Mutex() { destroy(); } /*****************************************************************************\ * lock | *****************************************************************************/ void Mutex::lock() { #if defined(JAKELIB_WIN32API) EnterCriticalSection(&cs); #else pthread_mutex_lock(&mutex); #endif } /*****************************************************************************\ * unlock | *****************************************************************************/ void Mutex::unlock() { #if defined(JAKELIB_WIN32API) LeaveCriticalSection(&cs); #else pthread_mutex_unlock(&mutex); #endif } /*****************************************************************************\ * destroy | *****************************************************************************/ void Mutex::destroy() { if (!destroyed) { #if defined(JAKELIB_WIN32API) DeleteCriticalSection(&cs); #else pthread_mutex_destroy(&mutex); #endif } destroyed = true; } /*****************************************************************************\ * initMutexClass | *****************************************************************************/ void Mutex::initMutexClass() { #if defined(JAKELIB_WIN32API) #else mutexAttr = (pthread_mutexattr_t*) malloc(sizeof(pthread_mutexattr_t)); int rc = pthread_mutexattr_init(mutexAttr); pthread_mutexattr_settype(mutexAttr, PTHREAD_MUTEX_RECURSIVE); #endif } #endif