Revision: 14764
Author: [email protected]
Date: Thu May 23 01:19:27 2013
Log: de-isolate Persistent::Dispose
[email protected]
BUG=
Review URL: https://codereview.chromium.org/15648008
http://code.google.com/p/v8/source/detail?r=14764
Modified:
/branches/bleeding_edge/include/v8.h
/branches/bleeding_edge/src/api.cc
/branches/bleeding_edge/src/global-handles.cc
/branches/bleeding_edge/src/global-handles.h
=======================================
--- /branches/bleeding_edge/include/v8.h Thu May 23 00:05:58 2013
+++ /branches/bleeding_edge/include/v8.h Thu May 23 01:19:27 2013
@@ -4541,8 +4541,7 @@
static internal::Object** GlobalizeReference(internal::Isolate* isolate,
internal::Object** handle);
- static void DisposeGlobal(internal::Isolate* isolate,
- internal::Object** global_handle);
+ static void DisposeGlobal(internal::Object** global_handle);
typedef WeakReferenceCallbacks<Value, void>::Revivable RevivableCallback;
static void MakeWeak(internal::Isolate* isolate,
internal::Object** global_handle,
@@ -5486,18 +5485,17 @@
template <class T>
void Persistent<T>::Dispose() {
- Dispose(Isolate::GetCurrent());
+ if (this->IsEmpty()) return;
+ V8::DisposeGlobal(reinterpret_cast<internal::Object**>(this->val_));
+#ifndef V8_USE_UNSAFE_HANDLES
+ val_ = 0;
+#endif
}
template <class T>
void Persistent<T>::Dispose(Isolate* isolate) {
- if (this->IsEmpty()) return;
- V8::DisposeGlobal(reinterpret_cast<internal::Isolate*>(isolate),
- reinterpret_cast<internal::Object**>(this->val_));
-#ifndef V8_USE_UNSAFE_HANDLES
- val_ = 0;
-#endif
+ Dispose();
}
=======================================
--- /branches/bleeding_edge/src/api.cc Tue May 21 23:35:38 2013
+++ /branches/bleeding_edge/src/api.cc Thu May 23 01:19:27 2013
@@ -645,11 +645,8 @@
}
-void V8::DisposeGlobal(i::Isolate* isolate, i::Object** obj) {
- ASSERT(isolate == i::Isolate::Current());
- LOG_API(isolate, "DisposeGlobal");
- if (!isolate->IsInitialized()) return;
- isolate->global_handles()->Destroy(obj);
+void V8::DisposeGlobal(i::Object** obj) {
+ i::GlobalHandles::Destroy(obj);
}
// --- H a n d l e s ---
=======================================
--- /branches/bleeding_edge/src/global-handles.cc Tue May 7 03:44:30 2013
+++ /branches/bleeding_edge/src/global-handles.cc Thu May 23 01:19:27 2013
@@ -105,7 +105,7 @@
*first_free = this;
}
- void Acquire(Object* object, GlobalHandles* global_handles) {
+ void Acquire(Object* object) {
ASSERT(state() == FREE);
object_ = object;
class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId;
@@ -114,10 +114,10 @@
set_state(NORMAL);
parameter_or_next_free_.parameter = NULL;
near_death_callback_ = NULL;
- IncreaseBlockUses(global_handles);
+ IncreaseBlockUses();
}
- void Release(GlobalHandles* global_handles) {
+ void Release() {
ASSERT(state() != FREE);
set_state(FREE);
#ifdef ENABLE_EXTRA_CHECKS
@@ -128,9 +128,7 @@
set_partially_dependent(false);
near_death_callback_ = NULL;
#endif
- parameter_or_next_free_.next_free = global_handles->first_free_;
- global_handles->first_free_ = this;
- DecreaseBlockUses(global_handles);
+ DecreaseBlockUses();
}
// Object slot accessors.
@@ -256,11 +254,10 @@
set_parameter(NULL);
}
- bool PostGarbageCollectionProcessing(Isolate* isolate,
- GlobalHandles* global_handles) {
+ bool PostGarbageCollectionProcessing(Isolate* isolate) {
if (state() != Node::PENDING) return false;
if (near_death_callback_ == NULL) {
- Release(global_handles);
+ Release();
return false;
}
void* par = parameter();
@@ -299,8 +296,8 @@
private:
inline NodeBlock* FindBlock();
- inline void IncreaseBlockUses(GlobalHandles* global_handles);
- inline void DecreaseBlockUses(GlobalHandles* global_handles);
+ inline void IncreaseBlockUses();
+ inline void DecreaseBlockUses();
// Storage for object pointer.
// Placed first to avoid offset computation.
@@ -343,8 +340,12 @@
public:
static const int kSize = 256;
- explicit NodeBlock(NodeBlock* next)
- : next_(next), used_nodes_(0), next_used_(NULL), prev_used_(NULL) {}
+ explicit NodeBlock(GlobalHandles* global_handles, NodeBlock* next)
+ : next_(next),
+ used_nodes_(0),
+ next_used_(NULL),
+ prev_used_(NULL),
+ global_handles_(global_handles) {}
void PutNodesOnFreeList(Node** first_free) {
for (int i = kSize - 1; i >= 0; --i) {
@@ -357,11 +358,11 @@
return &nodes_[index];
}
- void IncreaseUses(GlobalHandles* global_handles) {
+ void IncreaseUses() {
ASSERT(used_nodes_ < kSize);
if (used_nodes_++ == 0) {
- NodeBlock* old_first = global_handles->first_used_block_;
- global_handles->first_used_block_ = this;
+ NodeBlock* old_first = global_handles_->first_used_block_;
+ global_handles_->first_used_block_ = this;
next_used_ = old_first;
prev_used_ = NULL;
if (old_first == NULL) return;
@@ -369,16 +370,18 @@
}
}
- void DecreaseUses(GlobalHandles* global_handles) {
+ void DecreaseUses() {
ASSERT(used_nodes_ > 0);
if (--used_nodes_ == 0) {
if (next_used_ != NULL) next_used_->prev_used_ = prev_used_;
if (prev_used_ != NULL) prev_used_->next_used_ = next_used_;
- if (this == global_handles->first_used_block_) {
- global_handles->first_used_block_ = next_used_;
+ if (this == global_handles_->first_used_block_) {
+ global_handles_->first_used_block_ = next_used_;
}
}
}
+
+ GlobalHandles* global_handles() { return global_handles_; }
// Next block in the list of all blocks.
NodeBlock* next() const { return next_; }
@@ -393,6 +396,7 @@
int used_nodes_;
NodeBlock* next_used_;
NodeBlock* prev_used_;
+ GlobalHandles* global_handles_;
};
@@ -405,13 +409,23 @@
}
-void GlobalHandles::Node::IncreaseBlockUses(GlobalHandles* global_handles)
{
- FindBlock()->IncreaseUses(global_handles);
+void GlobalHandles::Node::IncreaseBlockUses() {
+ NodeBlock* node_block = FindBlock();
+ node_block->IncreaseUses();
+ GlobalHandles* global_handles = node_block->global_handles();
+ global_handles->isolate()->counters()->global_handles()->Increment();
+ global_handles->number_of_global_handles_++;
}
-void GlobalHandles::Node::DecreaseBlockUses(GlobalHandles* global_handles)
{
- FindBlock()->DecreaseUses(global_handles);
+void GlobalHandles::Node::DecreaseBlockUses() {
+ NodeBlock* node_block = FindBlock();
+ GlobalHandles* global_handles = node_block->global_handles();
+ parameter_or_next_free_.next_free = global_handles->first_free_;
+ global_handles->first_free_ = this;
+ node_block->DecreaseUses();
+ global_handles->isolate()->counters()->global_handles()->Decrement();
+ global_handles->number_of_global_handles_--;
}
@@ -465,17 +479,15 @@
Handle<Object> GlobalHandles::Create(Object* value) {
- isolate_->counters()->global_handles()->Increment();
- number_of_global_handles_++;
if (first_free_ == NULL) {
- first_block_ = new NodeBlock(first_block_);
+ first_block_ = new NodeBlock(this, first_block_);
first_block_->PutNodesOnFreeList(&first_free_);
}
ASSERT(first_free_ != NULL);
// Take the first node in the free list.
Node* result = first_free_;
first_free_ = result->next_free();
- result->Acquire(value, this);
+ result->Acquire(value);
if (isolate_->heap()->InNewSpace(value) &&
!result->is_in_new_space_list()) {
new_space_nodes_.Add(result);
@@ -486,10 +498,7 @@
void GlobalHandles::Destroy(Object** location) {
- isolate_->counters()->global_handles()->Decrement();
- number_of_global_handles_--;
- if (location == NULL) return;
- Node::FromLocation(location)->Release(this);
+ if (location != NULL) Node::FromLocation(location)->Release();
}
@@ -653,7 +662,7 @@
continue;
}
node->clear_partially_dependent();
- if (node->PostGarbageCollectionProcessing(isolate_, this)) {
+ if (node->PostGarbageCollectionProcessing(isolate_)) {
if (initial_post_gc_processing_count != post_gc_processing_count_)
{
// Weak callback triggered another GC and another round of
// PostGarbageCollection processing. The current node might
@@ -669,7 +678,7 @@
} else {
for (NodeIterator it(this); !it.done(); it.Advance()) {
it.node()->clear_partially_dependent();
- if (it.node()->PostGarbageCollectionProcessing(isolate_, this)) {
+ if (it.node()->PostGarbageCollectionProcessing(isolate_)) {
if (initial_post_gc_processing_count != post_gc_processing_count_)
{
// See the comment above.
return next_gc_likely_to_collect_more;
=======================================
--- /branches/bleeding_edge/src/global-handles.h Tue May 7 03:44:30 2013
+++ /branches/bleeding_edge/src/global-handles.h Thu May 23 01:19:27 2013
@@ -128,7 +128,7 @@
Handle<Object> Create(Object* value);
// Destroy a global handle.
- void Destroy(Object** location);
+ static void Destroy(Object** location);
typedef WeakReferenceCallbacks<v8::Value, void>::Revivable
RevivableCallback;
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.