FairMQ  1.3.8
C++ Message Passing Framework
Context.h
1 /********************************************************************************
2  * Copyright (C) 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 FAIR_MQ_OFI_CONTEXT_H
10 #define FAIR_MQ_OFI_CONTEXT_H
11 
12 #include <boost/asio.hpp>
13 #include <memory>
14 #include <netinet/in.h>
15 #include <ostream>
16 #include <rdma/fabric.h>
17 #include <stdexcept>
18 #include <string>
19 #include <thread>
20 #include <vector>
21 
22 namespace fair
23 {
24 namespace mq
25 {
26 namespace ofi
27 {
28 
29 enum class ConnectionType : bool { Bind, Connect };
30 enum class Direction : bool { Receive, Transmit };
31 
38 class Context
39 {
40  public:
41  Context(int numberIoThreads = 2);
42  ~Context();
43 
44  auto CreateOfiEndpoint() -> fid_ep*;
45  auto CreateOfiCompletionQueue(Direction dir) -> fid_cq*;
46  auto GetZmqVersion() const -> std::string;
47  auto GetOfiApiVersion() const -> std::string;
48  auto GetPbVersion() const -> std::string;
49  auto GetBoostVersion() const -> std::string;
50  auto GetZmqContext() const -> void* { return fZmqContext; }
51  auto GetIoContext() -> boost::asio::io_service& { return fIoContext; }
52  auto InsertAddressVector(sockaddr_in address) -> fi_addr_t;
53  auto AddressVectorLookup(fi_addr_t address) -> sockaddr_in;
54  struct Address {
55  std::string Protocol;
56  std::string Ip;
57  unsigned int Port;
58  friend auto operator<<(std::ostream& os, const Address& a) -> std::ostream& { return os << a.Protocol << "://" << a.Ip << ":" << a.Port; }
59  };
60  auto InitOfi(ConnectionType type, Address address) -> void;
61  static auto ConvertAddress(std::string address) -> Address;
62  static auto ConvertAddress(Address address) -> sockaddr_in;
63  static auto ConvertAddress(sockaddr_in address) -> Address;
64  static auto VerifyAddress(const std::string& address) -> Address;
65 
66  private:
67  void* fZmqContext;
68  fi_info* fOfiInfo;
69  fid_fabric* fOfiFabric;
70  fid_domain* fOfiDomain;
71  fid_av* fOfiAddressVector;
72  fid_eq* fOfiEventQueue;
73  boost::asio::io_service fIoContext;
74  boost::asio::io_service::work fIoWork;
75  std::vector<std::thread> fThreadPool;
76 
77  auto OpenOfiFabric() -> void;
78  auto OpenOfiEventQueue() -> void;
79  auto OpenOfiDomain() -> void;
80  auto OpenOfiAddressVector() -> void;
81  auto InitThreadPool(int numberIoThreads) -> void;
82 }; /* class Context */
83 
84 struct ContextError : std::runtime_error { using std::runtime_error::runtime_error; };
85 
86 } /* namespace ofi */
87 } /* namespace mq */
88 } /* namespace fair */
89 
90 #endif /* FAIR_MQ_OFI_CONTEXT_H */
Transport-wide context.
Definition: Context.h:38
Definition: Context.h:84
Definition: Context.h:54
Tools for interfacing containers to the transport via polymorphic allocators.
Definition: DeviceRunner.h:23

privacy