Files
react-native/ReactCommon/react/renderer/telemetry/TransactionTelemetry.cpp
T
Micha Reiser 46acfcb8fc Allow swapping the clock implementation for TransactionTelemetry
Summary:
The `TransactionalTelemetryTest`s are flaky because they use a real clock and assert on how much time has passed (with a threshold, but that's no good either).

Using the real clock in the test is the cause for the test to be flaky because it depends on the assumption that it's the sole process running, never risking to be put in the process-queue of the OS. However, that's not the case and is why the test sporadically fails if the OS decided to schedule other threads/process in the middle of the test.

This diff allows parametrising the `TransactionTelemetry` class with the clock implementation so that tests can use a Mock Clock if desired (separate diff).

Changelog: [Internal] Fabric-specific internal change.

Reviewed By: sammy-SC

Differential Revision: D27618516

fbshipit-source-id: 5a08e115b388398ca2b05b9d5ae0fd281dfe3b04
2021-04-08 09:27:18 -07:00

164 lines
5.3 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "TransactionTelemetry.h"
#include <react/debug/react_native_assert.h>
namespace facebook {
namespace react {
thread_local TransactionTelemetry *threadLocalTransactionTelemetry = nullptr;
TransactionTelemetry::TransactionTelemetry()
: TransactionTelemetry(telemetryTimePointNow) {}
TransactionTelemetry::TransactionTelemetry(
std::function<TelemetryTimePoint()> now)
: now_{now} {}
TransactionTelemetry *TransactionTelemetry::threadLocalTelemetry() {
return threadLocalTransactionTelemetry;
}
void TransactionTelemetry::setAsThreadLocal() {
threadLocalTransactionTelemetry = this;
}
void TransactionTelemetry::unsetAsThreadLocal() {
threadLocalTransactionTelemetry = nullptr;
}
void TransactionTelemetry::willCommit() {
react_native_assert(commitStartTime_ == kTelemetryUndefinedTimePoint);
react_native_assert(commitEndTime_ == kTelemetryUndefinedTimePoint);
commitStartTime_ = now_();
}
void TransactionTelemetry::didCommit() {
react_native_assert(commitStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(commitEndTime_ == kTelemetryUndefinedTimePoint);
commitEndTime_ = now_();
}
void TransactionTelemetry::willDiff() {
react_native_assert(diffStartTime_ == kTelemetryUndefinedTimePoint);
react_native_assert(diffEndTime_ == kTelemetryUndefinedTimePoint);
diffStartTime_ = now_();
}
void TransactionTelemetry::didDiff() {
react_native_assert(diffStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(diffEndTime_ == kTelemetryUndefinedTimePoint);
diffEndTime_ = now_();
}
void TransactionTelemetry::willLayout() {
react_native_assert(layoutStartTime_ == kTelemetryUndefinedTimePoint);
react_native_assert(layoutEndTime_ == kTelemetryUndefinedTimePoint);
layoutStartTime_ = now_();
}
void TransactionTelemetry::willMeasureText() {
react_native_assert(
lastTextMeasureStartTime_ == kTelemetryUndefinedTimePoint);
lastTextMeasureStartTime_ = now_();
}
void TransactionTelemetry::didMeasureText() {
numberOfTextMeasurements_++;
react_native_assert(
lastTextMeasureStartTime_ != kTelemetryUndefinedTimePoint);
textMeasureTime_ += now_() - lastTextMeasureStartTime_;
lastTextMeasureStartTime_ = kTelemetryUndefinedTimePoint;
}
void TransactionTelemetry::didLayout() {
react_native_assert(layoutStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(layoutEndTime_ == kTelemetryUndefinedTimePoint);
layoutEndTime_ = now_();
}
void TransactionTelemetry::willMount() {
react_native_assert(mountStartTime_ == kTelemetryUndefinedTimePoint);
react_native_assert(mountEndTime_ == kTelemetryUndefinedTimePoint);
mountStartTime_ = now_();
}
void TransactionTelemetry::didMount() {
react_native_assert(mountStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(mountEndTime_ == kTelemetryUndefinedTimePoint);
mountEndTime_ = now_();
}
void TransactionTelemetry::setRevisionNumber(int revisionNumber) {
revisionNumber_ = revisionNumber;
}
TelemetryTimePoint TransactionTelemetry::getDiffStartTime() const {
react_native_assert(diffStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(diffEndTime_ != kTelemetryUndefinedTimePoint);
return diffStartTime_;
}
TelemetryTimePoint TransactionTelemetry::getDiffEndTime() const {
react_native_assert(diffStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(diffEndTime_ != kTelemetryUndefinedTimePoint);
return diffEndTime_;
}
TelemetryTimePoint TransactionTelemetry::getCommitStartTime() const {
react_native_assert(commitStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(commitEndTime_ != kTelemetryUndefinedTimePoint);
return commitStartTime_;
}
TelemetryTimePoint TransactionTelemetry::getCommitEndTime() const {
react_native_assert(commitStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(commitEndTime_ != kTelemetryUndefinedTimePoint);
return commitEndTime_;
}
TelemetryTimePoint TransactionTelemetry::getLayoutStartTime() const {
react_native_assert(layoutStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(layoutEndTime_ != kTelemetryUndefinedTimePoint);
return layoutStartTime_;
}
TelemetryTimePoint TransactionTelemetry::getLayoutEndTime() const {
react_native_assert(layoutStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(layoutEndTime_ != kTelemetryUndefinedTimePoint);
return layoutEndTime_;
}
TelemetryTimePoint TransactionTelemetry::getMountStartTime() const {
react_native_assert(mountStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(mountEndTime_ != kTelemetryUndefinedTimePoint);
return mountStartTime_;
}
TelemetryTimePoint TransactionTelemetry::getMountEndTime() const {
react_native_assert(mountStartTime_ != kTelemetryUndefinedTimePoint);
react_native_assert(mountEndTime_ != kTelemetryUndefinedTimePoint);
return mountEndTime_;
}
TelemetryDuration TransactionTelemetry::getTextMeasureTime() const {
return textMeasureTime_;
}
int TransactionTelemetry::getNumberOfTextMeasurements() const {
return numberOfTextMeasurements_;
}
int TransactionTelemetry::getRevisionNumber() const {
return revisionNumber_;
}
} // namespace react
} // namespace facebook