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