1 /* ccapi/common/win/OldCC/autolock.hxx */ 2 /* 3 * Copyright (C) 1998 by Danilo Almeida. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in 14 * the documentation and/or other materials provided with the 15 * distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 20 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 21 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 28 * OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef __AUTOLOCK_HXX__ 32 #define __AUTOLOCK_HXX__ 33 34 #include <windows.h> 35 36 class CcOsLock { 37 CRITICAL_SECTION cs; 38 bool valid; 39 public: CcOsLock()40 CcOsLock() {InitializeCriticalSection(&cs); valid = true; } ~CcOsLock()41 ~CcOsLock() {DeleteCriticalSection(&cs); valid = false;} lock()42 void lock() {if (valid) EnterCriticalSection(&cs);} unlock()43 void unlock() {if (valid) LeaveCriticalSection(&cs);} trylock()44 bool trylock() {return valid ? (TryEnterCriticalSection(&cs) ? true : false) 45 : false; } 46 }; 47 48 class CcAutoLock { 49 CcOsLock& m_lock; 50 public: Start(CcAutoLock * & a,CcOsLock & lock)51 static void Start(CcAutoLock*& a, CcOsLock& lock) { a = new CcAutoLock(lock); }; Stop(CcAutoLock * & a)52 static void Stop (CcAutoLock*& a) { delete a; a = 0; }; CcAutoLock(CcOsLock & lock)53 CcAutoLock(CcOsLock& lock):m_lock(lock) { m_lock.lock(); } ~CcAutoLock()54 ~CcAutoLock() { m_lock.unlock(); } 55 }; 56 57 class CcAutoTryLock { 58 CcOsLock& m_lock; 59 bool m_locked; 60 public: CcAutoTryLock(CcOsLock & lock)61 CcAutoTryLock(CcOsLock& lock):m_lock(lock) { m_locked = m_lock.trylock(); } ~CcAutoTryLock()62 ~CcAutoTryLock() { if (m_locked) m_lock.unlock(); m_locked = false; } IsLocked() const63 bool IsLocked() const { return m_locked; } 64 }; 65 66 #endif /* __AUTOLOCK_HXX */ 67