|  | // Copyright 2023 The Pigweed Authors | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); you may not | 
|  | // use this file except in compliance with the License. You may obtain a copy of | 
|  | // the License at | 
|  | // | 
|  | //     https://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
|  | // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 
|  | // License for the specific language governing permissions and limitations under | 
|  | // the License. | 
|  |  | 
|  | #include "pw_async_bench/callback_impl.h" | 
|  |  | 
|  | namespace pw::async_bench { | 
|  |  | 
|  | pw::Status ProxyEchoImpl::Echo(EchoRequest request, EchoResponder responder) { | 
|  | // NOTE: this requires that `pw::Function` can capture the full `responder` | 
|  | // object as well as any associated state (including possibly `this`) | 
|  | // required for further steps. This also doesn't give us a way to cancel the | 
|  | // ongoing request if something in `ProxyEchoImpl` goes down. | 
|  | // | 
|  | // We're also assuming here that each `Echo` call stores some state in the | 
|  | // RPC system in order to track the ongoing call and the `pw::Function` we | 
|  | // gave it. | 
|  |  | 
|  | // We have to allocate because `responder` doesn't fit in pw::Function. | 
|  | auto responder_alloc = std::make_unique<EchoResponder>(std::move(responder)); | 
|  | pw::Status status = remote_->Echo( | 
|  | std::move(request), | 
|  | [responder_alloc = std::move(responder_alloc)]( | 
|  | pw::Result<EchoResponse> response) mutable -> void { | 
|  | // Ignore the result of the send. | 
|  | // | 
|  | // This, too, requires that the RPC system allocates storage for the | 
|  | // ongoing call and advances it. We also don't (naiively) have a way | 
|  | // to cancel the call without some kind of handle. | 
|  | responder_alloc->Send(std::move(response), [](pw::Status) {}) | 
|  | .IgnoreError(); | 
|  | }); | 
|  | if (status.ok()) { | 
|  | // WHat would we do here? We can't use `responder` if it has already been | 
|  | // moved into the callback above-- this stinks :( | 
|  | // responder.Send(std::move(status), [](pw::Status) {}).IgnoreError(); | 
|  | } | 
|  | return pw::OkStatus(); | 
|  | } | 
|  |  | 
|  | }  // namespace pw::async_bench |