| Index: src/global-handles.cc
|
| ===================================================================
|
| --- src/global-handles.cc (revision 3427)
|
| +++ src/global-handles.cc (working copy)
|
| @@ -32,8 +32,7 @@
|
|
|
| namespace v8 {
|
| namespace internal {
|
| -
|
| -class GlobalHandles::Node : public Malloced {
|
| +class GlobalHandlesData::Node : public Malloced {
|
| public:
|
|
|
| void Initialize(Object* object) {
|
| @@ -66,9 +65,10 @@
|
|
|
| void Destroy() {
|
| if (state_ == WEAK || IsNearDeath()) {
|
| - GlobalHandles::number_of_weak_handles_--;
|
| + v8_context()->global_handles_data_.number_of_weak_handles_--;
|
| if (object_->IsJSGlobalObject()) {
|
| - GlobalHandles::number_of_global_object_weak_handles_--;
|
| + v8_context()->global_handles_data_.
|
| + number_of_global_object_weak_handles_--;
|
| }
|
| }
|
| state_ = DESTROYED;
|
| @@ -103,9 +103,10 @@
|
| LOG(HandleEvent("GlobalHandle::MakeWeak", handle().location()));
|
| ASSERT(state_ != DESTROYED);
|
| if (state_ != WEAK && !IsNearDeath()) {
|
| - GlobalHandles::number_of_weak_handles_++;
|
| + v8_context()->global_handles_data_.number_of_weak_handles_++;
|
| if (object_->IsJSGlobalObject()) {
|
| - GlobalHandles::number_of_global_object_weak_handles_++;
|
| + v8_context()->global_handles_data_.
|
| + number_of_global_object_weak_handles_++;
|
| }
|
| }
|
| state_ = WEAK;
|
| @@ -117,9 +118,10 @@
|
| LOG(HandleEvent("GlobalHandle::ClearWeakness", handle().location()));
|
| ASSERT(state_ != DESTROYED);
|
| if (state_ == WEAK || IsNearDeath()) {
|
| - GlobalHandles::number_of_weak_handles_--;
|
| + v8_context()->global_handles_data_.number_of_weak_handles_--;
|
| if (object_->IsJSGlobalObject()) {
|
| - GlobalHandles::number_of_global_object_weak_handles_--;
|
| + v8_context()->global_handles_data_.
|
| + number_of_global_object_weak_handles_--;
|
| }
|
| }
|
| state_ = NORMAL;
|
| @@ -164,9 +166,9 @@
|
| // Forbid reuse of destroyed nodes as they might be already deallocated.
|
| // It's fine though to reuse nodes that were destroyed in weak callback
|
| // as those cannot be deallocated until we are back from the callback.
|
| - set_first_free(NULL);
|
| - if (first_deallocated()) {
|
| - first_deallocated()->set_next(head());
|
| + GlobalHandles::set_first_free(NULL);
|
| + if (GlobalHandles::first_deallocated()) {
|
| + GlobalHandles::first_deallocated()->set_next(GlobalHandles::head());
|
| }
|
| // Leaving V8.
|
| VMState state(EXTERNAL);
|
| @@ -258,12 +260,13 @@
|
| Node* limit_;
|
| };
|
|
|
| +class GlobalHandlesPrivateData {
|
| + public:
|
| + GlobalHandles::Pool pool_;
|
| +};
|
|
|
| -static GlobalHandles::Pool pool_;
|
| -
|
| -
|
| Handle<Object> GlobalHandles::Create(Object* value) {
|
| - Counters::global_handles.Increment();
|
| + INC_COUNTER(global_handles);
|
| Node* result;
|
| if (first_free()) {
|
| // Take the first node in the free list.
|
| @@ -277,7 +280,7 @@
|
| set_head(result);
|
| } else {
|
| // Allocate a new node.
|
| - result = pool_.Allocate();
|
| + result = v8_context()->global_handles_data_.private_data_.pool_.Allocate();
|
| result->set_next(head());
|
| set_head(result);
|
| }
|
| @@ -287,7 +290,7 @@
|
|
|
|
|
| void GlobalHandles::Destroy(Object** location) {
|
| - Counters::global_handles.Decrement();
|
| + DEC_COUNTER(global_handles);
|
| if (location == NULL) return;
|
| Node* node = Node::FromLocation(location);
|
| node->Destroy();
|
| @@ -322,7 +325,9 @@
|
| void GlobalHandles::IterateWeakRoots(ObjectVisitor* v) {
|
| // Traversal of GC roots in the global handle list that are marked as
|
| // WEAK or PENDING.
|
| - for (Node* current = head_; current != NULL; current = current->next()) {
|
| + for (Node* current = v8_context()->global_handles_data_.head_;
|
| + current != NULL;
|
| + current = current->next()) {
|
| if (current->state_ == Node::WEAK
|
| || current->state_ == Node::PENDING
|
| || current->state_ == Node::NEAR_DEATH) {
|
| @@ -334,7 +339,9 @@
|
|
|
| void GlobalHandles::IterateWeakRoots(WeakReferenceGuest f,
|
| WeakReferenceCallback callback) {
|
| - for (Node* current = head_; current != NULL; current = current->next()) {
|
| + for (Node* current = v8_context()->global_handles_data_.head_;
|
| + current != NULL;
|
| + current = current->next()) {
|
| if (current->IsWeak() && current->callback() == callback) {
|
| f(current->object_, current->parameter());
|
| }
|
| @@ -343,7 +350,9 @@
|
|
|
|
|
| void GlobalHandles::IdentifyWeakHandles(WeakSlotCallback f) {
|
| - for (Node* current = head_; current != NULL; current = current->next()) {
|
| + for (Node* current = v8_context()->global_handles_data_.head_;
|
| + current != NULL;
|
| + current = current->next()) {
|
| if (current->state_ == Node::WEAK) {
|
| if (f(¤t->object_)) {
|
| current->state_ = Node::PENDING;
|
| @@ -363,7 +372,7 @@
|
| // At the same time deallocate all DESTROYED nodes.
|
| ASSERT(Heap::gc_state() == Heap::NOT_IN_GC);
|
| const int initial_post_gc_processing_count = ++post_gc_processing_count;
|
| - Node** p = &head_;
|
| + Node** p = &v8_context()->global_handles_data_.head_;
|
| while (*p != NULL) {
|
| if ((*p)->PostGarbageCollectionProcessing()) {
|
| if (initial_post_gc_processing_count != post_gc_processing_count) {
|
| @@ -396,7 +405,9 @@
|
|
|
| void GlobalHandles::IterateStrongRoots(ObjectVisitor* v) {
|
| // Traversal of global handles marked as NORMAL.
|
| - for (Node* current = head_; current != NULL; current = current->next()) {
|
| + for (Node* current = v8_context()->global_handles_data_.head_;
|
| + current != NULL;
|
| + current = current->next()) {
|
| if (current->state_ == Node::NORMAL) {
|
| v->VisitPointer(¤t->object_);
|
| }
|
| @@ -405,7 +416,9 @@
|
|
|
|
|
| void GlobalHandles::IterateAllRoots(ObjectVisitor* v) {
|
| - for (Node* current = head_; current != NULL; current = current->next()) {
|
| + for (Node* current = v8_context()->global_handles_data_.head_;
|
| + current != NULL;
|
| + current = current->next()) {
|
| if (current->state_ != Node::DESTROYED) {
|
| v->VisitPointer(¤t->object_);
|
| }
|
| @@ -418,24 +431,30 @@
|
| set_head(NULL);
|
| set_first_free(NULL);
|
| set_first_deallocated(NULL);
|
| - pool_.Release();
|
| + v8_context()->global_handles_data_.private_data_.pool_.Release();
|
| }
|
|
|
| +GlobalHandlesData::GlobalHandlesData()
|
| + :number_of_weak_handles_(0),
|
| + number_of_global_object_weak_handles_(0),
|
| + head_(NULL),
|
| + first_free_(NULL),
|
| + private_data_(*new GlobalHandlesPrivateData()),
|
| + first_deallocated_(NULL) {
|
| +}
|
|
|
| -int GlobalHandles::number_of_weak_handles_ = 0;
|
| -int GlobalHandles::number_of_global_object_weak_handles_ = 0;
|
| +GlobalHandlesData::~GlobalHandlesData() {
|
| + delete &private_data_;
|
| +}
|
|
|
| -GlobalHandles::Node* GlobalHandles::head_ = NULL;
|
| -GlobalHandles::Node* GlobalHandles::first_free_ = NULL;
|
| -GlobalHandles::Node* GlobalHandles::first_deallocated_ = NULL;
|
| -
|
| void GlobalHandles::RecordStats(HeapStats* stats) {
|
| *stats->global_handle_count = 0;
|
| *stats->weak_global_handle_count = 0;
|
| *stats->pending_global_handle_count = 0;
|
| *stats->near_death_global_handle_count = 0;
|
| *stats->destroyed_global_handle_count = 0;
|
| - for (Node* current = head_; current != NULL; current = current->next()) {
|
| + for (Node* current = v8_context()->global_handles_data_.head_;
|
| + current != NULL; current = current->next()) {
|
| *stats->global_handle_count += 1;
|
| if (current->state_ == Node::WEAK) {
|
| *stats->weak_global_handle_count += 1;
|
| @@ -458,7 +477,9 @@
|
| int near_death = 0;
|
| int destroyed = 0;
|
|
|
| - for (Node* current = head_; current != NULL; current = current->next()) {
|
| + for (Node* current = v8_context()->global_handles_data_.head_;
|
| + current != NULL;
|
| + current = current->next()) {
|
| total++;
|
| if (current->state_ == Node::WEAK) weak++;
|
| if (current->state_ == Node::PENDING) pending++;
|
| @@ -477,7 +498,9 @@
|
|
|
| void GlobalHandles::Print() {
|
| PrintF("Global handles:\n");
|
| - for (Node* current = head_; current != NULL; current = current->next()) {
|
| + for (Node* current = v8_context()->global_handles_data_.head_;
|
| + current != NULL;
|
| + current = current->next()) {
|
| PrintF(" handle %p to %p (weak=%d)\n", current->handle().location(),
|
| *current->handle(), current->state_ == Node::WEAK);
|
| }
|
|
|