v8-profiler.h 24.1 KB
Newer Older
1
// Copyright 2010 the V8 project authors. All rights reserved.
2 3
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
4 5 6 7

#ifndef V8_V8_PROFILER_H_
#define V8_V8_PROFILER_H_

8
#include <vector>
9
#include "v8.h"  // NOLINT(build/include)
10 11 12 13 14 15

/**
 * Profiler support for the V8 JavaScript engine.
 */
namespace v8 {

16
class HeapGraphNode;
17
struct HeapStatsUpdate;
18

19
typedef uint32_t SnapshotObjectId;
20

21 22 23 24 25 26

struct CpuProfileDeoptFrame {
  int script_id;
  size_t position;
};

thakis's avatar
thakis committed
27
}  // namespace v8
28 29

#ifdef V8_OS_WIN
thakis's avatar
thakis committed
30
template class V8_EXPORT std::vector<v8::CpuProfileDeoptFrame>;
31 32
#endif

thakis's avatar
thakis committed
33
namespace v8 {
34 35 36 37 38 39 40

struct V8_EXPORT CpuProfileDeoptInfo {
  /** A pointer to a static string owned by v8. */
  const char* deopt_reason;
  std::vector<CpuProfileDeoptFrame> stack;
};

thakis's avatar
thakis committed
41
}  // namespace v8
42 43

#ifdef V8_OS_WIN
thakis's avatar
thakis committed
44
template class V8_EXPORT std::vector<v8::CpuProfileDeoptInfo>;
45 46
#endif

thakis's avatar
thakis committed
47
namespace v8 {
48

49 50 51
/**
 * CpuProfileNode represents a node in a call graph.
 */
52
class V8_EXPORT CpuProfileNode {
53
 public:
54 55 56 57 58 59 60 61
  struct LineTick {
    /** The 1-based number of the source line where the function originates. */
    int line;

    /** The count of samples associated with the source line. */
    unsigned int hit_count;
  };

62
  /** Returns function name (empty string for anonymous functions.) */
63
  Local<String> GetFunctionName() const;
64

65 66 67
  /** Returns id of the script where function is located. */
  int GetScriptId() const;

68
  /** Returns resource name for script from where the function originates. */
69
  Local<String> GetScriptResourceName() const;
70 71 72 73 74 75 76

  /**
   * Returns the number, 1-based, of the line where the function originates.
   * kNoLineNumberInfo if no line number information is available.
   */
  int GetLineNumber() const;

77 78 79 80 81 82
  /**
   * Returns 1-based number of the column where the function originates.
   * kNoColumnNumberInfo if no column number information is available.
   */
  int GetColumnNumber() const;

83 84 85 86 87 88 89 90 91 92 93 94
  /**
   * Returns the number of the function's source lines that collect the samples.
   */
  unsigned int GetHitLineCount() const;

  /** Returns the set of source lines that collect the samples.
   *  The caller allocates buffer and responsible for releasing it.
   *  True if all available entries are copied, otherwise false.
   *  The function copies nothing if buffer is not large enough.
   */
  bool GetLineTicks(LineTick* entries, unsigned int length) const;

95 96 97 98 99
  /** Returns bailout reason for the function
    * if the optimization was disabled for it.
    */
  const char* GetBailoutReason() const;

100 101 102 103 104
  /**
    * Returns the count of samples where the function was currently executing.
    */
  unsigned GetHitCount() const;

105 106 107
  /** Returns function entry UID. */
  unsigned GetCallUid() const;

108 109 110
  /** Returns id of the node. The id is unique within the tree */
  unsigned GetNodeId() const;

111 112 113 114 115 116
  /** Returns child nodes count of the node. */
  int GetChildrenCount() const;

  /** Retrieves a child node by index. */
  const CpuProfileNode* GetChild(int index) const;

117 118 119
  /** Retrieves deopt infos for the node. */
  const std::vector<CpuProfileDeoptInfo>& GetDeoptInfos() const;

120
  static const int kNoLineNumberInfo = Message::kNoLineNumberInfo;
121
  static const int kNoColumnNumberInfo = Message::kNoColumnInfo;
122 123 124 125
};


/**
126 127
 * CpuProfile contains a CPU profile in a form of top-down call tree
 * (from main() down to functions that do all the work).
128
 */
129
class V8_EXPORT CpuProfile {
130 131
 public:
  /** Returns CPU profile title. */
132
  Local<String> GetTitle() const;
133 134 135

  /** Returns the root node of the top down call tree. */
  const CpuProfileNode* GetTopDownRoot() const;
136

137
  /**
138 139 140
   * Returns number of samples recorded. The samples are not recorded unless
   * |record_samples| parameter of CpuProfiler::StartCpuProfiling is true.
   */
141 142 143
  int GetSamplesCount() const;

  /**
144 145 146
   * Returns profile node corresponding to the top frame the sample at
   * the given index.
   */
147 148
  const CpuProfileNode* GetSample(int index) const;

149
  /**
150 151 152 153 154 155 156 157 158 159
   * Returns the timestamp of the sample. The timestamp is the number of
   * microseconds since some unspecified starting point.
   * The point is equal to the starting point used by GetStartTime.
   */
  int64_t GetSampleTimestamp(int index) const;

  /**
   * Returns time when the profile recording was started (in microseconds)
   * since some unspecified starting point.
   */
160
  int64_t GetStartTime() const;
161 162

  /**
163 164 165 166
   * Returns time when the profile recording was stopped (in microseconds)
   * since some unspecified starting point.
   * The point is equal to the starting point used by GetStartTime.
   */
167
  int64_t GetEndTime() const;
168

169 170 171 172 173
  /**
   * Deletes the profile and removes it from CpuProfiler's list.
   * All pointers to nodes previously returned become invalid.
   */
  void Delete();
174 175 176 177
};


/**
178 179
 * Interface for controlling CPU profiling. Instance of the
 * profiler can be retrieved using v8::Isolate::GetCpuProfiler.
180
 */
181
class V8_EXPORT CpuProfiler {
182
 public:
183
  /**
184 185 186
   * Changes default CPU profiler sampling interval to the specified number
   * of microseconds. Default interval is 1000us. This method must be called
   * when there are no profiles being recorded.
187
   */
188
  void SetSamplingInterval(int us);
189

190 191 192 193
  /**
   * Starts collecting CPU profile. Title may be an empty string. It
   * is allowed to have several profiles being collected at
   * once. Attempts to start collecting several profiles with the same
194 195 196
   * title are silently ignored. While collecting a profile, functions
   * from all security contexts are included in it. The token-based
   * filtering is only performed when querying for a profile.
197 198 199
   *
   * |record_samples| parameter controls whether individual samples should
   * be recorded in addition to the aggregated tree.
200
   */
201
  void StartProfiling(Local<String> title, bool record_samples = false);
202

203 204 205 206
  /**
   * Stops collecting CPU profile with a given title and returns it.
   * If the title given is empty, finishes the last profile started.
   */
207
  CpuProfile* StopProfiling(Local<String> title);
208

209 210 211 212 213 214 215
  /**
   * Force collection of a sample. Must be called on the VM thread.
   * Recording the forced sample does not contribute to the aggregated
   * profile statistics.
   */
  void CollectSample();

216 217 218 219 220
  /**
   * Tells the profiler whether the embedder is idle.
   */
  void SetIdle(bool is_idle);

221 222 223 224 225
 private:
  CpuProfiler();
  ~CpuProfiler();
  CpuProfiler(const CpuProfiler&);
  CpuProfiler& operator=(const CpuProfiler&);
226 227 228
};


229 230
/**
 * HeapSnapshotEdge represents a directed connection between heap
231
 * graph nodes: from retainers to retained nodes.
232
 */
233
class V8_EXPORT HeapGraphEdge {
234 235
 public:
  enum Type {
236 237 238
    kContextVariable = 0,  // A variable from a function context.
    kElement = 1,          // An element of an array.
    kProperty = 2,         // A named object property.
239 240 241 242 243
    kInternal = 3,         // A link that can't be accessed from JS,
                           // thus, its name isn't a real property name
                           // (e.g. parts of a ConsString).
    kHidden = 4,           // A link that is needed for proper sizes
                           // calculation, but may be hidden from user.
244
    kShortcut = 5,         // A link that must not be followed during
245
                           // sizes calculation.
246
    kWeak = 6              // A weak reference (ignored by the GC).
247 248 249 250 251 252 253 254 255
  };

  /** Returns edge type (see HeapGraphEdge::Type). */
  Type GetType() const;

  /**
   * Returns edge name. This can be a variable name, an element index, or
   * a property name.
   */
256
  Local<Value> GetName() const;
257 258 259 260 261 262 263 264 265 266 267 268

  /** Returns origin node. */
  const HeapGraphNode* GetFromNode() const;

  /** Returns destination node. */
  const HeapGraphNode* GetToNode() const;
};


/**
 * HeapGraphNode represents a node in a heap graph.
 */
269
class V8_EXPORT HeapGraphNode {
270 271
 public:
  enum Type {
272 273 274 275 276 277 278 279 280 281 282 283 284
    kHidden = 0,         // Hidden node, may be filtered when shown to user.
    kArray = 1,          // An array of elements.
    kString = 2,         // A string.
    kObject = 3,         // A JS object (except for arrays and strings).
    kCode = 4,           // Compiled code.
    kClosure = 5,        // Function closure.
    kRegExp = 6,         // RegExp.
    kHeapNumber = 7,     // Number stored in the heap.
    kNative = 8,         // Native object (not from V8 heap).
    kSynthetic = 9,      // Synthetic object, usualy used for grouping
                         // snapshot items together.
    kConsString = 10,    // Concatenated string. A pair of pointers to strings.
    kSlicedString = 11,  // Sliced string. A fragment of another string.
285 286
    kSymbol = 12,        // A Symbol (ES6).
    kSimdValue = 13      // A SIMD value stored in the heap (Proposed ES7).
287 288 289 290 291 292 293 294 295 296
  };

  /** Returns node type (see HeapGraphNode::Type). */
  Type GetType() const;

  /**
   * Returns node name. Depending on node's type this can be the name
   * of the constructor (for objects), the name of the function (for
   * closures), string value, or an empty string (for compiled code).
   */
297
  Local<String> GetName() const;
298

299 300
  /**
   * Returns node id. For the same heap object, the id remains the same
301
   * across all snapshots.
302
   */
303
  SnapshotObjectId GetId() const;
304

305 306
  /** Returns node's own size, in bytes. */
  size_t GetShallowSize() const;
307 308 309 310 311 312 313 314 315

  /** Returns child nodes count of the node. */
  int GetChildrenCount() const;

  /** Retrieves a child by index. */
  const HeapGraphEdge* GetChild(int index) const;
};


316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
/**
 * An interface for exporting data from V8, using "push" model.
 */
class V8_EXPORT OutputStream {  // NOLINT
 public:
  enum WriteResult {
    kContinue = 0,
    kAbort = 1
  };
  virtual ~OutputStream() {}
  /** Notify about the end of stream. */
  virtual void EndOfStream() = 0;
  /** Get preferred output chunk size. Called only once. */
  virtual int GetChunkSize() { return 1024; }
  /**
   * Writes the next chunk of snapshot data into the stream. Writing
   * can be stopped by returning kAbort as function result. EndOfStream
   * will not be called in case writing was aborted.
   */
  virtual WriteResult WriteAsciiChunk(char* data, int size) = 0;
  /**
   * Writes the next chunk of heap stats data into the stream. Writing
   * can be stopped by returning kAbort as function result. EndOfStream
   * will not be called in case writing was aborted.
   */
  virtual WriteResult WriteHeapStatsChunk(HeapStatsUpdate* data, int count) {
    return kAbort;
343
  }
344 345 346
};


347 348 349
/**
 * HeapSnapshots record the state of the JS heap at some moment.
 */
350
class V8_EXPORT HeapSnapshot {
351
 public:
352 353
  enum SerializationFormat {
    kJSON = 0  // See format description near 'Serialize' method.
354 355
  };

356
  /** Returns the root node of the heap graph. */
357 358
  const HeapGraphNode* GetRoot() const;

359
  /** Returns a node by its id. */
360
  const HeapGraphNode* GetNodeById(SnapshotObjectId id) const;
361

362 363 364 365 366 367
  /** Returns total nodes count in the snapshot. */
  int GetNodesCount() const;

  /** Returns a node by index. */
  const HeapGraphNode* GetNode(int index) const;

368 369 370
  /** Returns a max seen JS object Id. */
  SnapshotObjectId GetMaxSnapshotJSObjectId() const;

371 372 373 374 375 376 377
  /**
   * Deletes the snapshot and removes it from HeapProfiler's list.
   * All pointers to nodes, edges and paths previously returned become
   * invalid.
   */
  void Delete();

378 379 380 381
  /**
   * Prepare a serialized representation of the snapshot. The result
   * is written into the stream provided in chunks of specified size.
   * The total length of the serialized snapshot is unknown in
382
   * advance, it can be roughly equal to JS heap size (that means,
383 384 385 386 387 388
   * it can be really big - tens of megabytes).
   *
   * For the JSON format, heap contents are represented as an object
   * with the following structure:
   *
   *  {
389 390 391 392 393 394 395 396 397 398
   *    snapshot: {
   *      title: "...",
   *      uid: nnn,
   *      meta: { meta-info },
   *      node_count: nnn,
   *      edge_count: nnn
   *    },
   *    nodes: [nodes array],
   *    edges: [edges array],
   *    strings: [strings array]
399 400
   *  }
   *
401 402
   * Nodes reference strings, other nodes, and edges by their indexes
   * in corresponding arrays.
403
   */
404 405
  void Serialize(OutputStream* stream,
                 SerializationFormat format = kJSON) const;
406 407 408
};


409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
/**
 * An interface for reporting progress and controlling long-running
 * activities.
 */
class V8_EXPORT ActivityControl {  // NOLINT
 public:
  enum ControlOption {
    kContinue = 0,
    kAbort = 1
  };
  virtual ~ActivityControl() {}
  /**
   * Notify about current progress. The activity can be stopped by
   * returning kAbort as the callback result.
   */
  virtual ControlOption ReportProgressValue(int done, int total) = 0;
};

427

428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511
/**
 * AllocationProfile is a sampled profile of allocations done by the program.
 * This is structured as a call-graph.
 */
class V8_EXPORT AllocationProfile {
 public:
  struct Allocation {
    /**
     * Size of the sampled allocation object.
     */
    size_t size;

    /**
     * The number of objects of such size that were sampled.
     */
    unsigned int count;
  };

  /**
   * Represents a node in the call-graph.
   */
  struct Node {
    /**
     * Name of the function. May be empty for anonymous functions or if the
     * script corresponding to this function has been unloaded.
     */
    Local<String> name;

    /**
     * Name of the script containing the function. May be empty if the script
     * name is not available, or if the script has been unloaded.
     */
    Local<String> script_name;

    /**
     * id of the script where the function is located. May be equal to
     * v8::UnboundScript::kNoScriptId in cases where the script doesn't exist.
     */
    int script_id;

    /**
     * Start position of the function in the script.
     */
    int start_position;

    /**
     * 1-indexed line number where the function starts. May be
     * kNoLineNumberInfo if no line number information is available.
     */
    int line_number;

    /**
     * 1-indexed column number where the function starts. May be
     * kNoColumnNumberInfo if no line number information is available.
     */
    int column_number;

    /**
     * List of callees called from this node for which we have sampled
     * allocations. The lifetime of the children is scoped to the containing
     * AllocationProfile.
     */
    std::vector<Node*> children;

    /**
     * List of self allocations done by this node in the call-graph.
     */
    std::vector<Allocation> allocations;
  };

  /**
   * Returns the root node of the call-graph. The root node corresponds to an
   * empty JS call-stack. The lifetime of the returned Node* is scoped to the
   * containing AllocationProfile.
   */
  virtual Node* GetRootNode() = 0;

  virtual ~AllocationProfile() {}

  static const int kNoLineNumberInfo = Message::kNoLineNumberInfo;
  static const int kNoColumnNumberInfo = Message::kNoColumnInfo;
};


512
/**
513 514
 * Interface for controlling heap profiling. Instance of the
 * profiler can be retrieved using v8::Isolate::GetHeapProfiler.
515
 */
516
class V8_EXPORT HeapProfiler {
517
 public:
518 519 520 521 522 523
  /**
   * Callback function invoked for obtaining RetainedObjectInfo for
   * the given JavaScript wrapper object. It is prohibited to enter V8
   * while the callback is running: only getters on the handle and
   * GetPointerFromInternalField on the objects are allowed.
   */
524 525
  typedef RetainedObjectInfo* (*WrapperInfoCallback)(uint16_t class_id,
                                                     Local<Value> wrapper);
526

527 528
  /** Returns the number of snapshots taken. */
  int GetSnapshotCount();
529

530 531
  /** Returns a snapshot by index. */
  const HeapSnapshot* GetHeapSnapshot(int index);
532

533 534 535 536
  /**
   * Returns SnapshotObjectId for a heap object referenced by |value| if
   * it has been seen by the heap profiler, kUnknownObjectId otherwise.
   */
537
  SnapshotObjectId GetObjectId(Local<Value> value);
538

539 540 541 542
  /**
   * Returns heap object with given SnapshotObjectId if the object is alive,
   * otherwise empty handle is returned.
   */
543
  Local<Value> FindObjectById(SnapshotObjectId id);
544 545 546 547 548 549 550 551

  /**
   * Clears internal map from SnapshotObjectId to heap object. The new objects
   * will not be added into it unless a heap snapshot is taken or heap object
   * tracking is kicked off.
   */
  void ClearObjectIds();

552 553 554 555 556
  /**
   * A constant for invalid SnapshotObjectId. GetSnapshotObjectId will return
   * it in case heap profiler cannot find id  for the object passed as
   * parameter. HeapSnapshot::GetNodeById will always return NULL for such id.
   */
557
  static const SnapshotObjectId kUnknownObjectId = 0;
558

559 560 561 562
  /**
   * Callback interface for retrieving user friendly names of global objects.
   */
  class ObjectNameResolver {
563
   public:
564 565 566 567
    /**
     * Returns name to be used in the heap snapshot for given node. Returned
     * string must stay alive until snapshot collection is completed.
     */
568 569
    virtual const char* GetName(Local<Object> object) = 0;

570
   protected:
571 572 573
    virtual ~ObjectNameResolver() {}
  };

574
  /**
575
   * Takes a heap snapshot and returns it.
576
   */
577 578 579 580
  const HeapSnapshot* TakeHeapSnapshot(
      ActivityControl* control = NULL,
      ObjectNameResolver* global_object_name_resolver = NULL);

581 582 583 584
  /**
   * Starts tracking of heap objects population statistics. After calling
   * this method, all heap objects relocations done by the garbage collector
   * are being registered.
585 586 587 588
   *
   * |track_allocations| parameter controls whether stack trace of each
   * allocation in the heap will be recorded and reported as part of
   * HeapSnapshot.
589
   */
590
  void StartTrackingHeapObjects(bool track_allocations = false);
591 592 593 594 595 596

  /**
   * Adds a new time interval entry to the aggregated statistics array. The
   * time interval entry contains information on the current heap objects
   * population size. The method also updates aggregated statistics and
   * reports updates for all previous time intervals via the OutputStream
597 598
   * object. Updates on each time interval are provided as a stream of the
   * HeapStatsUpdate structure instances.
599 600
   * If |timestamp_us| is supplied, timestamp of the new entry will be written
   * into it. The return value of the function is the last seen heap object Id.
601
   *
602
   * StartTrackingHeapObjects must be called before the first call to this
603 604
   * method.
   */
605 606
  SnapshotObjectId GetHeapStats(OutputStream* stream,
                                int64_t* timestamp_us = NULL);
607 608 609 610

  /**
   * Stops tracking of heap objects population statistics, cleans up all
   * collected data. StartHeapObjectsTracking must be called again prior to
611
   * calling GetHeapStats next time.
612
   */
613
  void StopTrackingHeapObjects();
614

615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
  /**
   * Starts gathering a sampling heap profile. A sampling heap profile is
   * similar to tcmalloc's heap profiler and Go's mprof. It samples object
   * allocations and builds an online 'sampling' heap profile. At any point in
   * time, this profile is expected to be a representative sample of objects
   * currently live in the system. Each sampled allocation includes the stack
   * trace at the time of allocation, which makes this really useful for memory
   * leak detection.
   *
   * This mechanism is intended to be cheap enough that it can be used in
   * production with minimal performance overhead.
   *
   * Allocations are sampled using a randomized Poisson process. On average, one
   * allocation will be sampled every |sample_interval| bytes allocated. The
   * |stack_depth| parameter controls the maximum number of stack frames to be
   * captured on each allocation.
   *
   * NOTE: This is a proof-of-concept at this point. Right now we only sample
   * newspace allocations. Support for paged space allocation (e.g. pre-tenured
   * objects, large objects, code objects, etc.) and native allocations
   * doesn't exist yet, but is anticipated in the future.
   *
   * Objects allocated before the sampling is started will not be included in
   * the profile.
   *
   * Returns false if a sampling heap profiler is already running.
   */
  bool StartSamplingHeapProfiler(uint64_t sample_interval = 512 * 1024,
                                 int stack_depth = 16);

  /**
   * Stops the sampling heap profile and discards the current profile.
   */
  void StopSamplingHeapProfiler();

  /**
   * Returns the sampled profile of allocations allocated (and still live) since
   * StartSamplingHeapProfiler was called. The ownership of the pointer is
   * transfered to the caller. Returns nullptr if sampling heap profiler is not
   * active.
   */
  AllocationProfile* GetAllocationProfile();

658 659 660 661
  /**
   * Deletes all snapshots taken. All previously returned pointers to
   * snapshots and their contents become invalid after this call.
   */
662
  void DeleteAllHeapSnapshots();
663

664 665 666 667
  /** Binds a callback to embedder's class ID. */
  void SetWrapperClassInfoProvider(
      uint16_t class_id,
      WrapperInfoCallback callback);
668 669 670 671 672 673 674

  /**
   * Default value of persistent handle class ID. Must not be used to
   * define a class. Can be used to reset a class of a persistent
   * handle.
   */
  static const uint16_t kPersistentHandleNoClassId = 0;
675

676 677 678
  /** Returns memory used for profiler internal data and snapshots. */
  size_t GetProfilerMemorySize();

679 680 681 682 683
  /**
   * Sets a RetainedObjectInfo for an object group (see V8::SetObjectGroupId).
   */
  void SetRetainedObjectInfo(UniqueId id, RetainedObjectInfo* info);

684 685 686 687 688
 private:
  HeapProfiler();
  ~HeapProfiler();
  HeapProfiler(const HeapProfiler&);
  HeapProfiler& operator=(const HeapProfiler&);
689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
};


/**
 * Interface for providing information about embedder's objects
 * held by global handles. This information is reported in two ways:
 *
 *  1. When calling AddObjectGroup, an embedder may pass
 *     RetainedObjectInfo instance describing the group.  To collect
 *     this information while taking a heap snapshot, V8 calls GC
 *     prologue and epilogue callbacks.
 *
 *  2. When a heap snapshot is collected, V8 additionally
 *     requests RetainedObjectInfos for persistent handles that
 *     were not previously reported via AddObjectGroup.
 *
 * Thus, if an embedder wants to provide information about native
 * objects for heap snapshots, he can do it in a GC prologue
 * handler, and / or by assigning wrapper class ids in the following way:
 *
709
 *  1. Bind a callback to class id by calling SetWrapperClassInfoProvider.
710 711 712 713 714 715
 *  2. Call SetWrapperClassId on certain persistent handles.
 *
 * V8 takes ownership of RetainedObjectInfo instances passed to it and
 * keeps them alive only during snapshot collection. Afterwards, they
 * are freed by calling the Dispose class function.
 */
716
class V8_EXPORT RetainedObjectInfo {  // NOLINT
717 718 719 720 721 722 723 724 725 726 727 728 729 730
 public:
  /** Called by V8 when it no longer needs an instance. */
  virtual void Dispose() = 0;

  /** Returns whether two instances are equivalent. */
  virtual bool IsEquivalent(RetainedObjectInfo* other) = 0;

  /**
   * Returns hash value for the instance. Equivalent instances
   * must have the same hash value.
   */
  virtual intptr_t GetHash() = 0;

  /**
731
   * Returns human-readable label. It must be a null-terminated UTF-8
732 733 734 735
   * encoded string. V8 copies its contents during a call to GetLabel.
   */
  virtual const char* GetLabel() = 0;

736 737 738 739 740 741 742 743 744 745 746
  /**
   * Returns human-readable group label. It must be a null-terminated UTF-8
   * encoded string. V8 copies its contents during a call to GetGroupLabel.
   * Heap snapshot generator will collect all the group names, create
   * top level entries with these names and attach the objects to the
   * corresponding top level group objects. There is a default
   * implementation which is required because embedders don't have their
   * own implementation yet.
   */
  virtual const char* GetGroupLabel() { return GetLabel(); }

747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762
  /**
   * Returns element count in case if a global handle retains
   * a subgraph by holding one of its nodes.
   */
  virtual intptr_t GetElementCount() { return -1; }

  /** Returns embedder's object size in bytes. */
  virtual intptr_t GetSizeInBytes() { return -1; }

 protected:
  RetainedObjectInfo() {}
  virtual ~RetainedObjectInfo() {}

 private:
  RetainedObjectInfo(const RetainedObjectInfo&);
  RetainedObjectInfo& operator=(const RetainedObjectInfo&);
763 764 765
};


766 767
/**
 * A struct for exporting HeapStats data from V8, using "push" model.
768
 * See HeapProfiler::GetHeapStats.
769 770 771 772 773 774 775 776 777 778
 */
struct HeapStatsUpdate {
  HeapStatsUpdate(uint32_t index, uint32_t count, uint32_t size)
    : index(index), count(count), size(size) { }
  uint32_t index;  // Index of the time interval that was changed.
  uint32_t count;  // New value of count field for the interval with this index.
  uint32_t size;  // New value of size field for the interval with this index.
};


779 780 781 782
}  // namespace v8


#endif  // V8_V8_PROFILER_H_