Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4fc32e04 authored by Prabir Pradhan's avatar Prabir Pradhan
Browse files

InputTracer: Add timestamp to perfetto trace packets

Use the event processing time as the packet timestamp for input events,
and use the delivery time as the packet timestamp for dispatch events.

Bug: 332714237
Bug: 210460522
Test: atest inputflinger_tests
Test: manual with perfetto
Change-Id: I30f4c21dfee68603d0dad01d205f8a5581e6db31
parent 33cfc6d2
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -879,7 +879,7 @@ std::pair<bool /*cancelPointers*/, bool /*cancelNonPointers*/> expandCancellatio
class ScopedSyntheticEventTracer {
public:
    ScopedSyntheticEventTracer(std::unique_ptr<trace::InputTracerInterface>& tracer)
          : mTracer(tracer) {
          : mTracer(tracer), mProcessingTimestamp(now()) {
        if (mTracer) {
            mEventTracker = mTracer->createTrackerForSyntheticEvent();
        }
@@ -887,7 +887,7 @@ public:

    ~ScopedSyntheticEventTracer() {
        if (mTracer) {
            mTracer->eventProcessingComplete(*mEventTracker);
            mTracer->eventProcessingComplete(*mEventTracker, mProcessingTimestamp);
        }
    }

@@ -896,8 +896,9 @@ public:
    }

private:
    std::unique_ptr<trace::InputTracerInterface>& mTracer;
    const std::unique_ptr<trace::InputTracerInterface>& mTracer;
    std::unique_ptr<trace::EventTrackerInterface> mEventTracker;
    const nsecs_t mProcessingTimestamp;
};

} // namespace
@@ -1263,7 +1264,7 @@ void InputDispatcher::dispatchOnceInnerLocked(nsecs_t& nextWakeupTime) {

        if (mTracer) {
            if (auto& traceTracker = getTraceTracker(*mPendingEvent); traceTracker != nullptr) {
                mTracer->eventProcessingComplete(*traceTracker);
                mTracer->eventProcessingComplete(*traceTracker, currentTime);
            }
        }

+6 −4
Original line number Diff line number Diff line
@@ -145,7 +145,8 @@ void InputTracer::dispatchToTargetHint(const EventTrackerInterface& cookie,
    eventState->metadata.isSecure |= targetInfo.isSecureWindow;
}

void InputTracer::eventProcessingComplete(const EventTrackerInterface& cookie) {
void InputTracer::eventProcessingComplete(const EventTrackerInterface& cookie,
                                          nsecs_t processingTimestamp) {
    if (isDerivedCookie(cookie)) {
        LOG(FATAL) << "Event processing cannot be set from a derived cookie.";
    }
@@ -154,7 +155,7 @@ void InputTracer::eventProcessingComplete(const EventTrackerInterface& cookie) {
        LOG(FATAL) << "Traced event was already logged. "
                      "eventProcessingComplete() was likely called more than once.";
    }
    eventState->onEventProcessingComplete();
    eventState->onEventProcessingComplete(processingTimestamp);
}

std::unique_ptr<EventTrackerInterface> InputTracer::traceDerivedEvent(
@@ -242,7 +243,8 @@ bool InputTracer::isDerivedCookie(const EventTrackerInterface& cookie) {

// --- InputTracer::EventState ---

void InputTracer::EventState::onEventProcessingComplete() {
void InputTracer::EventState::onEventProcessingComplete(nsecs_t processingTimestamp) {
    metadata.processingTimestamp = processingTimestamp;
    metadata.isImeConnectionActive = tracer.mIsImeConnectionActive;

    // Write all of the events known so far to the trace.
@@ -277,7 +279,7 @@ InputTracer::EventState::~EventState() {
    // We should never end up here in normal operation. However, in tests, it's possible that we
    // stop and destroy InputDispatcher without waiting for it to finish processing events, at
    // which point an event (and thus its EventState) may be destroyed before processing finishes.
    onEventProcessingComplete();
    onEventProcessingComplete(systemTime(CLOCK_MONOTONIC));
}

} // namespace android::inputdispatcher::trace::impl
+3 −2
Original line number Diff line number Diff line
@@ -44,7 +44,8 @@ public:
    std::unique_ptr<EventTrackerInterface> traceInboundEvent(const EventEntry&) override;
    std::unique_ptr<EventTrackerInterface> createTrackerForSyntheticEvent() override;
    void dispatchToTargetHint(const EventTrackerInterface&, const InputTarget&) override;
    void eventProcessingComplete(const EventTrackerInterface&) override;
    void eventProcessingComplete(const EventTrackerInterface&,
                                 nsecs_t processingTimestamp) override;
    std::unique_ptr<EventTrackerInterface> traceDerivedEvent(const EventEntry&,
                                                             const EventTrackerInterface&) override;
    void traceEventDispatch(const DispatchEntry&, const EventTrackerInterface&) override;
@@ -61,7 +62,7 @@ private:
        explicit inline EventState(InputTracer& tracer) : tracer(tracer){};
        ~EventState();

        void onEventProcessingComplete();
        void onEventProcessingComplete(nsecs_t processingTimestamp);

        InputTracer& tracer;
        std::vector<const TracedEvent> events;
+2 −1
Original line number Diff line number Diff line
@@ -81,7 +81,8 @@ public:
     * outside of our control, such as how long apps take to respond, so we don't want to depend on
     * that.
     */
    virtual void eventProcessingComplete(const EventTrackerInterface&) = 0;
    virtual void eventProcessingComplete(const EventTrackerInterface&,
                                         nsecs_t processingTimestamp) = 0;

    /**
     * Trace an input event that is derived from another event. This is used in cases where an event
+2 −0
Original line number Diff line number Diff line
@@ -99,6 +99,8 @@ struct TracedEventMetadata {
    std::set<gui::Uid> targets;
    // True if the there was an active input method connection while this event was processed.
    bool isImeConnectionActive;
    // The timestamp for when the dispatching decisions were made for the event by the system.
    nsecs_t processingTimestamp;
};

/** Additional information about an input event being dispatched to a window. */
Loading