μHAL (v2.7.9)
Part of the IPbus software repository
ProtocolUDP.hpp
Go to the documentation of this file.
1 /*
2 ---------------------------------------------------------------------------
3 
4  This file is part of uHAL.
5 
6  uHAL is a hardware access library and programming framework
7  originally developed for upgrades of the Level-1 trigger of the CMS
8  experiment at CERN.
9 
10  uHAL is free software: you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  uHAL is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with uHAL. If not, see <http://www.gnu.org/licenses/>.
22 
23 
24  Andrew Rose, Imperial College, London
25  email: awr01 <AT> imperial.ac.uk
26 
27  Marc Magrans de Abril, CERN
28  email: marc.magrans.de.abril <AT> cern.ch
29 
30 ---------------------------------------------------------------------------
31 */
32 
39 #ifndef _uhal_ProtocolUDP_hpp_
40 #define _uhal_ProtocolUDP_hpp_
41 
42 
43 #include <deque>
44 #include <iostream>
45 #include <stdint.h>
46 #include <string>
47 #include <vector>
48 
49 #include <boost/shared_ptr.hpp>
50 #include <boost/asio/io_service.hpp>
51 #include <boost/asio/ip/udp.hpp>
52 #include <boost/asio/deadline_timer.hpp>
53 
54 #include <boost/thread/thread.hpp>
55 #include <boost/thread/mutex.hpp>
56 #include <boost/thread/condition_variable.hpp>
57 
58 #include "uhal/ClientInterface.hpp"
59 #include "uhal/log/exception.hpp"
60 
61 
62 namespace boost {
63  namespace system { class error_code; }
64 }
65 
66 namespace uhal
67 {
68  // Forward declarations
69  class Buffers;
70  struct URI;
71 
72  namespace exception
73  {
75  UHAL_DEFINE_DERIVED_EXCEPTION_CLASS ( UdpTimeout , ClientTimeout , "Exception class to handle the case where the UDP connection timed out." )
77  UHAL_DEFINE_DERIVED_EXCEPTION_CLASS ( ErrorAtUdpSocketCreation , TransportLayerError , "Exception class to handle a failure to create a UDP socket." )
79  UHAL_DEFINE_DERIVED_EXCEPTION_CLASS ( ASIOUdpError , TransportLayerError , "Exception class to handle the case where ASIO returned an error." )
80  }
81 
83  template < typename InnerProtocol >
84  class UDP : public InnerProtocol
85  {
86 
87  private:
93  UDP ( const UDP& aUDP ); // non-copyable
94 
101  UDP& operator= ( const UDP& aUDP ); // non-assignable
102 
103  public:
109  UDP ( const std::string& aId, const URI& aUri );
110 
112  virtual ~UDP();
113 
114  private:
120  void implementDispatch ( boost::shared_ptr< Buffers > aBuffers );
121 
123  virtual void Flush( );
124 
126  virtual void dispatchExceptionHandler();
127 
132  uint32_t getMaxSendSize();
133 
138  uint32_t getMaxReplySize();
139 
141  void connect();
142 
148  void write ( );
149 
155  void write_callback ( const boost::system::error_code& aErrorCode , std::size_t aBytesTransferred );
156 
162  void read ( );
163 
169  void read_callback ( const boost::system::error_code& aErrorCode , std::size_t aBytesTransferred );
170 
172  void CheckDeadline();
173 
178  void NotifyConditionalVariable ( const bool& aValue );
179 
181  void WaitOnConditionalVariable();
182 
183  private:
185  boost::asio::io_service mIOservice;
186 
188  boost::asio::ip::udp::socket mSocket;
189 
191  boost::asio::ip::udp::endpoint mEndpoint;
192 
194  boost::asio::deadline_timer mDeadlineTimer;
195 
201  std::vector<uint8_t> mReplyMemory;
202 
204  boost::asio::io_service::work mIOserviceWork;
205 
207  boost::thread mDispatchThread;
208 
210  boost::mutex mTransportLayerMutex;
211 
213  std::deque < boost::shared_ptr< Buffers > > mDispatchQueue;
215  std::deque < boost::shared_ptr< Buffers > > mReplyQueue;
216 
219 
223  boost::condition_variable mConditionalVariable;
226 
231 
237 
238  };
239 
240 
241 }
242 
243 
244 #endif
uhal::UDP::mDispatchQueue
std::deque< boost::shared_ptr< Buffers > > mDispatchQueue
The list of buffers still waiting to be sent.
Definition: ProtocolUDP.hpp:213
boost::shared_ptr
Definition: DerivedNodeFactory.hpp:52
uhal::UDP::mConditionalVariableMutex
boost::mutex mConditionalVariableMutex
A mutex for use by the conditional variable.
Definition: ProtocolUDP.hpp:221
uhal::UDP::mIOserviceWork
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 ...
Definition: ProtocolUDP.hpp:204
uhal::UDP::mDeadlineTimer
boost::asio::deadline_timer mDeadlineTimer
The mechanism for providing the time-out.
Definition: ProtocolUDP.hpp:194
uhal::UDP::mReplyBuffers
boost::shared_ptr< Buffers > mReplyBuffers
The receive operation currently in progress or the next to be done.
Definition: ProtocolUDP.hpp:230
UHAL_DEFINE_DERIVED_EXCEPTION_CLASS
#define UHAL_DEFINE_DERIVED_EXCEPTION_CLASS(ClassName, BaseClassName, ClassDescription)
Macro for simplifying the declaration and definition of derived exception types.
Definition: exception.hpp:49
boost
Definition: log.hpp:13
uhal::UDP::mIOservice
boost::asio::io_service mIOservice
The boost::asio::io_service used to create the connections.
Definition: ProtocolUDP.hpp:185
uhal::exception::exception
An abstract base exception class, including an interface to throw as the derived type (for passing ex...
Definition: exception.hpp:71
uhal::UDP::mTransportLayerMutex
boost::mutex mTransportLayerMutex
A MutEx lock used to make sure the access functions are thread safe.
Definition: ProtocolUDP.hpp:210
uhal
Definition: HttpResponseGrammar.hpp:49
uhal::UDP
Transport protocol to transfer an IPbus buffer via UDP.
Definition: ProtocolUDP.hpp:85
uhal::UDP::mReplyMemory
std::vector< uint8_t > mReplyMemory
A block of memory into which we write replies, before copying them to their final destination.
Definition: ProtocolUDP.hpp:201
uhal::UDP::UDP
UDP(const UDP &aUDP)
Copy Constructor This creates a new socket, dispatch queue, dispatch thread, etc.
uhal::UDP::mDispatchThread
boost::thread mDispatchThread
The Worker thread in Multi-threaded mode.
Definition: ProtocolUDP.hpp:207
uhal::UDP::mDispatchBuffers
boost::shared_ptr< Buffers > mDispatchBuffers
The send operation currently in progress.
Definition: ProtocolUDP.hpp:228
uhal::UDP::mEndpoint
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...
Definition: ProtocolUDP.hpp:191
uhal::UDP::mSocket
boost::asio::ip::udp::socket mSocket
A shared pointer to a boost::asio udp socket through which the operation will be performed.
Definition: ProtocolUDP.hpp:188
uhal::UDP::mPacketsInFlight
uint32_t mPacketsInFlight
Counter of how many writes have been sent, for which no reply has yet been received.
Definition: ProtocolUDP.hpp:218
uhal::UDP::mReplyQueue
std::deque< boost::shared_ptr< Buffers > > mReplyQueue
The list of buffers still awaiting a reply.
Definition: ProtocolUDP.hpp:215
uhal::UDP::mAsynchronousException
uhal::exception::exception * mAsynchronousException
A pointer to an exception object for passing exceptions from the worker thread to the main thread.
Definition: ProtocolUDP.hpp:236
uhal::tests::write
c write(addr, xx[0])
uhal::URI
Struct to store a URI when parsed by boost spirit.
Definition: URI.hpp:50
exception.hpp
uhal::UDP::mConditionalVariable
boost::condition_variable mConditionalVariable
A conditional variable for blocking the main thread until the variable with which it is associated is...
Definition: ProtocolUDP.hpp:223
uhal::UDP::mFlushDone
bool mFlushDone
A variable associated with the conditional variable which specifies whether all packets have been sen...
Definition: ProtocolUDP.hpp:225
ClientInterface.hpp