FairMQ  1.4.33
C++ Message Queuing Library and Framework
FairMQTransportFactory.h
1 /********************************************************************************
2  * Copyright (C) 2014-2018 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
3  * *
4  * This software is distributed under the terms of the *
5  * GNU Lesser General Public Licence (LGPL) version 3, *
6  * copied verbatim in the file "LICENSE" *
7  ********************************************************************************/
8 
9 #ifndef FAIRMQTRANSPORTFACTORY_H_
10 #define FAIRMQTRANSPORTFACTORY_H_
11 
12 #include <FairMQMessage.h>
13 #include <FairMQPoller.h>
14 #include <FairMQSocket.h>
15 #include <FairMQUnmanagedRegion.h>
16 #include <fairmq/MemoryResources.h>
17 #include <fairmq/Transports.h>
18 
19 #include <string>
20 #include <memory> // shared_ptr
21 #include <vector>
22 #include <unordered_map>
23 #include <stdexcept>
24 #include <cstddef> // size_t
25 
26 class FairMQChannel;
27 namespace fair::mq { class ProgOptions; }
28 
30 {
31  private:
33  const std::string fkId;
34 
36  fair::mq::ChannelResource fMemoryResource{this};
37 
38  public:
41  FairMQTransportFactory(const std::string& id);
42 
43  auto GetId() const -> const std::string { return fkId; };
44 
46  fair::mq::ChannelResource* GetMemoryResource() { return &fMemoryResource; }
47  operator fair::mq::ChannelResource*() { return &fMemoryResource; }
48 
51  virtual FairMQMessagePtr CreateMessage() = 0;
55  virtual FairMQMessagePtr CreateMessage(fair::mq::Alignment alignment) = 0;
59  virtual FairMQMessagePtr CreateMessage(const size_t size) = 0;
64  virtual FairMQMessagePtr CreateMessage(const size_t size, fair::mq::Alignment alignment) = 0;
71  virtual FairMQMessagePtr CreateMessage(void* data, const size_t size, fairmq_free_fn* ffn, void* hint = nullptr) = 0;
77  virtual FairMQMessagePtr CreateMessage(FairMQUnmanagedRegionPtr& unmanagedRegion, void* data, const size_t size, void* hint = 0) = 0;
78 
80  virtual FairMQSocketPtr CreateSocket(const std::string& type, const std::string& name) = 0;
81 
83  virtual FairMQPollerPtr CreatePoller(const std::vector<FairMQChannel>& channels) const = 0;
85  virtual FairMQPollerPtr CreatePoller(const std::vector<FairMQChannel*>& channels) const = 0;
87  virtual FairMQPollerPtr CreatePoller(const std::unordered_map<std::string, std::vector<FairMQChannel>>& channelsMap, const std::vector<std::string>& channelList) const = 0;
88 
95  virtual FairMQUnmanagedRegionPtr CreateUnmanagedRegion(const size_t size, FairMQRegionCallback callback = nullptr, const std::string& path = "", int flags = 0) = 0;
96  virtual FairMQUnmanagedRegionPtr CreateUnmanagedRegion(const size_t size, FairMQRegionBulkCallback callback = nullptr, const std::string& path = "", int flags = 0) = 0;
104  virtual FairMQUnmanagedRegionPtr CreateUnmanagedRegion(const size_t size, const int64_t userFlags, FairMQRegionCallback callback = nullptr, const std::string& path = "", int flags = 0) = 0;
105  virtual FairMQUnmanagedRegionPtr CreateUnmanagedRegion(const size_t size, const int64_t userFlags, FairMQRegionBulkCallback callback = nullptr, const std::string& path = "", int flags = 0) = 0;
106 
109  virtual void SubscribeToRegionEvents(FairMQRegionEventCallback callback) = 0;
112  virtual bool SubscribedToRegionEvents() = 0;
114  virtual void UnsubscribeFromRegionEvents() = 0;
115 
116  virtual std::vector<FairMQRegionInfo> GetRegionInfo() = 0;
117 
119  virtual fair::mq::Transport GetType() const = 0;
120 
121  virtual void Interrupt() = 0;
122  virtual void Resume() = 0;
123  virtual void Reset() = 0;
124 
125  virtual ~FairMQTransportFactory() {};
126 
127  static auto CreateTransportFactory(const std::string& type, const std::string& id = "", const fair::mq::ProgOptions* config = nullptr) -> std::shared_ptr<FairMQTransportFactory>;
128 
129  static void FairMQNoCleanup(void* /*data*/, void* /*obj*/)
130  {
131  }
132 
133  template<typename T>
134  static void FairMQSimpleMsgCleanup(void* /*data*/, void* obj)
135  {
136  delete static_cast<T*>(obj);
137  }
138 
139  template<typename T>
140  FairMQMessagePtr NewSimpleMessage(const T& data)
141  {
142  // todo: is_trivially_copyable not available on gcc < 5, workaround?
143  // static_assert(std::is_trivially_copyable<T>::value, "The argument type for NewSimpleMessage has to be trivially copyable!");
144  T* dataCopy = new T(data);
145  return CreateMessage(dataCopy, sizeof(T), FairMQSimpleMsgCleanup<T>, dataCopy);
146  }
147 
148  template<std::size_t N>
149  FairMQMessagePtr NewSimpleMessage(const char(&data)[N])
150  {
151  std::string* msgStr = new std::string(data);
152  return CreateMessage(const_cast<char*>(msgStr->c_str()), msgStr->length(), FairMQSimpleMsgCleanup<std::string>, msgStr);
153  }
154 
155  FairMQMessagePtr NewSimpleMessage(const std::string& str)
156  {
157 
158  std::string* msgStr = new std::string(str);
159  return CreateMessage(const_cast<char*>(msgStr->c_str()), msgStr->length(), FairMQSimpleMsgCleanup<std::string>, msgStr);
160  }
161 
162  template<typename T>
163  FairMQMessagePtr NewStaticMessage(const T& data)
164  {
165  return CreateMessage(data, sizeof(T), FairMQNoCleanup, nullptr);
166  }
167 
168  FairMQMessagePtr NewStaticMessage(const std::string& str)
169  {
170  return CreateMessage(const_cast<char*>(str.c_str()), str.length(), FairMQNoCleanup, nullptr);
171  }
172 };
173 
174 namespace fair::mq
175 {
176 
177 using TransportFactory = FairMQTransportFactory;
178 struct TransportFactoryError : std::runtime_error { using std::runtime_error::runtime_error; };
179 
180 } // namespace fair::mq
181 
182 #endif /* FAIRMQTRANSPORTFACTORY_H_ */
fair::mq::Alignment
Definition: FairMQMessage.h:25
fair::mq::ProgOptions
Definition: ProgOptions.h:41
FairMQTransportFactory::UnsubscribeFromRegionEvents
virtual void UnsubscribeFromRegionEvents()=0
Unsubscribe from region events.
FairMQTransportFactory::CreateMessage
virtual FairMQMessagePtr CreateMessage(fair::mq::Alignment alignment)=0
Create empty FairMQMessage (for receiving), align received buffer to specified alignment.
FairMQTransportFactory::CreatePoller
virtual FairMQPollerPtr CreatePoller(const std::unordered_map< std::string, std::vector< FairMQChannel >> &channelsMap, const std::vector< std::string > &channelList) const =0
Create a poller for specific channels (all subchannels)
fair::mq
Tools for interfacing containers to the transport via polymorphic allocators.
Definition: DeviceRunner.h:23
FairMQTransportFactory::CreateMessage
virtual FairMQMessagePtr CreateMessage(const size_t size)=0
Create new FairMQMessage of specified size.
FairMQTransportFactory::CreateMessage
virtual FairMQMessagePtr CreateMessage(const size_t size, fair::mq::Alignment alignment)=0
Create new FairMQMessage of specified size and alignment.
FairMQTransportFactory::CreateMessage
virtual FairMQMessagePtr CreateMessage(void *data, const size_t size, fairmq_free_fn *ffn, void *hint=nullptr)=0
Create new FairMQMessage with user provided buffer and size.
FairMQTransportFactory::FairMQTransportFactory
FairMQTransportFactory(const std::string &id)
Definition: FairMQTransportFactory.cxx:26
FairMQTransportFactory::CreateMessage
virtual FairMQMessagePtr CreateMessage(FairMQUnmanagedRegionPtr &unmanagedRegion, void *data, const size_t size, void *hint=0)=0
create a message with the buffer located within the corresponding unmanaged region
FairMQTransportFactory::GetMemoryResource
fair::mq::ChannelResource * GetMemoryResource()
Get a pointer to the associated polymorphic memory resource.
Definition: FairMQTransportFactory.h:46
FairMQTransportFactory::CreateSocket
virtual FairMQSocketPtr CreateSocket(const std::string &type, const std::string &name)=0
Create a socket.
fair::mq::ChannelResource
Definition: MemoryResources.h:58
FairMQTransportFactory::GetType
virtual fair::mq::Transport GetType() const =0
Get transport type.
FairMQTransportFactory::CreateUnmanagedRegion
virtual FairMQUnmanagedRegionPtr CreateUnmanagedRegion(const size_t size, const int64_t userFlags, FairMQRegionCallback callback=nullptr, const std::string &path="", int flags=0)=0
Create new UnmanagedRegion.
FairMQTransportFactory::CreatePoller
virtual FairMQPollerPtr CreatePoller(const std::vector< FairMQChannel * > &channels) const =0
Create a poller for specific channels.
FairMQTransportFactory::CreatePoller
virtual FairMQPollerPtr CreatePoller(const std::vector< FairMQChannel > &channels) const =0
Create a poller for a single channel (all subchannels)
FairMQTransportFactory::CreateUnmanagedRegion
virtual FairMQUnmanagedRegionPtr CreateUnmanagedRegion(const size_t size, FairMQRegionCallback callback=nullptr, const std::string &path="", int flags=0)=0
Create new UnmanagedRegion.
FairMQChannel
Wrapper class for FairMQSocket and related methods.
Definition: FairMQChannel.h:35
FairMQTransportFactory::CreateMessage
virtual FairMQMessagePtr CreateMessage()=0
Create empty FairMQMessage (for receiving)
FairMQTransportFactory::SubscribeToRegionEvents
virtual void SubscribeToRegionEvents(FairMQRegionEventCallback callback)=0
Subscribe to region events (creation, destruction, ...)
fair::mq::TransportFactoryError
Definition: FairMQTransportFactory.h:178
FairMQTransportFactory
Definition: FairMQTransportFactory.h:30
FairMQTransportFactory::SubscribedToRegionEvents
virtual bool SubscribedToRegionEvents()=0
Check if there is an active subscription to region events.

privacy