Index: src/global-handles.h |
=================================================================== |
--- src/global-handles.h (revision 3427) |
+++ src/global-handles.h (working copy) |
@@ -57,6 +57,47 @@ |
typedef void (*WeakReferenceGuest)(Object* object, void* parameter); |
+class GlobalHandlesPrivateData; |
+ |
+class GlobalHandlesData { |
+ // Internal node structure, one for each global handle. |
+ class Node; |
+ |
+ // Field always containing the number of weak and near-death handles. |
+ int number_of_weak_handles_; |
+ |
+ // Field always containing the number of weak and near-death handles |
+ // to global objects. These objects are also included in |
+ // number_of_weak_handles_. |
+ int number_of_global_object_weak_handles_; |
+ |
+ // Global handles are kept in a single linked list pointed to by head_. |
+ Node* head_; |
+ |
+ // Free list for DESTROYED global handles not yet deallocated. |
+ Node* first_free_; |
+ // List of deallocated nodes. |
+ // Deallocated nodes form a prefix of all the nodes and |
+ // |first_deallocated| points to last deallocated node before |
+ // |head|. Those deallocated nodes are additionally linked |
+ // by |next_free|: |
+ // 1st deallocated head |
+ // | | |
+ // V V |
+ // node node ... node node |
+ // .next -> .next -> .next -> |
+ // <- .next_free <- .next_free <- .next_free |
+ Node* first_deallocated_; |
+ |
+ GlobalHandlesPrivateData& private_data_; |
+ friend class GlobalHandles; |
+ friend class V8Context; |
+ |
+ GlobalHandlesData(); |
+ ~GlobalHandlesData(); |
+ DISALLOW_COPY_AND_ASSIGN(GlobalHandlesData); |
+}; |
+ |
class GlobalHandles : public AllStatic { |
public: |
// Creates a new global handle that is alive until Destroy is called. |
@@ -76,14 +117,17 @@ |
WeakReferenceCallback callback); |
// Returns the current number of weak handles. |
- static int NumberOfWeakHandles() { return number_of_weak_handles_; } |
+ static int NumberOfWeakHandles() { |
+ return v8_context()->global_handles_data_.number_of_weak_handles_; |
+ } |
static void RecordStats(HeapStats* stats); |
// Returns the current number of weak handles to global objects. |
// These handles are also included in NumberOfWeakHandles(). |
static int NumberOfGlobalObjectWeakHandles() { |
- return number_of_global_object_weak_handles_; |
+ return v8_context()->global_handles_data_. |
+ number_of_global_object_weak_handles_; |
} |
// Clear the weakness of a global handle. |
@@ -135,43 +179,30 @@ |
#endif |
class Pool; |
private: |
- // Internal node structure, one for each global handle. |
- class Node; |
+ typedef GlobalHandlesData::Node Node; |
+ static Node* head() { |
+ return v8_context()->global_handles_data_.head_; |
+ } |
- // Field always containing the number of weak and near-death handles. |
- static int number_of_weak_handles_; |
+ static void set_head(Node* value) { |
+ v8_context()->global_handles_data_.head_ = value; |
+ } |
- // Field always containing the number of weak and near-death handles |
- // to global objects. These objects are also included in |
- // number_of_weak_handles_. |
- static int number_of_global_object_weak_handles_; |
+ static Node* first_free() { |
+ return v8_context()->global_handles_data_.first_free_; |
+ } |
+ static void set_first_free(Node* value) { |
+ v8_context()->global_handles_data_.first_free_ = value; |
+ } |
- // Global handles are kept in a single linked list pointed to by head_. |
- static Node* head_; |
- static Node* head() { return head_; } |
- static void set_head(Node* value) { head_ = value; } |
- |
- // Free list for DESTROYED global handles not yet deallocated. |
- static Node* first_free_; |
- static Node* first_free() { return first_free_; } |
- static void set_first_free(Node* value) { first_free_ = value; } |
- |
- // List of deallocated nodes. |
- // Deallocated nodes form a prefix of all the nodes and |
- // |first_deallocated| points to last deallocated node before |
- // |head|. Those deallocated nodes are additionally linked |
- // by |next_free|: |
- // 1st deallocated head |
- // | | |
- // V V |
- // node node ... node node |
- // .next -> .next -> .next -> |
- // <- .next_free <- .next_free <- .next_free |
- static Node* first_deallocated_; |
- static Node* first_deallocated() { return first_deallocated_; } |
+ static Node* first_deallocated() { |
+ return v8_context()->global_handles_data_.first_deallocated_; |
+ } |
static void set_first_deallocated(Node* value) { |
- first_deallocated_ = value; |
+ v8_context()->global_handles_data_.first_deallocated_ = value; |
} |
+ |
+ friend class GlobalHandlesData; |
}; |