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 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 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 //BTX 00093 00094 friend class vtkThreadedController; 00095 00096 //ETX 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 // It is not enough to block on the messages, we have to mutex 00110 // the whole send interaction. I was trying to avoid a central 00111 // mutex (oh well). 00112 vtkSimpleCriticalSection* MessageListLock; 00113 00114 00115 // Each thread has its own communicator. 00116 vtkSharedMemoryCommunicator** Communicators; 00117 00118 vtkSharedMemoryCommunicator* Parent; 00119 00120 // Double linked list. 00121 vtkSharedMemoryCommunicatorMessage *MessageListStart; 00122 vtkSharedMemoryCommunicatorMessage *MessageListEnd; 00123 00124 vtkSharedMemoryCommunicator(); 00125 ~vtkSharedMemoryCommunicator(); 00126 00127 // The generic send and receive methods. 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 // Event signaling the arrival of a new message. 00150 // Windows implementation only. 00151 HANDLE MessageSignal; 00152 #else 00153 // This mutex is normally locked. It is used to block the execution 00154 // of the receiving process when the send has not been called yet. 00155 vtkSimpleCriticalSection* Gate; 00156 #endif 00157 00158 void SignalNewMessage(vtkSharedMemoryCommunicator* receiveCommunicator); 00159 00160 void WaitForNewMessage(); 00161 00162 private: 00163 vtkSharedMemoryCommunicator(const vtkSharedMemoryCommunicator&); // Not implemented. 00164 void operator=(const vtkSharedMemoryCommunicator&); // Not implemented. 00165 }; 00166 00167 #endif // __vtkSharedMemoryCommunicator_h