00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkThreadedController.h,v $ 00005 Language: C++ 00006 00007 Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 00008 All rights reserved. 00009 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00010 00011 This software is distributed WITHOUT ANY WARRANTY; without even 00012 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00013 PURPOSE. See the above copyright notice for more information. 00014 00015 =========================================================================*/ 00047 #ifndef __vtkThreadedController_h 00048 #define __vtkThreadedController_h 00049 00050 #include "vtkMultiProcessController.h" 00051 #include "vtkCriticalSection.h" // For vtkSimpleCriticalSection 00052 00053 class vtkMultiThreader; 00054 00055 class VTK_PARALLEL_EXPORT vtkThreadedController : public vtkMultiProcessController 00056 { 00057 public: 00058 static vtkThreadedController *New(); 00059 vtkTypeRevisionMacro(vtkThreadedController,vtkMultiProcessController); 00060 void PrintSelf(ostream& os, vtkIndent indent); 00061 00063 00064 virtual void Initialize(int* argc, char*** argv, int) 00065 { this->Initialize(argc, argv); } 00066 virtual void Initialize(int* argc, char*** argv); 00067 virtual void Finalize(); 00068 virtual void Finalize(int) {this->Finalize();} 00070 00072 00077 vtkGetMacro(LocalProcessId, int); 00079 00083 virtual void SingleMethodExecute(); 00084 00088 virtual void MultipleMethodExecute(); 00089 00091 virtual void Barrier(); 00092 00095 virtual void CreateOutputWindow(); 00096 00097 protected: 00098 vtkThreadedController(); 00099 ~vtkThreadedController(); 00100 00101 void CreateProcessControllers(); 00102 00104 void Start(int threadIdx); 00105 00106 void ResetControllers(); 00107 00108 static VTK_THREAD_RETURN_TYPE vtkThreadedControllerStart( void *arg ); 00109 00110 // Each Process/Thread has its own controller. 00111 vtkThreadedController** Controllers; 00112 00113 //BTX 00114 00115 // Required only for static access to threadId (GetLocalController). 00116 #ifdef VTK_USE_PTHREADS 00117 typedef pthread_t ThreadIdType; 00118 #elif defined VTK_USE_SPROC 00119 typedef pid_t ThreadIdType; 00120 #elif defined VTK_USE_WIN32_THREADS 00121 typedef DWORD ThreadIdType; 00122 #else 00123 typedef int ThreadIdType; 00124 #endif 00125 00126 //ETX 00127 00128 // Used in barrier 00129 static vtkSimpleCriticalSection CounterLock; 00130 static int Counter; 00131 static int IsBarrierInProgress; 00132 static void WaitForPreviousBarrierToEnd(); 00133 static void BarrierStarted(); 00134 static void BarrierEnded(); 00135 static void SignalNextThread(); 00136 static void InitializeBarrier(); 00137 static void WaitForNextThread(); 00138 #ifdef VTK_USE_WIN32_THREADS 00139 static HANDLE BarrierEndedEvent; 00140 static HANDLE NextThread; 00141 #else 00142 static vtkSimpleCriticalSection* BarrierLock; 00143 static vtkSimpleCriticalSection* BarrierInProgress; 00144 #endif 00145 00146 ThreadIdType ThreadId; 00147 00148 int LastNumberOfProcesses; 00149 00150 vtkMultiThreader *MultiThreader; 00151 // Used internally to switch between multiple and single method execution. 00152 int MultipleMethodFlag; 00153 00154 // For static GetGlobalController. Translates controller for thread0 00155 // to controller for local thread. 00156 vtkMultiProcessController *GetLocalController(); 00157 00158 private: 00159 vtkThreadedController(const vtkThreadedController&); // Not implemented. 00160 void operator=(const vtkThreadedController&); // Not implemented. 00161 }; 00162 00163 #endif 00164 00165