@@ -18,10 +18,14 @@ namespace ugrpc::client::impl {
1818
1919ugrpc::impl::AsyncMethodInvocation::WaitStatus WaitAndTryCancelIfNeeded (
2020 ugrpc::impl::AsyncMethodInvocation& invocation,
21- grpc::ClientContext& context
21+ grpc::ClientContext& client_context
2222) noexcept ;
2323
24- void CheckOk (StreamingCallState& state, ugrpc::impl::AsyncMethodInvocation::WaitStatus status, std::string_view stage);
24+ void CheckOk (
25+ StreamingCallState& state,
26+ ugrpc::impl::AsyncMethodInvocation::WaitStatus wait_status,
27+ std::string_view stage
28+ );
2529
2630void CheckFinishStatus (CallState& state);
2731
@@ -33,13 +37,13 @@ void ProcessCancelled(CallState& state, std::string_view stage) noexcept;
3337
3438void ProcessNetworkError (CallState& state, std::string_view stage) noexcept ;
3539
36- void ThrowIfDeadlineIsExceeded (grpc::ClientContext& context , std::string_view call_name);
40+ void ThrowIfDeadlineIsExceeded (grpc::ClientContext& client_context , std::string_view call_name);
3741
3842template <typename GrpcStream>
3943void StartCall (GrpcStream& stream, StreamingCallState& state) {
40- ugrpc::impl::AsyncMethodInvocation start_call ;
41- stream.StartCall (start_call .GetCompletionTag ());
42- CheckOk (state, WaitAndTryCancelIfNeeded (start_call , state.GetClientContext ()), " StartCall" );
44+ ugrpc::impl::AsyncMethodInvocation invocation ;
45+ stream.StartCall (invocation .GetCompletionTag ());
46+ CheckOk (state, WaitAndTryCancelIfNeeded (invocation , state.GetClientContext ()), " StartCall" );
4347}
4448
4549template <typename GrpcStream>
@@ -53,14 +57,13 @@ void Finish(
5357
5458 state.SetFinished ();
5559
56- FinishAsyncMethodInvocation finish ;
57- auto & status = state.GetStatus ();
58- stream. Finish (&status, finish. GetCompletionTag ());
60+ FinishAsyncMethodInvocation invocation ;
61+ stream. Finish (& state.GetStatus (), invocation. GetCompletionTag () );
62+ const auto wait_status = WaitAndTryCancelIfNeeded (invocation, state. GetClientContext ());
5963
60- const auto wait_status = WaitAndTryCancelIfNeeded (finish, state.GetClientContext ());
6164 switch (wait_status) {
6265 case ugrpc::impl::AsyncMethodInvocation::WaitStatus::kOk :
63- state.GetStatsScope ().SetFinishTime (finish .GetFinishTime ());
66+ state.GetStatsScope ().SetFinishTime (invocation .GetFinishTime ());
6467 try {
6568 ProcessFinish (state, final_response);
6669 } catch (const std::exception& ex) {
@@ -76,7 +79,7 @@ void Finish(
7679 break ;
7780
7881 case ugrpc::impl::AsyncMethodInvocation::WaitStatus::kError :
79- state.GetStatsScope ().SetFinishTime (finish .GetFinishTime ());
82+ state.GetStatsScope ().SetFinishTime (invocation .GetFinishTime ());
8083 ProcessNetworkError (state, " Finish" );
8184 if (throw_on_error) {
8285 ThrowIfDeadlineIsExceeded (state.GetClientContext (), state.GetCallName ());
@@ -107,24 +110,16 @@ void FinishAbandoned(GrpcStream& stream, StreamingCallState& state) noexcept try
107110
108111 state.GetClientContext ().TryCancel ();
109112
110- FinishAsyncMethodInvocation finish;
111- stream.Finish (&state.GetStatus (), finish.GetCompletionTag ());
112-
113- const engine::TaskCancellationBlocker cancel_blocker;
114- const auto wait_status = finish.Wait ();
113+ FinishAsyncMethodInvocation invocation;
114+ stream.Finish (&state.GetStatus (), invocation.GetCompletionTag ());
115+ const auto ok = invocation.WaitNonCancellable ();
115116
116- state.GetStatsScope ().SetFinishTime (finish .GetFinishTime ());
117+ state.GetStatsScope ().SetFinishTime (invocation .GetFinishTime ());
117118
118- switch (wait_status) {
119- case ugrpc::impl::AsyncMethodInvocation::WaitStatus::kOk :
120- ProcessFinishAbandoned (state);
121- break ;
122- case ugrpc::impl::AsyncMethodInvocation::WaitStatus::kError :
123- ProcessNetworkError (state, " Finish" );
124- break ;
125- case ugrpc::impl::AsyncMethodInvocation::WaitStatus::kCancelled :
126- case ugrpc::impl::AsyncMethodInvocation::WaitStatus::kDeadline :
127- UINVARIANT (false , " unreachable" );
119+ if (ok) {
120+ ProcessFinishAbandoned (state);
121+ } else {
122+ ProcessNetworkError (state, " Finish" );
128123 }
129124} catch (const std::exception& ex) {
130125 LOG_WARNING () << " There is a caught exception in 'FinishAbandoned': " << ex;
@@ -133,9 +128,9 @@ void FinishAbandoned(GrpcStream& stream, StreamingCallState& state) noexcept try
133128template <typename GrpcStream, typename Response>
134129[[nodiscard]] bool Read (GrpcStream& stream, Response& response, StreamingCallState& state) {
135130 UINVARIANT (IsReadAvailable (state), " 'impl::Read' called on a finished call" );
136- ugrpc::impl::AsyncMethodInvocation read ;
137- stream.Read (&response, read .GetCompletionTag ());
138- const auto wait_status = WaitAndTryCancelIfNeeded (read , state.GetClientContext ());
131+ ugrpc::impl::AsyncMethodInvocation invocation ;
132+ stream.Read (&response, invocation .GetCompletionTag ());
133+ const auto wait_status = WaitAndTryCancelIfNeeded (invocation , state.GetClientContext ());
139134 if (wait_status == ugrpc::impl::AsyncMethodInvocation::WaitStatus::kCancelled ) {
140135 state.GetStatsScope ().OnCancelled ();
141136 }
@@ -146,8 +141,8 @@ template <typename GrpcStream, typename Response>
146141void ReadAsync (GrpcStream& stream, Response& response, StreamingCallState& state) {
147142 UINVARIANT (IsReadAvailable (state), " 'impl::Read' called on a finished call" );
148143 state.EmplaceAsyncMethodInvocation ();
149- auto & read = state.GetAsyncMethodInvocation ();
150- stream.Read (&response, read .GetCompletionTag ());
144+ auto & invocation = state.GetAsyncMethodInvocation ();
145+ stream.Read (&response, invocation .GetCompletionTag ());
151146}
152147
153148template <typename GrpcStream, typename Request>
@@ -160,16 +155,16 @@ bool Write(GrpcStream& stream, const Request& request, grpc::WriteOptions option
160155
161156 UINVARIANT (IsWriteAvailable (state), " 'impl::Write' called on a stream that is closed for writes" );
162157
163- ugrpc::impl::AsyncMethodInvocation write ;
164- stream.Write (request, options, write .GetCompletionTag ());
165- const auto result = WaitAndTryCancelIfNeeded (write , state.GetClientContext ());
166- if (result == ugrpc::impl::AsyncMethodInvocation::WaitStatus::kCancelled ) {
158+ ugrpc::impl::AsyncMethodInvocation invocation ;
159+ stream.Write (request, options, invocation .GetCompletionTag ());
160+ const auto wait_status = WaitAndTryCancelIfNeeded (invocation , state.GetClientContext ());
161+ if (wait_status == ugrpc::impl::AsyncMethodInvocation::WaitStatus::kCancelled ) {
167162 state.GetStatsScope ().OnCancelled ();
168163 }
169- if (result != ugrpc::impl::AsyncMethodInvocation::WaitStatus::kOk ) {
164+ if (wait_status != ugrpc::impl::AsyncMethodInvocation::WaitStatus::kOk ) {
170165 state.SetWritesFinished ();
171166 }
172- return result == ugrpc::impl::AsyncMethodInvocation::WaitStatus::kOk ;
167+ return wait_status == ugrpc::impl::AsyncMethodInvocation::WaitStatus::kOk ;
173168}
174169
175170template <typename GrpcStream, typename Request>
@@ -182,9 +177,9 @@ void WriteAndCheck(GrpcStream& stream, const Request& request, grpc::WriteOption
182177
183178 UINVARIANT (IsWriteAndCheckAvailable (state), " 'impl::WriteAndCheck' called on a finished or closed stream" );
184179
185- ugrpc::impl::AsyncMethodInvocation write ;
186- stream.Write (request, options, write .GetCompletionTag ());
187- CheckOk (state, WaitAndTryCancelIfNeeded (write , state.GetClientContext ()), " WriteAndCheck" );
180+ ugrpc::impl::AsyncMethodInvocation invocation ;
181+ stream.Write (request, options, invocation .GetCompletionTag ());
182+ CheckOk (state, WaitAndTryCancelIfNeeded (invocation , state.GetClientContext ()), " WriteAndCheck" );
188183}
189184
190185template <typename GrpcStream>
@@ -197,9 +192,9 @@ bool WritesDone(GrpcStream& stream, StreamingCallState& state) {
197192
198193 UINVARIANT (IsWriteAvailable (state), " 'impl::WritesDone' called on a stream that is closed for writes" );
199194 state.SetWritesFinished ();
200- ugrpc::impl::AsyncMethodInvocation writes_done ;
201- stream.WritesDone (writes_done .GetCompletionTag ());
202- const auto wait_status = WaitAndTryCancelIfNeeded (writes_done , state.GetClientContext ());
195+ ugrpc::impl::AsyncMethodInvocation invocation ;
196+ stream.WritesDone (invocation .GetCompletionTag ());
197+ const auto wait_status = WaitAndTryCancelIfNeeded (invocation , state.GetClientContext ());
203198 if (wait_status == ugrpc::impl::AsyncMethodInvocation::WaitStatus::kCancelled ) {
204199 state.GetStatsScope ().OnCancelled ();
205200 }
0 commit comments