00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00036 #ifndef __vtkSharedMemoryCommunicator_h
00037 #define __vtkSharedMemoryCommunicator_h
00038
00039 #include "vtkCommunicator.h"
00040
00041 class vtkThreadedController;
00042 class vtkSharedMemoryCommunicatorMessage;
00043 class vtkSimpleCriticalSection;
00044
00045 class VTK_PARALLEL_EXPORT vtkSharedMemoryCommunicator : public vtkCommunicator
00046 {
00047 public:
00048 vtkTypeRevisionMacro( vtkSharedMemoryCommunicator,vtkCommunicator);
00049
00051 static vtkSharedMemoryCommunicator* New();
00052
00053 virtual void PrintSelf(ostream& os, vtkIndent indent);
00054
00056
00058 virtual int Send(int* data, int length, int remoteThreadId, int tag);
00059 virtual int Send(unsigned long* data, int length, int remoteThreadId,
00060 int tag);
00061 virtual int Send(char* data, int length, int remoteThreadId, int tag);
00062 virtual int Send(unsigned char* data, int length, int remoteThreadId, int tag);
00063 virtual int Send(float* data, int length, int remoteThreadId, int tag);
00064 virtual int Send(double* data, int length, int remoteThreadId, int tag);
00065 #ifdef VTK_USE_64BIT_IDS
00066 virtual int Send(vtkIdType* data, int length, int remoteThreadId, int tag);
00068 #endif
00069 virtual int Send(vtkDataObject* data, int remoteThreadId, int tag);
00070 virtual int Send(vtkDataArray* data, int remoteThreadId, int tag);
00071
00073
00076 virtual int Receive(int* data, int length, int remoteThreadId,
00077 int tag);
00078 virtual int Receive(unsigned long* data, int length,
00079 int remoteThreadId, int tag);
00080 virtual int Receive(char* data, int length, int remoteThreadId,
00081 int tag);
00082 virtual int Receive(unsigned char* data, int length, int remoteThreadId,
00083 int tag);
00084 virtual int Receive(float* data, int length, int remoteThreadId,
00085 int tag);
00086 virtual int Receive(double* data, int length, int remoteThreadId,
00087 int tag);
00088 #ifdef VTK_USE_64BIT_IDS
00089 virtual int Receive(vtkIdType* data, int length, int remoteThreadId,
00090 int tag);
00092 #endif
00093 virtual int Receive(vtkDataObject *data, int remoteThreadId, int tag);
00094 virtual int Receive(vtkDataArray *data, int remoteThreadId, int tag);
00095
00096
00097
00098 friend class vtkThreadedController;
00099
00100
00101
00102 protected:
00103
00104 int NumberOfThreads;
00105 int Initialized;
00106 void Initialize(int nThreads, int forceDeepCopy);
00107
00108 int LocalThreadId;
00109 int WaitingForId;
00110
00111 int ForceDeepCopy;
00112
00113
00114
00115
00116 vtkSimpleCriticalSection* MessageListLock;
00117
00118
00119
00120 vtkSharedMemoryCommunicator** Communicators;
00121
00122 vtkSharedMemoryCommunicator* Parent;
00123
00124
00125 vtkSharedMemoryCommunicatorMessage *MessageListStart;
00126 vtkSharedMemoryCommunicatorMessage *MessageListEnd;
00127
00128 vtkSharedMemoryCommunicator();
00129 ~vtkSharedMemoryCommunicator();
00130
00131
00132 int Send(vtkDataObject* object, void *data, int dataLength,
00133 int remoteThreadId, int tag);
00134 int Receive(vtkDataObject* object, void *data, int dataLength,
00135 int remoteThreadId, int tag);
00136
00137 int Send(vtkDataArray* object, int dataLength,
00138 int remoteThreadId, int tag);
00139 int Receive(vtkDataArray* object, int dataLength,
00140 int remoteThreadId, int tag);
00141
00142 vtkSharedMemoryCommunicatorMessage* NewMessage(vtkDataObject* object,
00143 void* data,
00144 int dataLength);
00145 vtkSharedMemoryCommunicatorMessage* NewMessage(vtkDataArray* object,
00146 void* data,
00147 int dataLength);
00148 void DeleteMessage(vtkSharedMemoryCommunicatorMessage *message);
00149 void AddMessage(vtkSharedMemoryCommunicatorMessage *message);
00150 vtkSharedMemoryCommunicatorMessage* FindMessage(int sendId, int tag);
00151
00152 #ifdef _WIN32
00153
00154
00155 HANDLE MessageSignal;
00156 #else
00157
00158
00159 vtkSimpleCriticalSection* Gate;
00160 #endif
00161
00162 void SignalNewMessage(vtkSharedMemoryCommunicator* receiveCommunicator);
00163
00164 void WaitForNewMessage();
00165
00166 private:
00167 vtkSharedMemoryCommunicator(const vtkSharedMemoryCommunicator&);
00168 void operator=(const vtkSharedMemoryCommunicator&);
00169 };
00170
00171 #endif // __vtkSharedMemoryCommunicator_h