00001 // @(#)root/gl:$Id: TGLLockable.h 32465 2010-03-04 20:29:52Z matevz $ 00002 // Author: Matevz Tadel, Feb 2007 00003 00004 /************************************************************************* 00005 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. * 00006 * All rights reserved. * 00007 * * 00008 * For the licensing terms see $ROOTSYS/LICENSE. * 00009 * For the list of contributors see $ROOTSYS/README/CREDITS. * 00010 *************************************************************************/ 00011 00012 #ifndef ROOT_TGLLockable_H 00013 #define ROOT_TGLLockable_H 00014 00015 #include <Rtypes.h> 00016 00017 class TGLLockable 00018 { 00019 public: 00020 enum ELock { kUnlocked, // Unlocked 00021 kDrawLock, // Locked for draw, cannot select or modify 00022 kSelectLock, // Locked for select, cannot modify (draw part of select) 00023 kModifyLock // Locked for modify, cannot draw or select 00024 }; 00025 00026 private: 00027 TGLLockable(const TGLLockable&); // Not implemented 00028 TGLLockable& operator=(const TGLLockable&); // Not implemented 00029 00030 protected: 00031 // Locking - can take/release via const handle 00032 mutable ELock fLock; // Lock state. 00033 00034 // Ensures unlocking in view of exceptions. 00035 class TUnlocker 00036 { 00037 private: 00038 TUnlocker(const TUnlocker&); // Not implemented 00039 TUnlocker& operator=(const TUnlocker&); // Not implemented 00040 00041 const TGLLockable *fLockable; 00042 00043 public: 00044 TUnlocker(const TGLLockable* l) : fLockable(l) {} 00045 ~TUnlocker() 00046 { 00047 if (fLockable->IsLocked()) 00048 fLockable->ReleaseLock(fLockable->CurrentLock()); 00049 } 00050 }; 00051 00052 public: 00053 TGLLockable(); 00054 virtual ~TGLLockable() {} 00055 00056 virtual const char* LockIdStr() const { return "<unknown>"; } 00057 00058 Bool_t TakeLock(ELock lock) const; 00059 Bool_t ReleaseLock(ELock lock) const; 00060 Bool_t IsLocked() const { return (fLock != kUnlocked); } 00061 ELock CurrentLock() const { return fLock; } 00062 00063 Bool_t IsDrawOrSelectLock() const { return fLock == kDrawLock || fLock == kSelectLock; } 00064 00065 static const char * LockName(ELock lock); 00066 static Bool_t LockValid(ELock lock); 00067 00068 ClassDef(TGLLockable, 0); // Lock for viewers and scenes. 00069 }; // endclass TGLLockable 00070 00071 #endif