LCOV - code coverage report
Current view: top level - src/heap - array-buffer-tracker.h (source / functions) Hit Total Coverage
Test: app.info Lines: 1 1 100.0 %
Date: 2017-10-20 Functions: 0 0 -

          Line data    Source code
       1             : // Copyright 2015 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_HEAP_ARRAY_BUFFER_TRACKER_H_
       6             : #define V8_HEAP_ARRAY_BUFFER_TRACKER_H_
       7             : 
       8             : #include <unordered_set>
       9             : 
      10             : #include "src/allocation.h"
      11             : #include "src/base/platform/mutex.h"
      12             : #include "src/globals.h"
      13             : 
      14             : namespace v8 {
      15             : namespace internal {
      16             : 
      17             : class Heap;
      18             : class JSArrayBuffer;
      19             : class MarkingState;
      20             : class Page;
      21             : 
      22             : class ArrayBufferTracker : public AllStatic {
      23             :  public:
      24             :   enum ProcessingMode {
      25             :     kUpdateForwardedRemoveOthers,
      26             :     kUpdateForwardedKeepOthers,
      27             :   };
      28             : 
      29             :   // The following methods are used to track raw C++ pointers to externally
      30             :   // allocated memory used as backing store in live array buffers.
      31             : 
      32             :   // Register/unregister a new JSArrayBuffer |buffer| for tracking. Guards all
      33             :   // access to the tracker by taking the page lock for the corresponding page.
      34             :   inline static void RegisterNew(Heap* heap, JSArrayBuffer* buffer);
      35             :   inline static void Unregister(Heap* heap, JSArrayBuffer* buffer);
      36             : 
      37             :   // Frees all backing store pointers for dead JSArrayBuffers in new space.
      38             :   // Does not take any locks and can only be called during Scavenge.
      39             :   static void FreeDeadInNewSpace(Heap* heap);
      40             : 
      41             :   // Number of array buffer bytes retained from new space.
      42             :   static size_t RetainedInNewSpace(Heap* heap);
      43             : 
      44             :   // Frees all backing store pointers for dead JSArrayBuffer on a given page.
      45             :   // Requires marking information to be present. Requires the page lock to be
      46             :   // taken by the caller.
      47             :   template <typename MarkingState>
      48             :   static void FreeDead(Page* page, MarkingState* marking_state);
      49             : 
      50             :   // Frees all remaining, live or dead, array buffers on a page. Only useful
      51             :   // during tear down.
      52             :   static void FreeAll(Page* page);
      53             : 
      54             :   // Processes all array buffers on a given page. |mode| specifies the action
      55             :   // to perform on the buffers. Returns whether the tracker is empty or not.
      56             :   static bool ProcessBuffers(Page* page, ProcessingMode mode);
      57             : 
      58             :   // Returns whether a buffer is currently tracked.
      59             :   static bool IsTracked(JSArrayBuffer* buffer);
      60             : };
      61             : 
      62             : // LocalArrayBufferTracker tracks internalized array buffers.
      63             : //
      64             : // Never use directly but instead always call through |ArrayBufferTracker|.
      65             : class LocalArrayBufferTracker {
      66             :  public:
      67             :   enum CallbackResult { kKeepEntry, kUpdateEntry, kRemoveEntry };
      68             :   enum FreeMode { kFreeDead, kFreeAll };
      69             : 
      70             :   explicit LocalArrayBufferTracker(Heap* heap)
      71      379724 :       : heap_(heap), retained_size_(0) {}
      72             :   ~LocalArrayBufferTracker();
      73             : 
      74             :   inline void Add(JSArrayBuffer* buffer, size_t length);
      75             :   inline void Remove(JSArrayBuffer* buffer, size_t length);
      76             : 
      77             :   // Frees up array buffers.
      78             :   //
      79             :   // Sample usage:
      80             :   // Free([](HeapObject* array_buffer) {
      81             :   //    if (should_free_internal(array_buffer)) return true;
      82             :   //    return false;
      83             :   // });
      84             :   template <typename Callback>
      85             :   void Free(Callback should_free);
      86             : 
      87             :   // Processes buffers one by one. The CallbackResult of the callback decides
      88             :   // what action to take on the buffer.
      89             :   //
      90             :   // Callback should be of type:
      91             :   //   CallbackResult fn(JSArrayBuffer* buffer, JSArrayBuffer** new_buffer);
      92             :   template <typename Callback>
      93             :   void Process(Callback callback);
      94             : 
      95             :   bool IsEmpty() const { return array_buffers_.empty(); }
      96             : 
      97             :   bool IsTracked(JSArrayBuffer* buffer) const {
      98             :     return array_buffers_.find(buffer) != array_buffers_.end();
      99             :   }
     100             : 
     101             :   size_t retained_size() const { return retained_size_; }
     102             : 
     103             :  private:
     104             :   typedef std::unordered_set<JSArrayBuffer*> TrackingData;
     105             : 
     106             :   Heap* heap_;
     107             :   // The set contains raw heap pointers which are removed by the GC upon
     108             :   // processing the tracker through its owning page.
     109             :   TrackingData array_buffers_;
     110             :   // Retained size of array buffers for this tracker in bytes.
     111             :   size_t retained_size_;
     112             : };
     113             : 
     114             : }  // namespace internal
     115             : }  // namespace v8
     116             : #endif  // V8_HEAP_ARRAY_BUFFER_TRACKER_H_

Generated by: LCOV version 1.10