00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00028
#ifndef __vtkMultiThreader_h
00029
#define __vtkMultiThreader_h
00030
00031
#include "vtkObject.h"
00032
00033
#ifdef VTK_USE_SPROC
00034
#include <sys/types.h>
00035
#include <unistd.h>
00036
#endif
00037
00038
#if defined(VTK_USE_PTHREADS) || defined(VTK_HP_PTHREADS)
00039
#include <pthread.h>
00040
#include <sys/types.h>
00041
#include <unistd.h>
00042
#endif
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
#ifdef VTK_USE_SPROC
00058
typedef int vtkThreadProcessIDType;
00059
#endif
00060
00061
00062
00063
00064
00065
#ifdef VTK_USE_PTHREADS
00066
typedef void *(*vtkThreadFunctionType)(
void *);
00067
typedef pthread_t
vtkThreadProcessIDType;
00068
00069
00070
#endif
00071
00072
#ifdef VTK_USE_WIN32_THREADS
00073
typedef LPTHREAD_START_ROUTINE
vtkThreadFunctionType;
00074
typedef HANDLE
vtkThreadProcessIDType;
00075
00076
00077
#endif
00078
00079
#if !defined(VTK_USE_PTHREADS) && !defined(VTK_USE_WIN32_THREADS)
00080 typedef void (*vtkThreadFunctionType)(
void *);
00081 typedef int vtkThreadProcessIDType;
00082
00083
00084
#endif
00085
00086
00087
class vtkMutexLock;
00088
00089 class VTK_COMMON_EXPORT vtkMultiThreader :
public vtkObject
00090 {
00091
public:
00092
static vtkMultiThreader *
New();
00093
00094 vtkTypeRevisionMacro(vtkMultiThreader,
vtkObject);
00095
void PrintSelf(ostream& os,
vtkIndent indent);
00096
00108
00109 #define ThreadInfoStruct vtkMultiThreader::ThreadInfo
00110 class ThreadInfo
00111 {
00112
public:
00113 int ThreadID;
00114 int NumberOfThreads;
00115 int *ActiveFlag;
00116 vtkMutexLock *ActiveFlagLock;
00117 void *UserData;
00118 };
00119
00120
00122
00125 vtkSetClampMacro( NumberOfThreads,
int, 1, VTK_MAX_THREADS );
00126 vtkGetMacro( NumberOfThreads,
int );
00128
00130
00133
static void SetGlobalMaximumNumberOfThreads(
int val);
00134
static int GetGlobalMaximumNumberOfThreads();
00136
00138
00141
static void SetGlobalDefaultNumberOfThreads(
int val);
00142
static int GetGlobalDefaultNumberOfThreads();
00144
00145
00146
00147
00148
00149
00152
void SingleMethodExecute();
00153
00157
void MultipleMethodExecute();
00158
00163
void SetSingleMethod(vtkThreadFunctionType,
void *data );
00164
00167
void SetMultipleMethod(
int index, vtkThreadFunctionType,
void *data );
00168
00172
int SpawnThread( vtkThreadFunctionType,
void *data );
00173
00175
void TerminateThread(
int thread_id );
00176
00177
00178
protected:
00179 vtkMultiThreader();
00180 ~vtkMultiThreader();
00181
00182
00183 int NumberOfThreads;
00184
00185
00186
00187
00188 ThreadInfo ThreadInfoArray[
VTK_MAX_THREADS];
00189
00190
00191 vtkThreadFunctionType SingleMethod;
00192 vtkThreadFunctionType MultipleMethod[
VTK_MAX_THREADS];
00193
00194
00195
00196 int SpawnedThreadActiveFlag[
VTK_MAX_THREADS];
00197 vtkMutexLock *SpawnedThreadActiveFlagLock[
VTK_MAX_THREADS];
00198 vtkThreadProcessIDType SpawnedThreadProcessID[
VTK_MAX_THREADS];
00199 ThreadInfo SpawnedThreadInfoArray[
VTK_MAX_THREADS];
00200
00201
00202
00203
00204 void *SingleData;
00205 void *MultipleData[
VTK_MAX_THREADS];
00206
00207
private:
00208 vtkMultiThreader(
const vtkMultiThreader&);
00209
void operator=(
const vtkMultiThreader&);
00210 };
00211
00212
#endif
00213
00214
00215
00216
00217