Home | History | Annotate | Download | only in extensions
      1 // Copyright 2012 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/extensions/statistics-extension.h"
      6 
      7 namespace v8 {
      8 namespace internal {
      9 
     10 const char* const StatisticsExtension::kSource =
     11     "native function getV8Statistics();";
     12 
     13 
     14 v8::Handle<v8::FunctionTemplate> StatisticsExtension::GetNativeFunctionTemplate(
     15     v8::Isolate* isolate,
     16     v8::Handle<v8::String> str) {
     17   DCHECK(strcmp(*v8::String::Utf8Value(str), "getV8Statistics") == 0);
     18   return v8::FunctionTemplate::New(isolate, StatisticsExtension::GetCounters);
     19 }
     20 
     21 
     22 static void AddCounter(v8::Isolate* isolate,
     23                        v8::Local<v8::Object> object,
     24                        StatsCounter* counter,
     25                        const char* name) {
     26   if (counter->Enabled()) {
     27     object->Set(v8::String::NewFromUtf8(isolate, name),
     28                 v8::Number::New(isolate, *counter->GetInternalPointer()));
     29   }
     30 }
     31 
     32 static void AddNumber(v8::Isolate* isolate,
     33                       v8::Local<v8::Object> object,
     34                       intptr_t value,
     35                       const char* name) {
     36   object->Set(v8::String::NewFromUtf8(isolate, name),
     37               v8::Number::New(isolate, static_cast<double>(value)));
     38 }
     39 
     40 
     41 static void AddNumber64(v8::Isolate* isolate,
     42                         v8::Local<v8::Object> object,
     43                         int64_t value,
     44                         const char* name) {
     45   object->Set(v8::String::NewFromUtf8(isolate, name),
     46               v8::Number::New(isolate, static_cast<double>(value)));
     47 }
     48 
     49 
     50 void StatisticsExtension::GetCounters(
     51     const v8::FunctionCallbackInfo<v8::Value>& args) {
     52   Isolate* isolate = reinterpret_cast<Isolate*>(args.GetIsolate());
     53   Heap* heap = isolate->heap();
     54 
     55   if (args.Length() > 0) {  // GC if first argument evaluates to true.
     56     if (args[0]->IsBoolean() && args[0]->ToBoolean()->Value()) {
     57       heap->CollectAllGarbage(Heap::kNoGCFlags, "counters extension");
     58     }
     59   }
     60 
     61   Counters* counters = isolate->counters();
     62   v8::Local<v8::Object> result = v8::Object::New(args.GetIsolate());
     63 
     64 #define ADD_COUNTER(name, caption)                                            \
     65   AddCounter(args.GetIsolate(), result, counters->name(), #name);
     66 
     67   STATS_COUNTER_LIST_1(ADD_COUNTER)
     68   STATS_COUNTER_LIST_2(ADD_COUNTER)
     69 #undef ADD_COUNTER
     70 #define ADD_COUNTER(name)                                                      \
     71   AddCounter(args.GetIsolate(), result, counters->count_of_##name(),           \
     72              "count_of_" #name);                                               \
     73   AddCounter(args.GetIsolate(), result, counters->size_of_##name(),            \
     74              "size_of_" #name);
     75 
     76   INSTANCE_TYPE_LIST(ADD_COUNTER)
     77 #undef ADD_COUNTER
     78 #define ADD_COUNTER(name)                                                      \
     79   AddCounter(args.GetIsolate(), result, counters->count_of_CODE_TYPE_##name(), \
     80              "count_of_CODE_TYPE_" #name);                                     \
     81   AddCounter(args.GetIsolate(), result, counters->size_of_CODE_TYPE_##name(),  \
     82              "size_of_CODE_TYPE_" #name);
     83 
     84   CODE_KIND_LIST(ADD_COUNTER)
     85 #undef ADD_COUNTER
     86 #define ADD_COUNTER(name)                                                      \
     87   AddCounter(args.GetIsolate(), result,                                        \
     88              counters->count_of_FIXED_ARRAY_##name(),                          \
     89              "count_of_FIXED_ARRAY_" #name);                                   \
     90   AddCounter(args.GetIsolate(), result,                                        \
     91              counters->size_of_FIXED_ARRAY_##name(),                           \
     92              "size_of_FIXED_ARRAY_" #name);
     93 
     94   FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(ADD_COUNTER)
     95 #undef ADD_COUNTER
     96 
     97   AddNumber(args.GetIsolate(), result, isolate->memory_allocator()->Size(),
     98             "total_committed_bytes");
     99   AddNumber(args.GetIsolate(), result, heap->new_space()->Size(),
    100             "new_space_live_bytes");
    101   AddNumber(args.GetIsolate(), result, heap->new_space()->Available(),
    102             "new_space_available_bytes");
    103   AddNumber(args.GetIsolate(), result, heap->new_space()->CommittedMemory(),
    104             "new_space_commited_bytes");
    105   AddNumber(args.GetIsolate(), result, heap->old_pointer_space()->Size(),
    106             "old_pointer_space_live_bytes");
    107   AddNumber(args.GetIsolate(), result, heap->old_pointer_space()->Available(),
    108             "old_pointer_space_available_bytes");
    109   AddNumber(args.GetIsolate(), result,
    110             heap->old_pointer_space()->CommittedMemory(),
    111             "old_pointer_space_commited_bytes");
    112   AddNumber(args.GetIsolate(), result, heap->old_data_space()->Size(),
    113             "old_data_space_live_bytes");
    114   AddNumber(args.GetIsolate(), result, heap->old_data_space()->Available(),
    115             "old_data_space_available_bytes");
    116   AddNumber(args.GetIsolate(), result,
    117             heap->old_data_space()->CommittedMemory(),
    118             "old_data_space_commited_bytes");
    119   AddNumber(args.GetIsolate(), result, heap->code_space()->Size(),
    120             "code_space_live_bytes");
    121   AddNumber(args.GetIsolate(), result, heap->code_space()->Available(),
    122             "code_space_available_bytes");
    123   AddNumber(args.GetIsolate(), result, heap->code_space()->CommittedMemory(),
    124             "code_space_commited_bytes");
    125   AddNumber(args.GetIsolate(), result, heap->cell_space()->Size(),
    126             "cell_space_live_bytes");
    127   AddNumber(args.GetIsolate(), result, heap->cell_space()->Available(),
    128             "cell_space_available_bytes");
    129   AddNumber(args.GetIsolate(), result, heap->cell_space()->CommittedMemory(),
    130             "cell_space_commited_bytes");
    131   AddNumber(args.GetIsolate(), result, heap->property_cell_space()->Size(),
    132             "property_cell_space_live_bytes");
    133   AddNumber(args.GetIsolate(), result, heap->property_cell_space()->Available(),
    134             "property_cell_space_available_bytes");
    135   AddNumber(args.GetIsolate(), result,
    136             heap->property_cell_space()->CommittedMemory(),
    137             "property_cell_space_commited_bytes");
    138   AddNumber(args.GetIsolate(), result, heap->lo_space()->Size(),
    139             "lo_space_live_bytes");
    140   AddNumber(args.GetIsolate(), result, heap->lo_space()->Available(),
    141             "lo_space_available_bytes");
    142   AddNumber(args.GetIsolate(), result, heap->lo_space()->CommittedMemory(),
    143             "lo_space_commited_bytes");
    144   AddNumber64(args.GetIsolate(), result,
    145               heap->amount_of_external_allocated_memory(),
    146               "amount_of_external_allocated_memory");
    147   args.GetReturnValue().Set(result);
    148 }
    149 
    150 } }  // namespace v8::internal
    151