00001 /* 00002 * The Mana World 00003 * Copyright (C) 2008 The Mana World Development Team 00004 * 00005 * This file is part of The Mana World. 00006 * 00007 * This program is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 2 of the License, or 00010 * any later version. 00011 * 00012 * This program is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with this program; if not, write to the Free Software 00019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00020 */ 00021 00022 #ifndef MUTEX_H 00023 #define MUTEX_H 00024 00025 #include "log.h" 00026 00027 #include <SDL_thread.h> 00028 00033 class Mutex 00034 { 00035 public: 00036 Mutex(); 00037 ~Mutex(); 00038 00039 void lock(); 00040 void unlock(); 00041 00042 private: 00043 Mutex(const Mutex&); // prevent copying 00044 Mutex& operator=(const Mutex&); 00045 00046 SDL_mutex *mMutex; 00047 }; 00048 00052 class MutexLocker 00053 { 00054 public: 00055 MutexLocker(Mutex *mutex); 00056 ~MutexLocker(); 00057 00058 private: 00059 Mutex *mMutex; 00060 }; 00061 00062 00063 inline Mutex::Mutex() 00064 { 00065 mMutex = SDL_CreateMutex(); 00066 } 00067 00068 inline Mutex::~Mutex() 00069 { 00070 SDL_DestroyMutex(mMutex); 00071 } 00072 00073 inline void Mutex::lock() 00074 { 00075 if (SDL_mutexP(mMutex) == -1) 00076 logger->log("Mutex locking failed: %s", SDL_GetError()); 00077 } 00078 00079 inline void Mutex::unlock() 00080 { 00081 if (SDL_mutexV(mMutex) == -1) 00082 logger->log("Mutex unlocking failed: %s", SDL_GetError()); 00083 } 00084 00085 00086 inline MutexLocker::MutexLocker(Mutex *mutex): 00087 mMutex(mutex) 00088 { 00089 mMutex->lock(); 00090 } 00091 00092 inline MutexLocker::~MutexLocker() 00093 { 00094 mMutex->unlock(); 00095 } 00096 00097 #endif // MUTEX_H