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

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