vtkThreadedController.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00036 #ifndef __vtkThreadedController_h
00037 #define __vtkThreadedController_h
00038
00039 #include "vtkMultiProcessController.h"
00040 #include "vtkCriticalSection.h"
00041
00042 class vtkMultiThreader;
00043
00044 class VTK_PARALLEL_EXPORT vtkThreadedController : public vtkMultiProcessController
00045 {
00046 public:
00047 static vtkThreadedController *New();
00048 vtkTypeRevisionMacro(vtkThreadedController,vtkMultiProcessController);
00049 void PrintSelf(ostream& os, vtkIndent indent);
00050
00052
00053 virtual void Initialize(int* argc, char*** argv, int)
00054 { this->Initialize(argc, argv); }
00055 virtual void Initialize(int* argc, char*** argv);
00056 virtual void Finalize();
00057 virtual void Finalize(int) {this->Finalize();}
00059
00061
00066 vtkGetMacro(LocalProcessId, int);
00068
00072 virtual void SingleMethodExecute();
00073
00077 virtual void MultipleMethodExecute();
00078
00080 virtual void Barrier();
00081
00084 virtual void CreateOutputWindow();
00085
00086 protected:
00087 vtkThreadedController();
00088 ~vtkThreadedController();
00089
00090 void CreateProcessControllers();
00091
00093 void Start(int threadIdx);
00094
00095 void ResetControllers();
00096
00097 static VTK_THREAD_RETURN_TYPE vtkThreadedControllerStart( void *arg );
00098
00099
00100 vtkThreadedController** Controllers;
00101
00102
00103
00104
00105 #ifdef VTK_USE_PTHREADS
00106 typedef pthread_t ThreadIdType;
00107 #elif defined VTK_USE_SPROC
00108 typedef pid_t ThreadIdType;
00109 #elif defined VTK_USE_WIN32_THREADS
00110 typedef DWORD ThreadIdType;
00111 #else
00112 typedef int ThreadIdType;
00113 #endif
00114
00115
00116
00117
00118 static vtkSimpleCriticalSection CounterLock;
00119 static int Counter;
00120 static int IsBarrierInProgress;
00121 static void WaitForPreviousBarrierToEnd();
00122 static void BarrierStarted();
00123 static void BarrierEnded();
00124 static void SignalNextThread();
00125 static void InitializeBarrier();
00126 static void WaitForNextThread();
00127 #ifdef VTK_USE_WIN32_THREADS
00128 static HANDLE BarrierEndedEvent;
00129 static HANDLE NextThread;
00130 #else
00131 static vtkSimpleCriticalSection* BarrierLock;
00132 static vtkSimpleCriticalSection* BarrierInProgress;
00133 #endif
00134
00135 ThreadIdType ThreadId;
00136
00137 int LastNumberOfProcesses;
00138
00139 vtkMultiThreader *MultiThreader;
00140
00141 int MultipleMethodFlag;
00142
00143
00144
00145 vtkMultiProcessController *GetLocalController();
00146
00147 private:
00148 vtkThreadedController(const vtkThreadedController&);
00149 void operator=(const vtkThreadedController&);
00150 };
00151
00152 #endif
00153
00154