| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_GLOBAL_HANDLES_H_ | 5 #ifndef V8_GLOBAL_HANDLES_H_ |
| 6 #define V8_GLOBAL_HANDLES_H_ | 6 #define V8_GLOBAL_HANDLES_H_ |
| 7 | 7 |
| 8 #include "include/v8.h" | 8 #include "include/v8.h" |
| 9 #include "include/v8-profiler.h" | 9 #include "include/v8-profiler.h" |
| 10 | 10 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 | 90 |
| 91 bool operator<(const ObjectGroupRetainerInfo& other) const { | 91 bool operator<(const ObjectGroupRetainerInfo& other) const { |
| 92 return id < other.id; | 92 return id < other.id; |
| 93 } | 93 } |
| 94 | 94 |
| 95 UniqueId id; | 95 UniqueId id; |
| 96 RetainedObjectInfo* info; | 96 RetainedObjectInfo* info; |
| 97 }; | 97 }; |
| 98 | 98 |
| 99 enum WeaknessType { | 99 enum WeaknessType { |
| 100 NORMAL_WEAK, // Embedder gets a handle to the dying object. | |
| 101 // In the following cases, the embedder gets the parameter they passed in | 100 // In the following cases, the embedder gets the parameter they passed in |
| 102 // earlier, and 0 or 2 first internal fields. Note that the internal | 101 // earlier, and 0 or 2 first internal fields. Note that the internal |
| 103 // fields must contain aligned non-V8 pointers. Getting pointers to V8 | 102 // fields must contain aligned non-V8 pointers. Getting pointers to V8 |
| 104 // objects through this interface would be GC unsafe so in that case the | 103 // objects through this interface would be GC unsafe so in that case the |
| 105 // embedder gets a null pointer instead. | 104 // embedder gets a null pointer instead. |
| 106 PHANTOM_WEAK, | 105 PHANTOM_WEAK, |
| 107 PHANTOM_WEAK_2_INTERNAL_FIELDS, | 106 PHANTOM_WEAK_2_INTERNAL_FIELDS, |
| 108 // Like NORMAL_WEAK, but uses WeakCallbackInfo instead of WeakCallbackData. | 107 // Embedder gets a handle to the dying object. |
| 109 FINALIZER_WEAK, | 108 FINALIZER_WEAK, |
| 110 }; | 109 }; |
| 111 | 110 |
| 112 class GlobalHandles { | 111 class GlobalHandles { |
| 113 public: | 112 public: |
| 114 ~GlobalHandles(); | 113 ~GlobalHandles(); |
| 115 | 114 |
| 116 // Creates a new global handle that is alive until Destroy is called. | 115 // Creates a new global handle that is alive until Destroy is called. |
| 117 Handle<Object> Create(Object* value); | 116 Handle<Object> Create(Object* value); |
| 118 | 117 |
| 119 // Copy a global handle | 118 // Copy a global handle |
| 120 static Handle<Object> CopyGlobal(Object** location); | 119 static Handle<Object> CopyGlobal(Object** location); |
| 121 | 120 |
| 122 // Destroy a global handle. | 121 // Destroy a global handle. |
| 123 static void Destroy(Object** location); | 122 static void Destroy(Object** location); |
| 124 | 123 |
| 125 typedef WeakCallbackData<v8::Value, void>::Callback WeakCallback; | |
| 126 | |
| 127 // For a phantom weak reference, the callback does not have access to the | |
| 128 // dying object. Phantom weak references are preferred because they allow | |
| 129 // memory to be reclaimed in one GC cycle rather than two. However, for | |
| 130 // historical reasons the default is non-phantom. | |
| 131 enum PhantomState { Nonphantom, Phantom }; | |
| 132 | |
| 133 // Make the global handle weak and set the callback parameter for the | 124 // Make the global handle weak and set the callback parameter for the |
| 134 // handle. When the garbage collector recognizes that only weak global | 125 // handle. When the garbage collector recognizes that only weak global |
| 135 // handles point to an object the callback function is invoked (for each | 126 // handles point to an object the callback function is invoked (for each |
| 136 // handle) with the handle and corresponding parameter as arguments. By | 127 // handle) with the handle and corresponding parameter as arguments. By |
| 137 // default the handle still contains a pointer to the object that is being | 128 // default the handle still contains a pointer to the object that is being |
| 138 // collected. For this reason the object is not collected until the next | 129 // collected. For this reason the object is not collected until the next |
| 139 // GC. For a phantom weak handle the handle is cleared (set to a Smi) | 130 // GC. For a phantom weak handle the handle is cleared (set to a Smi) |
| 140 // before the callback is invoked, but the handle can still be identified | 131 // before the callback is invoked, but the handle can still be identified |
| 141 // in the callback by using the location() of the handle. | 132 // in the callback by using the location() of the handle. |
| 142 static void MakeWeak(Object** location, void* parameter, | 133 static void MakeWeak(Object** location, void* parameter, |
| 143 WeakCallback weak_callback); | |
| 144 | |
| 145 // It would be nice to template this one, but it's really hard to get | |
| 146 // the template instantiator to work right if you do. | |
| 147 static void MakeWeak(Object** location, void* parameter, | |
| 148 WeakCallbackInfo<void>::Callback weak_callback, | 134 WeakCallbackInfo<void>::Callback weak_callback, |
| 149 v8::WeakCallbackType type); | 135 v8::WeakCallbackType type); |
| 150 | 136 |
| 151 void RecordStats(HeapStats* stats); | 137 void RecordStats(HeapStats* stats); |
| 152 | 138 |
| 153 // Returns the current number of weak handles. | 139 // Returns the current number of weak handles. |
| 154 int NumberOfWeakHandles(); | 140 int NumberOfWeakHandles(); |
| 155 | 141 |
| 156 // Returns the current number of weak handles to global objects. | 142 // Returns the current number of weak handles to global objects. |
| 157 // These handles are also included in NumberOfWeakHandles(). | 143 // These handles are also included in NumberOfWeakHandles(). |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 int singleton_handles_[NUMBER_OF_SINGLETON_HANDLES]; | 441 int singleton_handles_[NUMBER_OF_SINGLETON_HANDLES]; |
| 456 | 442 |
| 457 DISALLOW_COPY_AND_ASSIGN(EternalHandles); | 443 DISALLOW_COPY_AND_ASSIGN(EternalHandles); |
| 458 }; | 444 }; |
| 459 | 445 |
| 460 | 446 |
| 461 } // namespace internal | 447 } // namespace internal |
| 462 } // namespace v8 | 448 } // namespace v8 |
| 463 | 449 |
| 464 #endif // V8_GLOBAL_HANDLES_H_ | 450 #endif // V8_GLOBAL_HANDLES_H_ |
| OLD | NEW |