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

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