1 // Copyright 2020 The Pigweed Authors
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
7 // https://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
18 #include "pw_rpc/channel.h"
19 #include "pw_sync/mutex.h"
23 // Wraps an RPC ChannelOutput implementation with a mutex to synchronize its
24 // acquire and release buffer operations. This can be used to allow a simple
25 // ChannelOutput implementation to run in multi-threaded contexts. More complex
26 // implementations may want to roll their own synchronization.
27 template <typename BaseChannelOutput>
28 class SynchronizedChannelOutput final : public BaseChannelOutput {
30 template <typename... Args>
31 constexpr SynchronizedChannelOutput(sync::Mutex& mutex, Args&&... args)
32 : BaseChannelOutput(std::forward<Args>(args)...), mutex_(mutex) {}
34 std::span<std::byte> AcquireBuffer() final {
36 return BaseChannelOutput::AcquireBuffer();
39 Status SendAndReleaseBuffer(std::span<const std::byte> buffer) final {
40 Status status = BaseChannelOutput::SendAndReleaseBuffer(buffer);
49 } // namespace pw::rpc