xref: /openbmc/telemetry/src/utils/detached_timer.hpp (revision b5645947c66135d64c016b7cbc8aee392deb1822)
1*b5645947SKrzysztof Grobelny #pragma once
2*b5645947SKrzysztof Grobelny 
3*b5645947SKrzysztof Grobelny #include <boost/asio/io_context.hpp>
4*b5645947SKrzysztof Grobelny #include <boost/asio/spawn.hpp>
5*b5645947SKrzysztof Grobelny #include <boost/asio/steady_timer.hpp>
6*b5645947SKrzysztof Grobelny 
7*b5645947SKrzysztof Grobelny #include <chrono>
8*b5645947SKrzysztof Grobelny 
9*b5645947SKrzysztof Grobelny namespace utils
10*b5645947SKrzysztof Grobelny {
11*b5645947SKrzysztof Grobelny 
12*b5645947SKrzysztof Grobelny template <class F>
13*b5645947SKrzysztof Grobelny void makeDetachedTimer(boost::asio::io_context& ioc,
14*b5645947SKrzysztof Grobelny                        std::chrono::milliseconds delay, F&& fun)
15*b5645947SKrzysztof Grobelny {
16*b5645947SKrzysztof Grobelny     auto timer = std::make_unique<boost::asio::steady_timer>(ioc);
17*b5645947SKrzysztof Grobelny     timer->expires_after(delay);
18*b5645947SKrzysztof Grobelny     timer->async_wait([timer = std::move(timer),
19*b5645947SKrzysztof Grobelny                        fun = std::move(fun)](boost::system::error_code ec) {
20*b5645947SKrzysztof Grobelny         if (ec)
21*b5645947SKrzysztof Grobelny         {
22*b5645947SKrzysztof Grobelny             return;
23*b5645947SKrzysztof Grobelny         }
24*b5645947SKrzysztof Grobelny         fun();
25*b5645947SKrzysztof Grobelny     });
26*b5645947SKrzysztof Grobelny }
27*b5645947SKrzysztof Grobelny 
28*b5645947SKrzysztof Grobelny } // namespace utils
29