VTK
dox/Common/vtkCriticalSection.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkCriticalSection.h
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00035 #ifndef __vtkCriticalSection_h
00036 #define __vtkCriticalSection_h
00037 
00038 #include "vtkObject.h"
00039 
00040 //BTX
00041 
00042 #ifdef VTK_USE_SPROC
00043 #include <abi_mutex.h> // Needed for sproc implementation of mutex
00044 typedef abilock_t vtkCritSecType;
00045 #endif
00046 
00047 #if defined(VTK_USE_PTHREADS) || defined(VTK_HP_PTHREADS)
00048 #include <pthread.h> // Needed for pthreads implementation of mutex
00049 typedef pthread_mutex_t vtkCritSecType;
00050 #endif
00051 
00052 #ifdef VTK_USE_WIN32_THREADS
00053 # include "vtkWindows.h" // Needed for win32 implementation of mutex
00054 typedef CRITICAL_SECTION vtkCritSecType;
00055 #endif
00056 
00057 #ifndef VTK_USE_SPROC
00058 #ifndef VTK_USE_PTHREADS
00059 #ifndef VTK_USE_WIN32_THREADS
00060 typedef int vtkCritSecType;
00061 #endif
00062 #endif
00063 #endif
00064 
00065 // Critical Section object that is not a vtkObject.
00066 class VTK_COMMON_EXPORT vtkSimpleCriticalSection
00067 {
00068 public:
00069   // Default cstor
00070   vtkSimpleCriticalSection()
00071     {
00072     this->Init();
00073     }
00074   // Construct object locked if isLocked is different from 0
00075   vtkSimpleCriticalSection(int isLocked)
00076     {
00077     this->Init();
00078     if(isLocked)
00079       {
00080       this->Lock();
00081       }
00082     }
00083   // Destructor
00084   virtual ~vtkSimpleCriticalSection();
00085 
00086   // Default vtkObject API
00087   static vtkSimpleCriticalSection *New();
00088   void Delete()
00089     {
00090     delete this;
00091     }
00092 
00093   void Init();
00094 
00096   void Lock();
00097 
00099   void Unlock();
00100 
00101 protected:
00102   vtkCritSecType   CritSec;
00103 };
00104 
00105 //ETX
00106 
00107 class VTK_COMMON_EXPORT vtkCriticalSection : public vtkObject
00108 {
00109 public:
00110   static vtkCriticalSection *New();
00111 
00112   vtkTypeMacro(vtkCriticalSection,vtkObject);
00113   void PrintSelf(ostream& os, vtkIndent indent);
00114   
00116   void Lock();
00117 
00119   void Unlock();
00120 
00121 protected:
00122   vtkSimpleCriticalSection SimpleCriticalSection;
00123   vtkCriticalSection() {}
00124   ~vtkCriticalSection() {}
00125 
00126 private:
00127   vtkCriticalSection(const vtkCriticalSection&);  // Not implemented.
00128   void operator=(const vtkCriticalSection&);  // Not implemented.
00129 };
00130 
00131 
00132 inline void vtkCriticalSection::Lock()
00133 {
00134   this->SimpleCriticalSection.Lock();
00135 }
00136 
00137 inline void vtkCriticalSection::Unlock()
00138 {
00139   this->SimpleCriticalSection.Unlock();
00140 }
00141 
00142 #endif