| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MOJO_PUBLIC_CPP_SYSTEM_SCOPE_TO_MESSAGE_PIPE_H_ |
| #define MOJO_PUBLIC_CPP_SYSTEM_SCOPE_TO_MESSAGE_PIPE_H_ |
| |
| #include <memory> |
| |
| #include "base/bind.h" |
| #include "base/callback.h" |
| #include "base/macros.h" |
| #include "mojo/public/cpp/system/message_pipe.h" |
| #include "mojo/public/cpp/system/simple_watcher.h" |
| #include "mojo/public/cpp/system/system_export.h" |
| |
| namespace mojo { |
| |
| namespace internal { |
| |
| // Owns the state and details to implement ScopeToMessagePipe (see below). |
| class MOJO_CPP_SYSTEM_EXPORT MessagePipeScoperBase { |
| public: |
| explicit MessagePipeScoperBase(ScopedMessagePipeHandle pipe); |
| virtual ~MessagePipeScoperBase(); |
| |
| static void StartWatchingPipe(std::unique_ptr<MessagePipeScoperBase> scoper); |
| |
| private: |
| ScopedMessagePipeHandle pipe_; |
| SimpleWatcher pipe_watcher_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MessagePipeScoperBase); |
| }; |
| |
| template <typename T> |
| class MessagePipeScoper : public MessagePipeScoperBase { |
| public: |
| explicit MessagePipeScoper(T scoped_object, ScopedMessagePipeHandle pipe) |
| : MessagePipeScoperBase(std::move(pipe)), |
| scoped_object_(std::move(scoped_object)) {} |
| ~MessagePipeScoper() override = default; |
| |
| private: |
| T scoped_object_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MessagePipeScoper); |
| }; |
| |
| } // namespace internal |
| |
| // Binds the lifetime of |object| to that of |pipe|'s connection. When |pipe|'s |
| // peer is closed, |pipe| will be closed and |object| will be destroyed. This |
| // can be useful as a simple mechanism to track object lifetime across process |
| // boundaries. |
| template <typename T> |
| void ScopeToMessagePipe(T object, ScopedMessagePipeHandle pipe) { |
| internal::MessagePipeScoperBase::StartWatchingPipe( |
| std::make_unique<internal::MessagePipeScoper<T>>(std::move(object), |
| std::move(pipe))); |
| } |
| |
| } // namespace mojo |
| |
| #endif // MOJO_PUBLIC_CPP_SYSTEM_SCOPE_TO_MESSAGE_PIPE_H_ |