VTK  9.1.0
vtkSocketCommunicator.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkSocketCommunicator.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
34 #ifndef vtkSocketCommunicator_h
35 #define vtkSocketCommunicator_h
36 
37 #include "vtkCommunicator.h"
38 #include "vtkEndian.h" // for VTK_WORDS_BIGENDIAN
39 #include "vtkParallelCoreModule.h" // For export macro
40 
41 #include "vtkByteSwap.h" // Needed for vtkSwap macros
42 
43 #ifdef VTK_WORDS_BIGENDIAN
44 #define vtkSwap4 vtkByteSwap::Swap4LE
45 #define vtkSwap4Range vtkByteSwap::Swap4LERange
46 #define vtkSwap8 vtkByteSwap::Swap8LE
47 #define vtkSwap8Range vtkByteSwap::Swap8LERange
48 #else
49 #define vtkSwap4 vtkByteSwap::Swap4BE
50 #define vtkSwap4Range vtkByteSwap::Swap4BERange
51 #define vtkSwap8 vtkByteSwap::Swap8BE
52 #define vtkSwap8Range vtkByteSwap::Swap8BERange
53 #endif
54 
55 class vtkClientSocket;
56 class vtkServerSocket;
57 
58 class VTKPARALLELCORE_EXPORT vtkSocketCommunicator : public vtkCommunicator
59 {
60 public:
63  void PrintSelf(ostream& os, vtkIndent indent) override;
64 
66 
70  virtual int WaitForConnection(int port);
71  virtual int WaitForConnection(vtkServerSocket* socket, unsigned long msec = 0);
73 
77  virtual void CloseConnection();
78 
82  virtual int ConnectTo(const char* hostName, int port);
83 
85 
88  vtkGetMacro(SwapBytesInReceivedData, int);
90 
95 
99  void SetNumberOfProcesses(int num) override;
100 
101  //------------------ Communication --------------------
102 
104 
109  const void* data, vtkIdType length, int type, int remoteHandle, int tag) override;
110  int ReceiveVoidArray(void* data, vtkIdType length, int type, int remoteHandle, int tag) override;
112 
117  void Barrier() override;
118 
120 
125  int BroadcastVoidArray(void* data, vtkIdType length, int type, int srcProcessId) override;
126  int GatherVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
127  int destProcessId) override;
128  int GatherVVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType sendLength,
129  vtkIdType* recvLengths, vtkIdType* offsets, int type, int destProcessId) override;
130  int ScatterVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
131  int srcProcessId) override;
132  int ScatterVVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType* sendLengths,
133  vtkIdType* offsets, vtkIdType recvLength, int type, int srcProcessId) override;
135  const void* sendBuffer, void* recvBuffer, vtkIdType length, int type) override;
136  int AllGatherVVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType sendLength,
137  vtkIdType* recvLengths, vtkIdType* offsets, int type) override;
138  int ReduceVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
139  int operation, int destProcessId) override;
140  int ReduceVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
141  Operation* operation, int destProcessId) override;
143  const void* sendBuffer, void* recvBuffer, vtkIdType length, int type, int operation) override;
144  int AllReduceVoidArray(const void* sendBuffer, void* recvBuffer, vtkIdType length, int type,
145  Operation* operation) override;
147 
149 
154  vtkSetClampMacro(PerformHandshake, vtkTypeBool, 0, 1);
155  vtkBooleanMacro(PerformHandshake, vtkTypeBool);
156  vtkGetMacro(PerformHandshake, vtkTypeBool);
158 
160 
164  virtual void SetLogStream(ostream* stream);
165  virtual ostream* GetLogStream();
167 
169 
175  virtual int LogToFile(const char* name);
176  virtual int LogToFile(const char* name, int append);
178 
180 
183  vtkSetMacro(ReportErrors, int);
184  vtkGetMacro(ReportErrors, int);
186 
188 
191  vtkGetObjectMacro(Socket, vtkClientSocket);
194 
199  int Handshake();
200 
207 
214 
216 
220  vtkGetMacro(IsServer, int);
222 
227  static int GetVersion();
228 
237  void BufferCurrentMessage() { this->BufferMessage = true; }
238 
243 
244 protected:
249  int IsServer;
250 
252 
253  ostream* LogFile;
254  ostream* LogStream;
255 
258 
259  // Wrappers around send/recv calls to implement loops. Return 1 for
260  // success, and 0 for failure.
261  int SendTagged(const void* data, int wordSize, int numWords, int tag, const char* logName);
262  int ReceiveTagged(void* data, int wordSize, int numWords, int tag, const char* logName);
263  int ReceivePartialTagged(void* data, int wordSize, int numWords, int tag, const char* logName);
264 
266  void* data, int wordSize, int numWords, int tag, const char* logName);
267 
271  void FixByteOrder(void* data, int wordSize, int numWords);
272 
273  // Internal utility methods.
274  void LogTagged(
275  const char* name, const void* data, int wordSize, int numWords, int tag, const char* logName);
278 
279 private:
281  void operator=(const vtkSocketCommunicator&) = delete;
282 
283  int SelectSocket(int socket, unsigned long msec);
284 
285  // SwapBytesInReceiveData needs an invalid / not set.
286  // This avoids checking length of endian handshake.
287  enum ErrorIds
288  {
289  SwapOff = 0,
290  SwapOn,
291  SwapNotSet
292  };
293 
294  // One may be tempted to change this to a vtkIdType, but really an int is
295  // enough since we split messages > VTK_INT_MAX.
296  int TagMessageLength;
297 
298  // Buffer to save messages received with different tag than requested.
299  class vtkMessageBuffer;
300  vtkMessageBuffer* ReceivedMessageBuffer;
301 };
302 
303 #endif
Encapsulates a client socket.
A custom operation to use in a reduce command.
Used to send/receive messages in a multiprocess environment.
a simple class to control print indentation
Definition: vtkIndent.h:34
Encapsulate a socket that accepts connections.
Process communication using Sockets.
int ReceiveVoidArray(void *data, vtkIdType length, int type, int remoteHandle, int tag) override
Performs the actual communication.
int ClientSideHandshake()
Performs ClientSide handshake.
int BroadcastVoidArray(void *data, vtkIdType length, int type, int srcProcessId) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
int Handshake()
Performs handshake.
int GatherVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, int destProcessId) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
virtual int LogToFile(const char *name, int append)
Log messages to the given file.
virtual int ConnectTo(const char *hostName, int port)
Open a connection to host.
int ServerSideHandshake()
Performs ServerSide handshake.
virtual ostream * GetLogStream()
Get/Set the output stream to which communications should be logged.
void Barrier() override
This class foolishly breaks the conventions of the superclass, so this overload fixes the method.
int GetIsConnected()
Is the communicator connected?.
int SendVoidArray(const void *data, vtkIdType length, int type, int remoteHandle, int tag) override
Performs the actual communication.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
int GatherVVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType sendLength, vtkIdType *recvLengths, vtkIdType *offsets, int type, int destProcessId) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
int ReceivePartialTagged(void *data, int wordSize, int numWords, int tag, const char *logName)
virtual void CloseConnection()
Close a connection.
void FixByteOrder(void *data, int wordSize, int numWords)
Fix byte order for received data.
int SendTagged(const void *data, int wordSize, int numWords, int tag, const char *logName)
void LogTagged(const char *name, const void *data, int wordSize, int numWords, int tag, const char *logName)
int ReceivedTaggedFromBuffer(void *data, int wordSize, int numWords, int tag, const char *logName)
virtual int WaitForConnection(vtkServerSocket *socket, unsigned long msec=0)
Wait for connection on a given port.
int ReduceVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, Operation *operation, int destProcessId) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
static int GetVersion()
Uniquely identifies the version of this class.
virtual int WaitForConnection(int port)
Wait for connection on a given port.
void SetNumberOfProcesses(int num) override
Set the number of processes you will be using.
int ScatterVVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType *sendLengths, vtkIdType *offsets, vtkIdType recvLength, int type, int srcProcessId) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
int ScatterVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, int srcProcessId) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
int CheckForErrorInternal(int id)
int ReduceVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, int operation, int destProcessId) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
int AllGatherVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
virtual int LogToFile(const char *name)
Log messages to the given file.
~vtkSocketCommunicator() override
bool HasBufferredMessages()
Returns true if there are any messages in the receive buffer.
int AllGatherVVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType sendLength, vtkIdType *recvLengths, vtkIdType *offsets, int type) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
int ReceiveTagged(void *data, int wordSize, int numWords, int tag, const char *logName)
void SetSocket(vtkClientSocket *)
Get/Set the actual socket used for communication.
virtual void SetLogStream(ostream *stream)
Get/Set the output stream to which communications should be logged.
int AllReduceVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, Operation *operation) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
static vtkSocketCommunicator * New()
int AllReduceVoidArray(const void *sendBuffer, void *recvBuffer, vtkIdType length, int type, int operation) override
This class foolishly breaks the conventions of the superclass, so the default implementations of thes...
void BufferCurrentMessage()
This flag is cleared before vtkCommand::WrongTagEvent is fired when ever a message with mismatched ta...
@ length
Definition: vtkX3D.h:399
@ port
Definition: vtkX3D.h:453
@ type
Definition: vtkX3D.h:522
@ name
Definition: vtkX3D.h:225
@ data
Definition: vtkX3D.h:321
int vtkTypeBool
Definition: vtkABI.h:69
int vtkIdType
Definition: vtkType.h:332