Conscience Core
async.h
Go to the documentation of this file.
1 #ifndef util_async_H
2 #define util_async_H
3 
4 #include "conscience_util.h"
5 #include "system.h"
6 #include <ctime>
7 #include <future>
8 #include <mutex>
9 #include <condition_variable>
10 #include <thread>
11 
12 using std::future, std::condition_variable, std::thread, std::mutex, std::future_status, std::lock_guard, std::chrono_literals::operator""ms, std::shared_ptr, std::make_shared;
13 
14 using namespace conscience_utils::systemutils;
15 
16 namespace conscience_utils::async {
17 
18 template <typename TFutureResult>
19 inline bool isFutureDone(future<TFutureResult> &f) {
20  return f.wait_for(0ms) == future_status::ready;
21 }
22 struct DebouceState {
23  future<void> *futurePtr = nullptr;
24  mutex futureMutex;
25  unsigned long long expectedEndTimestampMillis;
26 };
27 
28 template <typename... TArgs>
29 function<void(TArgs...)> debounce(function<void(TArgs...)> f, int periodMillis) {
30  auto state = make_shared<DebouceState>();
31  function<void(TArgs...)> fn = [f, periodMillis, state](TArgs... args) {
32  const lock_guard<mutex> lock(state->futureMutex);
33 
34  if (state->futurePtr != nullptr && isFutureDone(*state->futurePtr)) {
35  delete state->futurePtr;
36  state->futurePtr = nullptr;
37  }
38  if (state->futurePtr == nullptr) {
39 
40  auto callWithWait = std::bind(
41  [&, f, periodMillis, state](TArgs... args) {
42  sleepMillis(periodMillis);
43  while (nowMillis() < state->expectedEndTimestampMillis) {
44  sleepMillis(state->expectedEndTimestampMillis - nowMillis());
45  }
46  f(args...);
47  },
48  args...);
49  state->futurePtr = new future<void>(std::move(std::async(std::launch::async, callWithWait)));
50  }
51  state->expectedEndTimestampMillis = nowMillis() + periodMillis;
52  };
53  return fn;
54 }
55 
59 class CscTimer {
60 public:
61  CscTimer(double timeout);
62  double elapsed();
63  bool timeoutReached();
64  void reset();
65 
66 private:
67  timespec beginTime, lastMeasuredTime;
68  double timeout;
69 };
70 
71 bool executeWithTimeout(const function<void()> &action, std::chrono::milliseconds timeoutMillis);
72 
73 }
74 
75 #endif
conscience_util.h
conscience_utils::async
Definition: CscEntityReflexion.h:50
conscience_utils::async::executeWithTimeout
bool executeWithTimeout(const function< void()> &action, std::chrono::milliseconds timeoutMillis)
Definition: async.cpp:64
conscience_utils::systemutils
Definition: system.cpp:37
conscience_utils::nowMillis
unsigned long long nowMillis()
Definition: conscience_util.cpp:294
conscience_utils::async::CscTimer
Definition: async.h:59
conscience_utils::async::DebouceState
Definition: async.h:22
conscience_utils::async::DebouceState::futureMutex
mutex futureMutex
Definition: async.h:24
conscience_utils::async::debounce
function< void(TArgs...)> debounce(function< void(TArgs...)> f, int periodMillis)
Definition: async.h:29
conscience_utils::async::isFutureDone
bool isFutureDone(future< TFutureResult > &f)
Definition: async.h:19
nlohmann::detail::void
j template void())
Definition: json.hpp:4189
system.h
conscience_utils::async::DebouceState::expectedEndTimestampMillis
unsigned long long expectedEndTimestampMillis
Definition: async.h:25
f
double f
Definition: HybridAStar.cpp:190