From: jochen@chromium.org Date: Mon, 7 Jul 2014 07:19:46 +0000 (+0000) Subject: Remove a bunch of Isolate::UncheckedCurrent calls X-Git-Tag: upstream/4.7.83~8373 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6d5d4b44b512eaa982adc1f8d03e9c649b5b08d9;p=platform%2Fupstream%2Fv8.git Remove a bunch of Isolate::UncheckedCurrent calls The callbacks are per isolate, so we shouldn't get the isolate implicitly from TLS. Also, we shouldn't allow calls to these methods prior to initializing the respective isolate (and silently ignore them). Esp. add a per-isolate API to set the stats counter callbacks and make it possible to set the stats counter callback after the isolate was touched. Embedders should use e.g. isolate->SetCounterFunction(callback) instead of v8::V8::SetCounterFunction(callback). BUG=none R=svenpanne@chromium.org LOG=y Review URL: https://codereview.chromium.org/365153002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22223 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/include/v8.h b/include/v8.h index f0cde0f..b886852 100644 --- a/include/v8.h +++ b/include/v8.h @@ -4430,6 +4430,21 @@ class V8_EXPORT Isolate { */ void SetUseCounterCallback(UseCounterCallback callback); + /** + * Enables the host application to provide a mechanism for recording + * statistics counters. + */ + void SetCounterFunction(CounterLookupCallback); + + /** + * Enables the host application to provide a mechanism for recording + * histograms. The CreateHistogram function returns a + * histogram which will later be passed to the AddHistogramSample + * function. + */ + void SetCreateHistogramFunction(CreateHistogramCallback); + void SetAddHistogramSampleFunction(AddHistogramSampleCallback); + private: template friend class PersistentValueMap; @@ -4744,6 +4759,8 @@ class V8_EXPORT V8 { /** * Enables the host application to provide a mechanism for recording * statistics counters. + * + * Deprecated, use Isolate::SetCounterFunction instead. */ static void SetCounterFunction(CounterLookupCallback); @@ -4752,8 +4769,13 @@ class V8_EXPORT V8 { * histograms. The CreateHistogram function returns a * histogram which will later be passed to the AddHistogramSample * function. + * + * Deprecated, use Isolate::SetCreateHistogramFunction instead. + * Isolate::SetAddHistogramSampleFunction instead. */ static void SetCreateHistogramFunction(CreateHistogramCallback); + + /** Deprecated, use Isolate::SetAddHistogramSampleFunction instead. */ static void SetAddHistogramSampleFunction(AddHistogramSampleCallback); /** Callback function for reporting failed access checks.*/ diff --git a/src/api.cc b/src/api.cc index f458c86..6cb6b9e 100644 --- a/src/api.cc +++ b/src/api.cc @@ -370,14 +370,14 @@ void V8::SetSnapshotDataBlob(StartupData* snapshot_blob) { void V8::SetFatalErrorHandler(FatalErrorCallback that) { - i::Isolate* isolate = i::Isolate::UncheckedCurrent(); + i::Isolate* isolate = i::Isolate::Current(); isolate->set_exception_behavior(that); } void V8::SetAllowCodeGenerationFromStringsCallback( AllowCodeGenerationFromStringsCallback callback) { - i::Isolate* isolate = i::Isolate::UncheckedCurrent(); + i::Isolate* isolate = i::Isolate::Current(); isolate->set_allow_code_gen_callback(callback); } @@ -6602,7 +6602,7 @@ void Isolate::RequestGarbageCollectionForTesting(GarbageCollectionType type) { Isolate* Isolate::GetCurrent() { - i::Isolate* isolate = i::Isolate::UncheckedCurrent(); + i::Isolate* isolate = i::Isolate::Current(); return reinterpret_cast(isolate); } @@ -6768,6 +6768,30 @@ void Isolate::SetUseCounterCallback(UseCounterCallback callback) { } +void Isolate::SetCounterFunction(CounterLookupCallback callback) { + i::Isolate* isolate = reinterpret_cast(this); + isolate->stats_table()->SetCounterFunction(callback); + isolate->InitializeLoggingAndCounters(); + isolate->counters()->ResetCounters(); +} + + +void Isolate::SetCreateHistogramFunction(CreateHistogramCallback callback) { + i::Isolate* isolate = reinterpret_cast(this); + isolate->stats_table()->SetCreateHistogramFunction(callback); + isolate->InitializeLoggingAndCounters(); + isolate->counters()->ResetHistograms(); +} + + +void Isolate::SetAddHistogramSampleFunction( + AddHistogramSampleCallback callback) { + reinterpret_cast(this) + ->stats_table() + ->SetAddHistogramSampleFunction(callback); +} + + String::Utf8Value::Utf8Value(v8::Handle obj) : str_(NULL), length_(0) { i::Isolate* isolate = i::Isolate::Current(); diff --git a/src/counters.cc b/src/counters.cc index 7de25e9..34e8467 100644 --- a/src/counters.cc +++ b/src/counters.cc @@ -109,6 +109,38 @@ Counters::Counters(Isolate* isolate) { } +void Counters::ResetCounters() { +#define SC(name, caption) name##_.Reset(); + STATS_COUNTER_LIST_1(SC) + STATS_COUNTER_LIST_2(SC) +#undef SC + +#define SC(name) \ + count_of_##name##_.Reset(); \ + size_of_##name##_.Reset(); + INSTANCE_TYPE_LIST(SC) +#undef SC + +#define SC(name) \ + count_of_CODE_TYPE_##name##_.Reset(); \ + size_of_CODE_TYPE_##name##_.Reset(); + CODE_KIND_LIST(SC) +#undef SC + +#define SC(name) \ + count_of_FIXED_ARRAY_##name##_.Reset(); \ + size_of_FIXED_ARRAY_##name##_.Reset(); + FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(SC) +#undef SC + +#define SC(name) \ + count_of_CODE_AGE_##name##_.Reset(); \ + size_of_CODE_AGE_##name##_.Reset(); + CODE_AGE_LIST_COMPLETE(SC) +#undef SC +} + + void Counters::ResetHistograms() { #define HT(name, caption) name##_.Reset(); HISTOGRAM_TIMER_LIST(HT) diff --git a/src/counters.h b/src/counters.h index 540bcbd..93079b1 100644 --- a/src/counters.h +++ b/src/counters.h @@ -143,6 +143,9 @@ class StatsCounter { return loc; } + // Reset the cached internal pointer. + void Reset() { lookup_done_ = false; } + protected: // Returns the cached address of this counter location. int* GetPtr() { @@ -629,6 +632,7 @@ class Counters { stats_counter_count }; + void ResetCounters(); void ResetHistograms(); private: diff --git a/src/d8.cc b/src/d8.cc index 1e204e9..dc8106b 100644 --- a/src/d8.cc +++ b/src/d8.cc @@ -677,7 +677,7 @@ Counter* CounterCollection::GetNextCounter() { } -void Shell::MapCounters(const char* name) { +void Shell::MapCounters(v8::Isolate* isolate, const char* name) { counters_file_ = base::OS::MemoryMappedFile::create( name, sizeof(CounterCollection), &local_counters_); void* memory = (counters_file_ == NULL) ? @@ -687,9 +687,9 @@ void Shell::MapCounters(const char* name) { Exit(1); } counters_ = static_cast(memory); - V8::SetCounterFunction(LookupCounter); - V8::SetCreateHistogramFunction(CreateHistogram); - V8::SetAddHistogramSampleFunction(AddHistogramSample); + isolate->SetCounterFunction(LookupCounter); + isolate->SetCreateHistogramFunction(CreateHistogram); + isolate->SetAddHistogramSampleFunction(AddHistogramSample); } @@ -897,7 +897,7 @@ void Shell::Initialize(Isolate* isolate) { Shell::counter_map_ = new CounterMap(); // Set up counters if (i::StrLength(i::FLAG_map_counters) != 0) - MapCounters(i::FLAG_map_counters); + MapCounters(isolate, i::FLAG_map_counters); if (i::FLAG_dump_counters || i::FLAG_track_gc_object_stats) { V8::SetCounterFunction(LookupCounter); V8::SetCreateHistogramFunction(CreateHistogram); diff --git a/src/d8.h b/src/d8.h index 53a9e1c..3a3ba11 100644 --- a/src/d8.h +++ b/src/d8.h @@ -269,7 +269,7 @@ class Shell : public i::AllStatic { int max, size_t buckets); static void AddHistogramSample(void* histogram, int sample); - static void MapCounters(const char* name); + static void MapCounters(v8::Isolate* isolate, const char* name); static Local DebugMessageDetails(Isolate* isolate, Handle message); diff --git a/src/isolate.cc b/src/isolate.cc index fb4b407..c8e6b7f 100644 --- a/src/isolate.cc +++ b/src/isolate.cc @@ -2047,16 +2047,6 @@ void Isolate::Enter() { } } - // Threads can have default isolate set into TLS as Current but not yet have - // PerIsolateThreadData for it, as it requires more advanced phase of the - // initialization. For example, a thread might be the one that system used for - // static initializers - in this case the default isolate is set in TLS but - // the thread did not yet Enter the isolate. If PerisolateThreadData is not - // there, use the isolate set in TLS. - if (current_isolate == NULL) { - current_isolate = Isolate::UncheckedCurrent(); - } - PerIsolateThreadData* data = FindOrAllocatePerThreadDataForThisThread(); ASSERT(data != NULL); ASSERT(data->isolate_ == this); diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index ecce557..a3ed5c5 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -19495,15 +19495,15 @@ class InitDefaultIsolateThread : public v8::base::Thread { break; case SetCounterFunction: - v8::V8::SetCounterFunction(NULL); + CcTest::isolate()->SetCounterFunction(NULL); break; case SetCreateHistogramFunction: - v8::V8::SetCreateHistogramFunction(NULL); + CcTest::isolate()->SetCreateHistogramFunction(NULL); break; case SetAddHistogramSampleFunction: - v8::V8::SetAddHistogramSampleFunction(NULL); + CcTest::isolate()->SetAddHistogramSampleFunction(NULL); break; } isolate->Exit(); @@ -20886,6 +20886,7 @@ TEST(Regress385349) { } +#ifdef DEBUG static int probes_counter = 0; static int misses_counter = 0; static int updates_counter = 0; @@ -20915,11 +20916,10 @@ static const char* kMegamorphicTestProgram = " fooify(a);" " fooify(b);" "}"; +#endif static void StubCacheHelper(bool primary) { - V8::SetCounterFunction(LookupCounter); - USE(kMegamorphicTestProgram); #ifdef DEBUG i::FLAG_native_code_counters = true; if (primary) { @@ -20929,6 +20929,7 @@ static void StubCacheHelper(bool primary) { } i::FLAG_crankshaft = false; LocalContext env; + env->GetIsolate()->SetCounterFunction(LookupCounter); v8::HandleScope scope(env->GetIsolate()); int initial_probes = probes_counter; int initial_misses = misses_counter; @@ -20958,6 +20959,7 @@ TEST(PrimaryStubCache) { } +#ifdef DEBUG static int cow_arrays_created_runtime = 0; @@ -20967,13 +20969,14 @@ static int* LookupCounterCOWArrays(const char* name) { } return NULL; } +#endif TEST(CheckCOWArraysCreatedRuntimeCounter) { - V8::SetCounterFunction(LookupCounterCOWArrays); #ifdef DEBUG i::FLAG_native_code_counters = true; LocalContext env; + env->GetIsolate()->SetCounterFunction(LookupCounterCOWArrays); v8::HandleScope scope(env->GetIsolate()); int initial_cow_arrays = cow_arrays_created_runtime; CompileRun("var o = [1, 2, 3];");