• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 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_INVALIDATED_SLOTS_H_
6 #define V8_HEAP_INVALIDATED_SLOTS_H_
7 
8 #include <map>
9 #include <stack>
10 
11 #include "src/allocation.h"
12 #include "src/base/atomic-utils.h"
13 #include "src/utils.h"
14 
15 namespace v8 {
16 namespace internal {
17 
18 class HeapObject;
19 
20 // This data structure stores objects that went through object layout change
21 // that potentially invalidates slots recorded concurrently. The second part
22 // of each element is the size of the corresponding object before the layout
23 // change.
24 using InvalidatedSlots = std::map<HeapObject*, int>;
25 
26 // This class provides IsValid predicate that takes into account the set
27 // of invalidated objects in the given memory chunk.
28 // The sequence of queried slot must be non-decreasing. This allows fast
29 // implementation with complexity O(m*log(m) + n), where
30 // m is the number of invalidated objects in the memory chunk.
31 // n is the number of IsValid queries.
32 class InvalidatedSlotsFilter {
33  public:
34   explicit InvalidatedSlotsFilter(MemoryChunk* chunk);
35   inline bool IsValid(Address slot);
36 
37  private:
38   InvalidatedSlots::const_iterator iterator_;
39   InvalidatedSlots::const_iterator iterator_end_;
40   Address sentinel_;
41   Address invalidated_start_;
42   Address invalidated_end_;
43   HeapObject* invalidated_object_;
44   int invalidated_object_size_;
45   bool slots_in_free_space_are_valid_;
46   InvalidatedSlots empty_;
47 #ifdef DEBUG
48   Address last_slot_;
49 #endif
50 };
51 
52 }  // namespace internal
53 }  // namespace v8
54 
55 #endif  // V8_HEAP_INVALIDATED_SLOTS_H_
56