12
12
#include < boost/redis/error.hpp>
13
13
#include < boost/asio/compose.hpp>
14
14
#include < boost/asio/coroutine.hpp>
15
- #include < boost/asio/experimental/parallel_group.hpp>
16
15
#include < boost/asio/ip/tcp.hpp>
17
- #include < boost/asio/steady_timer .hpp>
16
+ #include < boost/asio/cancel_after .hpp>
18
17
#include < string>
19
18
#include < chrono>
20
19
@@ -28,66 +27,29 @@ struct resolve_op {
28
27
29
28
template <class Self >
30
29
void operator ()( Self& self
31
- , std::array<std::size_t , 2 > order = {}
32
- , system::error_code ec1 = {}
33
- , asio::ip::tcp::resolver::results_type res = {}
34
- , system::error_code ec2 = {})
30
+ , system::error_code ec = {}
31
+ , asio::ip::tcp::resolver::results_type res = {})
35
32
{
36
33
BOOST_ASIO_CORO_REENTER (coro)
37
34
{
38
- resv_->timer_ .expires_after (resv_->timeout_ );
39
-
40
35
BOOST_ASIO_CORO_YIELD
41
- asio::experimental::make_parallel_group (
42
- [this ](auto token)
43
- {
44
- return resv_->resv_ .async_resolve (resv_->addr_ .host , resv_->addr_ .port , token);
45
- },
46
- [this ](auto token) { return resv_->timer_ .async_wait (token);}
47
- ).async_wait (
48
- asio::experimental::wait_for_one (),
49
- std::move (self));
50
-
51
- if (is_cancelled (self)) {
52
- self.complete (asio::error::operation_aborted);
53
- return ;
54
- }
55
-
56
- switch (order[0 ]) {
57
- case 0 : {
58
- // Resolver completed first.
59
- resv_->results_ = res;
60
- self.complete (ec1);
61
- } break ;
62
-
63
- case 1 : {
64
- if (ec2) {
65
- // Timer completed first with error, perhaps a
66
- // cancellation going on.
67
- self.complete (ec2);
68
- } else {
69
- // Timer completed first without an error, this is a
70
- // resolve timeout.
71
- self.complete (error::resolve_timeout);
72
- }
73
- } break ;
74
-
75
- default : BOOST_ASSERT (false );
76
- }
36
+ resv_->resv_ .async_resolve (
37
+ resv_->addr_ .host ,
38
+ resv_->addr_ .port ,
39
+ asio::cancel_after (resv_->timeout_ , std::move (self)));
40
+
41
+ resv_->results_ = res;
42
+
43
+ // TODO: map operation_canceled into error::resolve_timeout
44
+ self.complete (ec);
77
45
}
78
46
}
79
47
};
80
48
81
49
template <class Executor >
82
50
class resolver {
83
51
public:
84
- using timer_type =
85
- asio::basic_waitable_timer<
86
- std::chrono::steady_clock,
87
- asio::wait_traits<std::chrono::steady_clock>,
88
- Executor>;
89
-
90
- resolver (Executor ex) : resv_{ex} , timer_{ex} {}
52
+ resolver (Executor ex) : resv_{ex} {}
91
53
92
54
template <class CompletionToken >
93
55
auto async_resolve (CompletionToken&& token)
@@ -104,7 +66,6 @@ class resolver {
104
66
case operation::resolve:
105
67
case operation::all:
106
68
resv_.cancel ();
107
- timer_.cancel ();
108
69
break ;
109
70
default : /* ignore */ ;
110
71
}
@@ -126,7 +87,6 @@ class resolver {
126
87
template <class > friend struct resolve_op ;
127
88
128
89
resolver_type resv_;
129
- timer_type timer_;
130
90
address addr_;
131
91
std::chrono::steady_clock::duration timeout_;
132
92
asio::ip::tcp::resolver::results_type results_;
0 commit comments