hyperledger/iroha
Iroha - A simple, decentralized ledger http://iroha.tech
common.hpp
Go to the documentation of this file.
1 
6 #ifndef IROHA_LIBS_COMMON_HPP
7 #define IROHA_LIBS_COMMON_HPP
8 
9 #include <chrono>
10 #include <mutex>
11 #include <shared_mutex>
12 
13 namespace iroha::utils {
14 
15  template <typename To, typename From>
16  inline std::shared_ptr<To> reinterpret_pointer_cast(
17  std::shared_ptr<From> const &ptr) noexcept {
18  return std::shared_ptr<To>(ptr, reinterpret_cast<To *>(ptr.get()));
19  }
20 
21  template <typename T>
22  inline std::weak_ptr<T> make_weak(std::shared_ptr<T> const &ptr) noexcept {
23  return ptr;
24  }
25 
26  struct NoCopy {
27  NoCopy(NoCopy const &) = delete;
28  NoCopy &operator=(NoCopy const &) = delete;
29  NoCopy() = default;
30  };
31 
32  struct NoMove {
33  NoMove(NoMove &&) = delete;
34  NoMove &operator=(NoMove &&) = delete;
35  NoMove() = default;
36  };
37 
38  // clang-format off
62  // clang-format on
63  template <typename T>
64  struct ReadWriteObject {
65  template <typename... Args>
66  ReadWriteObject(Args &&... args) : t_(std::forward<Args>(args)...) {}
67 
68  template <typename F>
69  inline auto exclusiveAccess(F &&f) {
70  std::unique_lock lock(cs_);
71  return std::forward<F>(f)(t_);
72  }
73 
74  template <typename F>
75  inline auto sharedAccess(F &&f) const {
76  std::shared_lock lock(cs_);
77  return std::forward<F>(f)(t_);
78  }
79 
80  private:
81  T t_;
82  mutable std::shared_mutex cs_;
83  };
84 
86  std::condition_variable wait_cv_;
87  std::mutex wait_m_;
88  bool flag_;
89 
90  public:
91  WaitForSingleObject() : flag_{true} {}
92 
93  bool wait(std::chrono::microseconds wait_timeout) {
94  std::unique_lock<std::mutex> _lock(wait_m_);
95  return wait_cv_.wait_for(_lock, wait_timeout, [&]() {
96  auto prev = !flag_;
97  flag_ = true;
98  return prev;
99  });
100  }
101 
102  void wait() {
103  std::unique_lock<std::mutex> _lock(wait_m_);
104  wait_cv_.wait(_lock, [&]() {
105  auto prev = !flag_;
106  flag_ = true;
107  return prev;
108  });
109  }
110 
111  void set() {
112  {
113  std::unique_lock<std::mutex> _lock(wait_m_);
114  flag_ = false;
115  }
116  wait_cv_.notify_one();
117  }
118  };
119 } // namespace iroha::utils
120 
121 #endif // IROHA_LIBS_COMMON_HPP
WaitForSingleObject()
Definition: common.hpp:91
NoCopy & operator=(NoCopy const &)=delete
Definition: common.hpp:13
Definition: round.cpp:51
auto sharedAccess(F &&f) const
Definition: common.hpp:75
Definition: common.hpp:26
void wait()
Definition: common.hpp:102
ReadWriteObject(Args &&... args)
Definition: common.hpp:66
bool wait(std::chrono::microseconds wait_timeout)
Definition: common.hpp:93
auto exclusiveAccess(F &&f)
Definition: common.hpp:69
Definition: common.hpp:85
Definition: common.hpp:64
std::shared_ptr< To > reinterpret_pointer_cast(std::shared_ptr< From > const &ptr) noexcept
Definition: common.hpp:16
Definition: common.hpp:32
std::weak_ptr< T > make_weak(std::shared_ptr< T > const &ptr) noexcept
Definition: common.hpp:22