Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

dox/Parallel/vtkSharedMemoryCommunicator.h

Go to the documentation of this file.
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkSharedMemoryCommunicator.h,v $ 00005 Language: C++ 00006 00007 Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 00008 All rights reserved. 00009 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00010 00011 This software is distributed WITHOUT ANY WARRANTY; without even 00012 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00013 PURPOSE. See the above copyright notice for more information. 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 //BTX 00097 00098 friend class vtkThreadedController; 00099 00100 //ETX 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 // It is not enough to block on the messages, we have to mutex 00114 // the whole send interaction. I was trying to avoid a central 00115 // mutex (oh well). 00116 vtkSimpleCriticalSection* MessageListLock; 00117 00118 00119 // Each thread has its own communicator. 00120 vtkSharedMemoryCommunicator** Communicators; 00121 00122 vtkSharedMemoryCommunicator* Parent; 00123 00124 // Double linked list. 00125 vtkSharedMemoryCommunicatorMessage *MessageListStart; 00126 vtkSharedMemoryCommunicatorMessage *MessageListEnd; 00127 00128 vtkSharedMemoryCommunicator(); 00129 ~vtkSharedMemoryCommunicator(); 00130 00131 // The generic send and receive methods. 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 // Event signaling the arrival of a new message. 00154 // Windows implementation only. 00155 HANDLE MessageSignal; 00156 #else 00157 // This mutex is normally locked. It is used to block the execution 00158 // of the receiving process when the send has not been called yet. 00159 vtkSimpleCriticalSection* Gate; 00160 #endif 00161 00162 void SignalNewMessage(vtkSharedMemoryCommunicator* receiveCommunicator); 00163 00164 void WaitForNewMessage(); 00165 00166 private: 00167 vtkSharedMemoryCommunicator(const vtkSharedMemoryCommunicator&); // Not implemented. 00168 void operator=(const vtkSharedMemoryCommunicator&); // Not implemented. 00169 }; 00170 00171 #endif // __vtkSharedMemoryCommunicator_h