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