Commit 8fad6a91 authored by Ken Rockot's avatar Ken Rockot Committed by Commit Bot

[mojo] Add flow events for message pipe closure

Adds toplevel.flow trace events for message pipe closure to link the
closure of one endpoint to the detection of that closure by its peer
endpoint. This allows pipe closures to be followed like other IPC
message events, since pipe closure is often an important type of IPC
in itself.

Bug: None
Change-Id: I78c928972eddebef26c1ea9765dd697c17807f63
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1733786
Commit-Queue: Ken Rockot <rockot@google.com>
Reviewed-by: default avatarDaniel Murphy <dmurph@chromium.org>
Cr-Commit-Position: refs/heads/master@{#683723}
parent 6c574153
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/logging.h" #include "base/logging.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/trace_event/trace_event.h"
#include "mojo/core/core.h" #include "mojo/core/core.h"
#include "mojo/core/node_controller.h" #include "mojo/core/node_controller.h"
#include "mojo/core/ports/event.h" #include "mojo/core/ports/event.h"
...@@ -378,6 +379,10 @@ MojoResult MessagePipeDispatcher::CloseNoLock() { ...@@ -378,6 +379,10 @@ MojoResult MessagePipeDispatcher::CloseNoLock() {
if (!port_transferred_) { if (!port_transferred_) {
base::AutoUnlock unlock(signal_lock_); base::AutoUnlock unlock(signal_lock_);
node_controller_->ClosePort(port_); node_controller_->ClosePort(port_);
TRACE_EVENT_WITH_FLOW0(TRACE_DISABLED_BY_DEFAULT("toplevel.flow"),
"MessagePipe closing", pipe_id_ + endpoint_,
TRACE_EVENT_FLAG_FLOW_OUT);
} }
return MOJO_RESULT_OK; return MOJO_RESULT_OK;
...@@ -421,6 +426,18 @@ HandleSignalsState MessagePipeDispatcher::GetHandleSignalsStateNoLock() const { ...@@ -421,6 +426,18 @@ HandleSignalsState MessagePipeDispatcher::GetHandleSignalsStateNoLock() const {
} }
rv.satisfiable_signals |= rv.satisfiable_signals |=
MOJO_HANDLE_SIGNAL_PEER_CLOSED | MOJO_HANDLE_SIGNAL_QUOTA_EXCEEDED; MOJO_HANDLE_SIGNAL_PEER_CLOSED | MOJO_HANDLE_SIGNAL_QUOTA_EXCEEDED;
const bool was_peer_closed =
last_known_satisfied_signals_ & MOJO_HANDLE_SIGNAL_PEER_CLOSED;
const bool is_peer_closed =
rv.satisfied_signals & MOJO_HANDLE_SIGNAL_PEER_CLOSED;
last_known_satisfied_signals_ = rv.satisfied_signals;
if (is_peer_closed && !was_peer_closed) {
TRACE_EVENT_WITH_FLOW0(
TRACE_DISABLED_BY_DEFAULT("toplevel.flow"), "MessagePipe peer closed",
pipe_id_ + (1 - endpoint_), TRACE_EVENT_FLAG_FLOW_IN);
}
return rv; return rv;
} }
......
...@@ -101,6 +101,7 @@ class MessagePipeDispatcher : public Dispatcher { ...@@ -101,6 +101,7 @@ class MessagePipeDispatcher : public Dispatcher {
// BeginTransit() and Complete/CancelTransit(). // BeginTransit() and Complete/CancelTransit().
AtomicFlag in_transit_; AtomicFlag in_transit_;
mutable MojoHandleSignals last_known_satisfied_signals_ = 0;
bool port_transferred_ = false; bool port_transferred_ = false;
AtomicFlag port_closed_; AtomicFlag port_closed_;
WatcherSet watchers_; WatcherSet watchers_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment