Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / third_party / pigweed / repo / pw_rpc / public / pw_rpc / synchronized_channel_output.h
1 // Copyright 2020 The Pigweed Authors
2 //
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
5 // the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
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
13 // the License.
14 #pragma once
15
16 #include <algorithm>
17
18 #include "pw_rpc/channel.h"
19 #include "pw_sync/mutex.h"
20
21 namespace pw::rpc {
22
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 {
29  public:
30   template <typename... Args>
31   constexpr SynchronizedChannelOutput(sync::Mutex& mutex, Args&&... args)
32       : BaseChannelOutput(std::forward<Args>(args)...), mutex_(mutex) {}
33
34   std::span<std::byte> AcquireBuffer() final {
35     mutex_.lock();
36     return BaseChannelOutput::AcquireBuffer();
37   }
38
39   Status SendAndReleaseBuffer(std::span<const std::byte> buffer) final {
40     Status status = BaseChannelOutput::SendAndReleaseBuffer(buffer);
41     mutex_.unlock();
42     return status;
43   }
44
45  private:
46   sync::Mutex& mutex_;
47 };
48
49 }  // namespace pw::rpc