TGLLockable.h

Go to the documentation of this file.
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

Generated on Tue Jul 5 14:16:47 2011 for ROOT_528-00b_version by  doxygen 1.5.1