72 lines
2.1 KiB
C++
72 lines
2.1 KiB
C++
// Copyright 2021 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_rpc/internal/client_call.h"
|
|
|
|
namespace pw::rpc::internal {
|
|
|
|
void ClientCall::CloseClientCall() {
|
|
if (client_stream_open()) {
|
|
CloseClientStreamLocked().IgnoreError();
|
|
}
|
|
UnregisterAndMarkClosed();
|
|
}
|
|
|
|
void ClientCall::MoveClientCallFrom(ClientCall& other)
|
|
PW_EXCLUSIVE_LOCKS_REQUIRED(rpc_lock()) {
|
|
WaitUntilReadyForMove(*this, other);
|
|
CloseClientCall();
|
|
MoveFrom(other);
|
|
}
|
|
|
|
void UnaryResponseClientCall::HandleCompleted(
|
|
ConstByteSpan response, Status status) PW_NO_LOCK_SAFETY_ANALYSIS {
|
|
UnregisterAndMarkClosed();
|
|
|
|
auto on_completed_local = std::move(on_completed_);
|
|
CallbackStarted();
|
|
|
|
// The lock is only released when calling into user code. If the callback is
|
|
// wrapped, this on_completed is an internal function that expects the lock to
|
|
// be held, and releases it before invoking user code.
|
|
if (!hold_lock_while_invoking_callback_with_payload()) {
|
|
rpc_lock().unlock();
|
|
}
|
|
|
|
if (on_completed_local) {
|
|
on_completed_local(response, status);
|
|
}
|
|
|
|
// This mutex lock could be avoided by making callbacks_executing_ atomic.
|
|
RpcLockGuard lock;
|
|
CallbackFinished();
|
|
}
|
|
|
|
void StreamResponseClientCall::HandleCompleted(Status status) {
|
|
UnregisterAndMarkClosed();
|
|
auto on_completed_local = std::move(on_completed_);
|
|
CallbackStarted();
|
|
rpc_lock().unlock();
|
|
|
|
if (on_completed_local) {
|
|
on_completed_local(status);
|
|
}
|
|
|
|
// This mutex lock could be avoided by making callbacks_executing_ atomic.
|
|
RpcLockGuard lock;
|
|
CallbackFinished();
|
|
}
|
|
|
|
} // namespace pw::rpc::internal
|