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