PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/react-native/ReactCommon/jsinspector-modern/tracing

Просмотр файла: RuntimeSamplingProfileTraceEventSerializer.h

/*
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

#pragma once

#include "PerformanceTracer.h"
#include "ProfileTreeNode.h"
#include "RuntimeSamplingProfile.h"

#include <react/timing/primitives.h>

namespace facebook::react::jsinspector_modern::tracing {

namespace {

struct NodeIdGenerator {
 public:
  uint32_t getNext() {
    return ++counter_;
  }

 private:
  uint32_t counter_ = 0;
};

} // namespace

/**
 * Serializes RuntimeSamplingProfile into collection of specific Trace Events,
 * which represent Profile information on a timeline.
 */
class RuntimeSamplingProfileTraceEventSerializer {
  struct ProfileChunk {
    ProfileChunk(
        uint16_t chunkSize,
        uint64_t chunkThreadId,
        HighResTimeStamp chunkTimestamp)
        : size(chunkSize), threadId(chunkThreadId), timestamp(chunkTimestamp) {
      samples.reserve(size);
      timeDeltas.reserve(size);
    }

    bool isFull() const {
      return samples.size() == size;
    }

    bool isEmpty() const {
      return samples.empty();
    }

    std::vector<ProfileTreeNode> nodes;
    std::vector<uint32_t> samples;
    std::vector<HighResDuration> timeDeltas;
    uint16_t size;
    uint64_t threadId;
    HighResTimeStamp timestamp;
  };

 public:
  /**
   * \param performanceTracer A reference to PerformanceTracer instance.
   * \param notificationCallback A reference to a callback, which is called
   * when a chunk of trace events is ready to be sent.
   * \param traceEventChunkSize The maximum number of ProfileChunk trace
   * events that can be sent in a single CDP Tracing.dataCollected message.
   * \param profileChunkSize The maximum number of ProfileChunk trace events
   * that can be sent in a single ProfileChunk trace event.
   */
  RuntimeSamplingProfileTraceEventSerializer(
      PerformanceTracer& performanceTracer,
      std::function<void(const folly::dynamic& traceEventsChunk)>
          notificationCallback,
      uint16_t traceEventChunkSize,
      uint16_t profileChunkSize = 10)
      : performanceTracer_(performanceTracer),
        notificationCallback_(std::move(notificationCallback)),
        traceEventChunkSize_(traceEventChunkSize),
        profileChunkSize_(profileChunkSize) {
    traceEventBuffer_ = folly::dynamic::array();
    traceEventBuffer_.reserve(traceEventChunkSize);
  }

  /**
   * \param profile What we will be serializing.
   * \param tracingStartTime A timestamp of when tracing of an Instance started,
   * will be used as a starting reference point of JavaScript samples recording.
   */
  void serializeAndNotify(
      const RuntimeSamplingProfile& profile,
      HighResTimeStamp tracingStartTime);

 private:
  /**
   * Sends a single "Profile" Trace Event via notificationCallback_.
   * \param threadId The id of the thread, where the Profile was collected.
   * \param profileId The id of the Profile.
   * \param profileStartUnixTimestamp The Unix timestamp of the start of the
   * profile.
   */
  void sendProfileTraceEvent(
      uint64_t threadId,
      uint16_t profileId,
      HighResTimeStamp profileStartTimestamp) const;

  /**
   * Encapsulates logic for processing the empty sample, when the VM was idling.
   * \param chunk The profile chunk, which will record this sample.
   * \param idleNodeId The id of the (idle) node.
   * \param samplesTimeDelta Delta between the current sample and the
   * previous one.
   */
  void chunkEmptySample(
      ProfileChunk& chunk,
      uint32_t idleNodeId,
      HighResDuration samplesTimeDelta);

  /**
   * Records ProfileChunk as a "ProfileChunk" Trace Event in traceEventBuffer_.
   * \param chunk The chunk that will be buffered.
   * \param profileId The id of the Profile.
   */
  void bufferProfileChunkTraceEvent(ProfileChunk& chunk, uint16_t profileId);

  /**
   * Encapsulates logic for processing the call stack of the sample.
   * \param callStack The call stack that will be processed.
   * \param chunk The profile chunk, which will buffer the sample with the
   * provided call stack.
   * \param rootNode The (root) node. Will be the parent node of the
   * corresponding profile tree branch.
   * \param idleNodeId Id of the (idle) node. Will be the only node that is used
   * for the corresponding profile tree branch, in case of an empty call stack.
   * \param samplesTimeDelta Delta between the current sample and the previous
   * one.
   * \param nodeIdGenerator NodeIdGenerator instance that will be used for
   * generating unique node ids.
   */
  void processCallStack(
      const std::vector<RuntimeSamplingProfile::SampleCallStackFrame>&
          callStack,
      ProfileChunk& chunk,
      ProfileTreeNode& rootNode,
      uint32_t idleNodeId,
      HighResDuration samplesTimeDelta,
      NodeIdGenerator& nodeIdGenerator);

  /**
   * Sends buffered Trace Events via notificationCallback_ and then clears it.
   */
  void sendBufferedTraceEventsAndClear();

  PerformanceTracer& performanceTracer_;
  const std::function<void(const folly::dynamic& traceEventsChunk)>
      notificationCallback_;
  uint16_t traceEventChunkSize_;
  uint16_t profileChunkSize_;

  folly::dynamic traceEventBuffer_;
};

} // namespace facebook::react::jsinspector_modern::tracing

Выполнить команду


Для локальной разработки. Не используйте в интернете!