![]() |
Main Page Class Hierarchy Alphabetical List Compound List File List Compound Members
|
00001 /******************************************************************************** 00002 * * 00003 * R e a d - W r i t e L o c k C l a s s * 00004 * * 00005 ********************************************************************************* 00006 * Copyright (C) 2004,2012 by Jeroen van der Zijp. All Rights Reserved. * 00007 ********************************************************************************* 00008 * This library is free software; you can redistribute it and/or modify * 00009 * it under the terms of the GNU Lesser General Public License as published by * 00010 * the Free Software Foundation; either version 3 of the License, or * 00011 * (at your option) any later version. * 00012 * * 00013 * This library is distributed in the hope that it will be useful, * 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00016 * GNU Lesser General Public License for more details. * 00017 * * 00018 * You should have received a copy of the GNU Lesser General Public License * 00019 * along with this program. If not, see <http://www.gnu.org/licenses/> * 00020 ********************************************************************************/ 00021 #ifndef FXREADWRITELOCK_H 00022 #define FXREADWRITELOCK_H 00023 00024 00025 namespace FX { 00026 00027 00038 class FXAPI FXReadWriteLock { 00039 private: 00040 volatile FXuval data[32]; 00041 private: 00042 FXReadWriteLock(const FXReadWriteLock&); 00043 FXReadWriteLock &operator=(const FXReadWriteLock&); 00044 public: 00045 00047 FXReadWriteLock(); 00048 00050 void readLock(); 00051 00053 FXbool tryReadLock(); 00054 00056 void readUnlock(); 00057 00059 FXbool readLocked(); 00060 00062 void writeLock(); 00063 00065 FXbool tryWriteLock(); 00066 00068 void writeUnlock(); 00069 00071 FXbool writeLocked(); 00072 00074 ~FXReadWriteLock(); 00075 }; 00076 00077 00079 class FXAPI FXScopedReadLock { 00080 private: 00081 FXReadWriteLock& rwlock; 00082 private: 00083 FXScopedReadLock(); 00084 FXScopedReadLock(const FXScopedReadLock&); 00085 FXScopedReadLock& operator=(const FXScopedReadLock&); 00086 public: 00087 00089 FXScopedReadLock(FXReadWriteLock& rwl):rwlock(rwl){ lock(); } 00090 00092 FXReadWriteLock& readwritelock(){ return rwlock; } 00093 00095 void lock(){ rwlock.readLock(); } 00096 00098 FXbool trylock(){ return rwlock.tryReadLock(); } 00099 00101 FXbool locked(){ return rwlock.readLocked(); } 00102 00104 void unlock(){ rwlock.readUnlock(); } 00105 00107 ~FXScopedReadLock(){ unlock(); } 00108 }; 00109 00110 00111 00113 class FXAPI FXScopedWriteLock { 00114 private: 00115 FXReadWriteLock& rwlock; 00116 private: 00117 FXScopedWriteLock(); 00118 FXScopedWriteLock(const FXScopedWriteLock&); 00119 FXScopedWriteLock& operator=(const FXScopedWriteLock&); 00120 public: 00121 00123 FXScopedWriteLock(FXReadWriteLock& rwl):rwlock(rwl){ lock(); } 00124 00126 FXReadWriteLock& readwritelock(){ return rwlock; } 00127 00129 void lock(){ rwlock.writeLock(); } 00130 00132 FXbool trylock(){ return rwlock.tryWriteLock(); } 00133 00135 FXbool locked(){ return rwlock.writeLocked(); } 00136 00138 void unlock(){ rwlock.writeUnlock(); } 00139 00141 ~FXScopedWriteLock(){ unlock(); } 00142 }; 00143 00144 } 00145 00146 #endif 00147
|
|