// 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. #include "mojo/public/cpp/system/scope_to_message_pipe.h" namespace mojo { namespace internal { namespace { void OnWatcherSignaled(std::unique_ptr scoper, MojoResult result, const HandleSignalsState& state) { DCHECK(scoper); DCHECK_EQ(result, MOJO_RESULT_OK); DCHECK(state.peer_closed()); // No work to do except for letting |scoper| go out of scope and be destroyed. } } // namespace MessagePipeScoperBase::MessagePipeScoperBase(ScopedMessagePipeHandle pipe) : pipe_(std::move(pipe)), pipe_watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC) {} MessagePipeScoperBase::~MessagePipeScoperBase() = default; // static void MessagePipeScoperBase::StartWatchingPipe( std::unique_ptr scoper) { auto* unowned_scoper = scoper.get(); // NOTE: We intentionally use base::Passed here with the owned |scoper|. The // way we use it here, there is no way for the watcher callback to be invoked // more than once. If this expectation is ever violated, // base::RepeatingCallback will CHECK-fail. unowned_scoper->pipe_watcher_.Watch( unowned_scoper->pipe_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED, base::BindRepeating(&OnWatcherSignaled, base::Passed(&scoper))); } } // namespace internal } // namespace mojo