1
1
#pragma once
2
2
#include < asyncpp/detail/std_import.h>
3
3
#include < asyncpp/grpc/calldata_interface.h>
4
+ #include < asyncpp/grpc/client_cq.h>
4
5
#include < asyncpp/grpc/traits.h>
5
6
#include < asyncpp/ptr_tag.h>
6
7
#include < grpcpp/impl/codegen/async_unary_call.h>
@@ -26,20 +27,26 @@ namespace asyncpp::grpc {
26
27
unary_call& operator =(const unary_call&) = delete ;
27
28
unary_call& operator =(unary_call&&) = delete ;
28
29
29
- auto operator ()(const typename traits::request_type& request, typename traits::response_type& response, ::grpc::CompletionQueue* cq) {
30
+ auto operator ()(const typename traits::request_type& request, typename traits::response_type& response, ::grpc::CompletionQueue* cq = nullptr ) {
30
31
struct awaiter : calldata_interface {
31
32
::grpc::ClientContext* m_context;
32
33
typename traits::service_type* m_stub;
33
34
const typename traits::request_type& m_request;
34
35
typename traits::response_type& m_response;
36
+ std::shared_ptr<client_cq> m_default_client_cq{};
35
37
::grpc::CompletionQueue* m_cq{};
36
38
typename traits::stream_type m_reader{};
37
39
::grpc::Status m_status{};
38
40
coroutine_handle<> m_handle{};
39
41
40
42
awaiter (::grpc::ClientContext* context, decltype(m_stub) s, const typename traits::request_type& request,
41
43
typename traits::response_type& response, ::grpc::CompletionQueue* cq)
42
- : m_context{context}, m_stub{s}, m_request{request}, m_response{response}, m_cq{cq} {}
44
+ : m_context{context}, m_stub{s}, m_request{request}, m_response{response}, m_cq{cq} {
45
+ if (m_cq == nullptr ) {
46
+ m_default_client_cq = client_cq::get_default ();
47
+ m_cq = &m_default_client_cq->cq ();
48
+ }
49
+ }
43
50
44
51
void handle_event ([[maybe_unused]] size_t evt, bool ok) noexcept override {
45
52
assert (evt == 0 );
@@ -53,7 +60,7 @@ namespace asyncpp::grpc {
53
60
m_handle = h;
54
61
55
62
m_reader = (m_stub->*FN)(m_context, m_request, m_cq);
56
- m_reader->Finish (&m_response, &m_status, this );
63
+ m_reader->Finish (&m_response, &m_status, ptr_tag< 0 , calldata_interface>( this ) );
57
64
}
58
65
::grpc::Status await_resume () noexcept { return m_status; }
59
66
};
@@ -77,28 +84,30 @@ namespace asyncpp::grpc {
77
84
typename traits::service_type* stub;
78
85
typename traits::stream_type stream{};
79
86
bool m_need_writes_done{false };
87
+ std::shared_ptr<client_cq> default_client_cq{};
88
+ ::grpc::CompletionQueue* cq{};
80
89
81
90
void destruct () {
82
91
if (stream) {
83
92
context->TryCancel ();
84
93
if constexpr (traits::is_client_streaming) {
85
94
if (m_need_writes_done) {
86
- stream->WritesDone (ptr_tag<0 >(this ));
95
+ stream->WritesDone (ptr_tag<0 , calldata_interface >(this ));
87
96
} else {
88
- stream->Finish (&m_exit_status, ptr_tag<1 >(this ));
97
+ stream->Finish (&m_exit_status, ptr_tag<1 , calldata_interface >(this ));
89
98
}
90
99
} else
91
- stream->Finish (&m_exit_status, ptr_tag<1 >(this ));
100
+ stream->Finish (&m_exit_status, ptr_tag<1 , calldata_interface >(this ));
92
101
} else {
93
102
delete this ;
94
103
}
95
104
}
96
105
97
106
private:
98
107
::grpc::Status m_exit_status{};
99
- void handle_event (size_t evt, bool ok) noexcept override {
108
+ void handle_event (size_t evt, [[maybe_unused]] bool ok) noexcept override {
100
109
if (evt == 0 ) {
101
- return stream->Finish (&m_exit_status, ptr_tag<1 >(this ));
110
+ return stream->Finish (&m_exit_status, ptr_tag<1 , calldata_interface >(this ));
102
111
} else {
103
112
stream.reset ();
104
113
context.reset ();
@@ -131,17 +140,22 @@ namespace asyncpp::grpc {
131
140
::grpc::ClientContext& context () noexcept { return *m_state->context ; }
132
141
const ::grpc::ClientContext& context () const noexcept { return *m_state->context ; }
133
142
134
- auto start (const typename traits::request_type& req, ::grpc::CompletionQueue* cq)
143
+ auto start (const typename traits::request_type& req, ::grpc::CompletionQueue* cq = nullptr )
135
144
requires(!traits::is_client_streaming && traits::is_server_streaming)
136
145
{
137
146
struct awaiter : calldata_interface {
138
147
state* m_state;
139
148
const typename traits::request_type& m_request{};
140
- ::grpc::CompletionQueue* m_cq{};
141
149
coroutine_handle<> m_handle{};
142
150
bool m_was_ok = false ;
143
151
144
- awaiter (state* state, const typename traits::request_type& req, ::grpc::CompletionQueue* cq) : m_state{state}, m_request{req}, m_cq{cq} {}
152
+ awaiter (state* state, const typename traits::request_type& req, ::grpc::CompletionQueue* cq) : m_state{state}, m_request{req} {
153
+ if (cq == nullptr ) {
154
+ m_state->default_client_cq = client_cq::get_default ();
155
+ cq = &m_state->default_client_cq ->cq ();
156
+ }
157
+ m_state->cq = cq;
158
+ }
145
159
146
160
void handle_event ([[maybe_unused]] size_t evt, bool ok) noexcept override {
147
161
assert (evt == 0 );
@@ -154,24 +168,29 @@ namespace asyncpp::grpc {
154
168
void await_suspend (coroutine_handle<> h) noexcept {
155
169
assert (m_state);
156
170
m_handle = h;
157
- m_state->stream = (m_state->stub ->*FN)(m_state->context .get (), m_request, m_cq, this );
171
+ m_state->stream = (m_state->stub ->*FN)(m_state->context .get (), m_request, m_state-> cq , ptr_tag< 0 , calldata_interface>( this ) );
158
172
}
159
173
bool await_resume () const noexcept { return m_was_ok; }
160
174
};
161
175
return awaiter{m_state.get (), req, cq};
162
176
}
163
177
164
- auto start (typename traits::response_type& resp, ::grpc::CompletionQueue* cq)
178
+ auto start (typename traits::response_type& resp, ::grpc::CompletionQueue* cq = nullptr )
165
179
requires(traits::is_client_streaming && !traits::is_server_streaming)
166
180
{
167
181
struct awaiter : calldata_interface {
168
182
state* m_state;
169
183
typename traits::response_type& m_response;
170
- ::grpc::CompletionQueue* m_cq{};
171
184
coroutine_handle<> m_handle{};
172
185
bool m_was_ok = false ;
173
186
174
- awaiter (state* state, typename traits::response_type& resp, ::grpc::CompletionQueue* cq) : m_state{state}, m_response{resp}, m_cq{cq} {}
187
+ awaiter (state* state, typename traits::response_type& resp, ::grpc::CompletionQueue* cq) : m_state{state}, m_response{resp} {
188
+ if (cq == nullptr ) {
189
+ m_state->default_client_cq = client_cq::get_default ();
190
+ cq = &m_state->default_client_cq ->cq ();
191
+ }
192
+ m_state->cq = cq;
193
+ }
175
194
176
195
void handle_event ([[maybe_unused]] size_t evt, bool ok) noexcept override {
177
196
assert (evt == 0 );
@@ -185,23 +204,28 @@ namespace asyncpp::grpc {
185
204
void await_suspend (coroutine_handle<> h) noexcept {
186
205
assert (m_state);
187
206
m_handle = h;
188
- m_state->stream = (m_state->stub ->*FN)(m_state->context .get (), &m_response, m_cq, this );
207
+ m_state->stream = (m_state->stub ->*FN)(m_state->context .get (), &m_response, m_state-> cq , ptr_tag< 0 , calldata_interface>( this ) );
189
208
}
190
209
bool await_resume () noexcept { return m_was_ok; }
191
210
};
192
211
return awaiter{m_state.get (), resp, cq};
193
212
}
194
213
195
- auto start (::grpc::CompletionQueue* cq)
214
+ auto start (::grpc::CompletionQueue* cq = nullptr )
196
215
requires(traits::is_client_streaming && traits::is_server_streaming)
197
216
{
198
217
struct awaiter : calldata_interface {
199
218
state* m_state;
200
- ::grpc::CompletionQueue* m_cq{};
201
219
coroutine_handle<> m_handle{};
202
220
bool m_was_ok = false ;
203
221
204
- awaiter (state* state, ::grpc::CompletionQueue* cq) : m_state{state}, m_cq{cq} {}
222
+ awaiter (state* state, ::grpc::CompletionQueue* cq) : m_state{state} {
223
+ if (cq == nullptr ) {
224
+ m_state->default_client_cq = client_cq::get_default ();
225
+ cq = &m_state->default_client_cq ->cq ();
226
+ }
227
+ m_state->cq = cq;
228
+ }
205
229
206
230
void handle_event ([[maybe_unused]] size_t evt, bool ok) noexcept override {
207
231
assert (evt == 0 );
@@ -215,7 +239,7 @@ namespace asyncpp::grpc {
215
239
void await_suspend (coroutine_handle<> h) noexcept {
216
240
assert (m_state);
217
241
m_handle = h;
218
- m_state->stream = (m_state->stub ->*FN)(m_state->context .get (), m_cq, this );
242
+ m_state->stream = (m_state->stub ->*FN)(m_state->context .get (), m_state-> cq , ptr_tag< 0 , calldata_interface>( this ) );
219
243
}
220
244
bool await_resume () noexcept { return m_was_ok; }
221
245
};
@@ -243,7 +267,7 @@ namespace asyncpp::grpc {
243
267
void await_suspend (coroutine_handle<> h) noexcept {
244
268
assert (m_state);
245
269
m_handle = h;
246
- m_state->stream ->Read (m_resp, this );
270
+ m_state->stream ->Read (m_resp, ptr_tag< 0 , calldata_interface>( this ) );
247
271
}
248
272
bool await_resume () noexcept { return m_was_ok; }
249
273
};
@@ -272,7 +296,7 @@ namespace asyncpp::grpc {
272
296
void await_suspend (coroutine_handle<> h) noexcept {
273
297
assert (m_state);
274
298
m_handle = h;
275
- m_state->stream ->Write (m_msg, this );
299
+ m_state->stream ->Write (m_msg, ptr_tag< 0 , calldata_interface>( this ) );
276
300
}
277
301
bool await_resume () noexcept { return m_was_ok; }
278
302
};
@@ -302,7 +326,7 @@ namespace asyncpp::grpc {
302
326
void await_suspend (coroutine_handle<> h) noexcept {
303
327
assert (m_state);
304
328
m_handle = h;
305
- m_state->stream ->WriteLast (m_msg, ::grpc::WriteOptions{}, this );
329
+ m_state->stream ->WriteLast (m_msg, ::grpc::WriteOptions{}, ptr_tag< 0 , calldata_interface>( this ) );
306
330
}
307
331
bool await_resume () noexcept { return m_was_ok; }
308
332
};
@@ -331,7 +355,7 @@ namespace asyncpp::grpc {
331
355
void await_suspend (coroutine_handle<> h) noexcept {
332
356
assert (m_state);
333
357
m_handle = h;
334
- m_state->stream ->WritesDone (this );
358
+ m_state->stream ->WritesDone (ptr_tag< 0 , calldata_interface>( this ) );
335
359
}
336
360
bool await_resume () noexcept { return m_was_ok; }
337
361
};
@@ -350,7 +374,7 @@ namespace asyncpp::grpc {
350
374
assert (m_handle);
351
375
if (!ok) m_status = ::grpc::Status (::grpc::StatusCode::UNKNOWN, " Event returned ok=false" );
352
376
switch (evt) {
353
- case 0 : return m_state->stream ->Finish (&m_status, asyncpp::ptr_tag<1 >(this )); break ;
377
+ case 0 : return m_state->stream ->Finish (&m_status, asyncpp::ptr_tag<1 , calldata_interface >(this )); break ;
354
378
case 1 : m_state->stream .reset (); break ;
355
379
default : assert (false ); break ;
356
380
}
@@ -362,12 +386,12 @@ namespace asyncpp::grpc {
362
386
m_handle = h;
363
387
if constexpr (traits::is_client_streaming) {
364
388
if (m_state->m_need_writes_done ) {
365
- m_state->stream ->WritesDone (ptr_tag<0 >(this ));
389
+ m_state->stream ->WritesDone (ptr_tag<0 , calldata_interface >(this ));
366
390
} else {
367
- m_state->stream ->Finish (&m_status, ptr_tag<1 >(this ));
391
+ m_state->stream ->Finish (&m_status, ptr_tag<1 , calldata_interface >(this ));
368
392
}
369
393
} else {
370
- m_state->stream ->Finish (&m_status, ptr_tag<1 >(this ));
394
+ m_state->stream ->Finish (&m_status, ptr_tag<1 , calldata_interface >(this ));
371
395
}
372
396
}
373
397
::grpc::Status await_resume () noexcept { return m_status; }
0 commit comments