Transport protocol to transfer an IPbus buffer via UDP. More...
#include <uhal/ProtocolUDP.hpp>
Public Member Functions | |
UDP (const std::string &aId, const URI &aUri) | |
Constructor. More... | |
virtual | ~UDP () |
Destructor. More... | |
Private Member Functions | |
UDP (const UDP &aUDP) | |
Copy Constructor This creates a new socket, dispatch queue, dispatch thread, etc. More... | |
UDP & | operator= (const UDP &aUDP) |
Assignment operator This reassigns the endpoint, closes the existing socket and cleans up the buffers, etc. More... | |
void | implementDispatch (boost::shared_ptr< Buffers > aBuffers) |
Send the IPbus buffer to the target, read back the response and call the packing-protocol's validate function. More... | |
virtual void | Flush () |
Concrete implementation of the synchronization function to block until all buffers have been sent, all replies received and all data validated. More... | |
virtual void | dispatchExceptionHandler () |
Function which tidies up this protocol layer in the event of an exception. More... | |
uint32_t | getMaxSendSize () |
Return the maximum size to be sent based on the buffer size in the target. More... | |
uint32_t | getMaxReplySize () |
Return the maximum size of reply packet based on the buffer size in the target. More... | |
void | connect () |
Set up the UDP socket. More... | |
void | write () |
Initialize performing the next UDP write operation In multi-threaded mode, this runs the ASIO async send and exits In single-threaded mode, this runs the ASIO async send and blocks. More... | |
void | write_callback (const boost::system::error_code &aErrorCode, std::size_t aBytesTransferred) |
Callback function which is called upon completion of the ASIO async send This, then, makes a call to read to read back the reply to what has just been sent. More... | |
void | read () |
Initialize performing the next UDP read operation In multi-threaded mode, this runs the ASIO async receive and exits In single-threaded mode, this runs the ASIO async receive and blocks. More... | |
void | read_callback (const boost::system::error_code &aErrorCode, std::size_t aBytesTransferred) |
Callback function which is called upon completion of the ASIO async receive This, then, checks the queue to see if there are more packets to be sent and if so, calls write. More... | |
void | CheckDeadline () |
Function called by the ASIO deadline timer. More... | |
void | NotifyConditionalVariable (const bool &aValue) |
Function to set the value of a variable associated with a BOOST conditional-variable and then notify that conditional variable. More... | |
void | WaitOnConditionalVariable () |
Function to block a thread pending a BOOST conditional-variable and its associated regular variable. More... | |
Private Attributes | |
boost::asio::io_service | mIOservice |
The boost::asio::io_service used to create the connections. More... | |
boost::asio::ip::udp::socket | mSocket |
A shared pointer to a boost::asio udp socket through which the operation will be performed. More... | |
boost::asio::ip::udp::endpoint | mEndpoint |
A shared pointer to a boost::asio udp endpoint - used in the ASIO send and receive functions (UDP has no concept of a connection) More... | |
boost::asio::deadline_timer | mDeadlineTimer |
The mechanism for providing the time-out. More... | |
std::vector< uint8_t > | mReplyMemory |
A block of memory into which we write replies, before copying them to their final destination. More... | |
boost::asio::io_service::work | mIOserviceWork |
Needed when multi-threading to stop the boost::asio::io_service thinking it has nothing to do and so close the socket. More... | |
boost::thread | mDispatchThread |
The Worker thread in Multi-threaded mode. More... | |
boost::mutex | mTransportLayerMutex |
A MutEx lock used to make sure the access functions are thread safe. More... | |
std::deque< boost::shared_ptr< Buffers > > | mDispatchQueue |
The list of buffers still waiting to be sent. More... | |
std::deque< boost::shared_ptr< Buffers > > | mReplyQueue |
The list of buffers still awaiting a reply. More... | |
uint32_t | mPacketsInFlight |
Counter of how many writes have been sent, for which no reply has yet been received. More... | |
boost::mutex | mConditionalVariableMutex |
A mutex for use by the conditional variable. More... | |
boost::condition_variable | mConditionalVariable |
A conditional variable for blocking the main thread until the variable with which it is associated is set correctly. More... | |
bool | mFlushDone |
A variable associated with the conditional variable which specifies whether all packets have been sent and all replies have been received. More... | |
boost::shared_ptr< Buffers > | mDispatchBuffers |
The send operation currently in progress. More... | |
boost::shared_ptr< Buffers > | mReplyBuffers |
The receive operation currently in progress or the next to be done. More... | |
uhal::exception::exception * | mAsynchronousException |
A pointer to an exception object for passing exceptions from the worker thread to the main thread. More... | |
Transport protocol to transfer an IPbus buffer via UDP.
Definition at line 84 of file ProtocolUDP.hpp.
|
private |
Copy Constructor This creates a new socket, dispatch queue, dispatch thread, etc.
which connects to the same target ip/port
aUDP | a UDP-protocol object to copy |
uhal::UDP< InnerProtocol >::UDP | ( | const std::string & | aId, |
const URI & | aUri | ||
) |
Constructor.
aId | the uinique identifier that the client will be given. |
aUri | a struct containing the full URI of the target. |
Definition at line 60 of file ProtocolUDP.cpp.
References uhal::UDP< InnerProtocol >::CheckDeadline(), and uhal::UDP< InnerProtocol >::mDeadlineTimer.
Destructor.
Definition at line 80 of file ProtocolUDP.cpp.
References uhal::Error, uhal::log(), uhal::Quote(), uhal::ClientInterface::returnBufferToPool(), and uhal::Type().
|
private |
Function called by the ASIO deadline timer.
Definition at line 396 of file ProtocolUDP.cpp.
References uhal::Debug, uhal::log(), uhal::Quote(), uhal::tests::uri, and uhal::Warning.
Referenced by uhal::UDP< InnerProtocol >::UDP().
|
private |
Set up the UDP socket.
Definition at line 147 of file ProtocolUDP.cpp.
References uhal::Info, uhal::log(), uhal::Quote(), and uhal::tests::uri.
|
privatevirtual |
Function which tidies up this protocol layer in the event of an exception.
Definition at line 443 of file ProtocolUDP.cpp.
References uhal::log(), uhal::ClientInterface::returnBufferToPool(), and uhal::Warning.
|
privatevirtual |
Concrete implementation of the synchronization function to block until all buffers have been sent, all replies received and all data validated.
Definition at line 429 of file ProtocolUDP.cpp.
|
private |
Return the maximum size of reply packet based on the buffer size in the target.
Definition at line 140 of file ProtocolUDP.cpp.
|
private |
Return the maximum size to be sent based on the buffer size in the target.
Definition at line 133 of file ProtocolUDP.cpp.
|
private |
Send the IPbus buffer to the target, read back the response and call the packing-protocol's validate function.
aBuffers | the buffer object wrapping the send and recieve buffers that are to be transported If multithreaded, adds buffer to the dispatch queue and returns. If single-threaded, calls the dispatch-worker dispatch function directly and blocks until the response is validated. |
Definition at line 104 of file ProtocolUDP.cpp.
References uhal::log(), uhal::Type(), and uhal::tests::write().
|
private |
Function to set the value of a variable associated with a BOOST conditional-variable and then notify that conditional variable.
aValue | a value to which to update the variable associated with a BOOST conditional-variable |
Definition at line 482 of file ProtocolUDP.cpp.
|
private |
Assignment operator This reassigns the endpoint, closes the existing socket and cleans up the buffers, etc.
On the next call which requires the socket, it will be reopened with the new endpoint.
aUDP | a UDP-protocol object to copy |
|
private |
Initialize performing the next UDP read operation In multi-threaded mode, this runs the ASIO async receive and exits In single-threaded mode, this runs the ASIO async receive and blocks.
Definition at line 253 of file ProtocolUDP.cpp.
References uhal::Debug, uhal::Error, uhal::Integer(), and uhal::log().
|
private |
Callback function which is called upon completion of the ASIO async receive This, then, checks the queue to see if there are more packets to be sent and if so, calls write.
aErrorCode | the error code with which the ASIO operation completed |
Definition at line 278 of file ProtocolUDP.cpp.
References uhal::Error, uhal::Integer(), uhal::log(), uhal::min, uhal::Quote(), uhal::tests::uri, uhal::ClientInterface::validate(), uhal::exception::exception::what(), and uhal::tests::write().
|
private |
Function to block a thread pending a BOOST conditional-variable and its associated regular variable.
Definition at line 493 of file ProtocolUDP.cpp.
|
private |
Initialize performing the next UDP write operation In multi-threaded mode, this runs the ASIO async send and exits In single-threaded mode, this runs the ASIO async send and blocks.
Definition at line 159 of file ProtocolUDP.cpp.
References uhal::Debug, uhal::Error, uhal::Integer(), and uhal::log().
|
private |
Callback function which is called upon completion of the ASIO async send This, then, makes a call to read to read back the reply to what has just been sent.
aErrorCode | the error code with which the ASIO operation completed |
Definition at line 187 of file ProtocolUDP.cpp.
References uhal::Integer(), uhal::log(), uhal::Quote(), uhal::tests::uri, and uhal::tests::write().
|
private |
A pointer to an exception object for passing exceptions from the worker thread to the main thread.
Exceptions must always be created on the heap (i.e. using new
) and deletion will be handled in the main thread
Definition at line 236 of file ProtocolUDP.hpp.
|
private |
A conditional variable for blocking the main thread until the variable with which it is associated is set correctly.
Definition at line 223 of file ProtocolUDP.hpp.
|
private |
A mutex for use by the conditional variable.
Definition at line 221 of file ProtocolUDP.hpp.
|
private |
The mechanism for providing the time-out.
Definition at line 194 of file ProtocolUDP.hpp.
Referenced by uhal::UDP< InnerProtocol >::UDP().
|
private |
The send operation currently in progress.
Definition at line 228 of file ProtocolUDP.hpp.
|
private |
The list of buffers still waiting to be sent.
Definition at line 213 of file ProtocolUDP.hpp.
|
private |
The Worker thread in Multi-threaded mode.
Definition at line 207 of file ProtocolUDP.hpp.
|
private |
A shared pointer to a boost::asio udp endpoint - used in the ASIO send and receive functions (UDP has no concept of a connection)
Definition at line 191 of file ProtocolUDP.hpp.
|
private |
A variable associated with the conditional variable which specifies whether all packets have been sent and all replies have been received.
Definition at line 225 of file ProtocolUDP.hpp.
|
private |
The boost::asio::io_service used to create the connections.
Definition at line 185 of file ProtocolUDP.hpp.
|
private |
Needed when multi-threading to stop the boost::asio::io_service thinking it has nothing to do and so close the socket.
Definition at line 204 of file ProtocolUDP.hpp.
|
private |
Counter of how many writes have been sent, for which no reply has yet been received.
Definition at line 218 of file ProtocolUDP.hpp.
|
private |
The receive operation currently in progress or the next to be done.
Definition at line 230 of file ProtocolUDP.hpp.
|
private |
A block of memory into which we write replies, before copying them to their final destination.
Definition at line 201 of file ProtocolUDP.hpp.
|
private |
The list of buffers still awaiting a reply.
Definition at line 215 of file ProtocolUDP.hpp.
|
private |
A shared pointer to a boost::asio udp socket through which the operation will be performed.
Definition at line 188 of file ProtocolUDP.hpp.
|
private |
A MutEx lock used to make sure the access functions are thread safe.
Definition at line 210 of file ProtocolUDP.hpp.