blob: e10dddfcdb99134eed591e3ab4d44ed123d98fc6 [file] [log] [blame]
yangguo@chromium.org304cc332012-07-24 07:59:48 +00001// Copyright 2012 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#include "statistics-extension.h"
29
30namespace v8 {
31namespace internal {
32
33const char* const StatisticsExtension::kSource =
34 "native function getV8Statistics();";
35
36
machenbach@chromium.org9f18d912013-11-28 13:42:41 +000037v8::Handle<v8::FunctionTemplate> StatisticsExtension::GetNativeFunctionTemplate(
38 v8::Isolate* isolate,
yangguo@chromium.org304cc332012-07-24 07:59:48 +000039 v8::Handle<v8::String> str) {
ulan@chromium.org906e2fb2013-05-14 08:14:38 +000040 ASSERT(strcmp(*v8::String::Utf8Value(str), "getV8Statistics") == 0);
hpayer@chromium.org4f99be92013-12-18 16:23:55 +000041 return v8::FunctionTemplate::New(isolate, StatisticsExtension::GetCounters);
yangguo@chromium.org304cc332012-07-24 07:59:48 +000042}
43
44
machenbach@chromium.orgf9841892013-11-25 12:01:13 +000045static void AddCounter(v8::Isolate* isolate,
46 v8::Local<v8::Object> object,
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +000047 StatsCounter* counter,
48 const char* name) {
49 if (counter->Enabled()) {
machenbach@chromium.orgf9841892013-11-25 12:01:13 +000050 object->Set(v8::String::NewFromUtf8(isolate, name),
ulan@chromium.org0f13e742014-01-03 15:51:11 +000051 v8::Number::New(isolate, *counter->GetInternalPointer()));
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +000052 }
53}
54
machenbach@chromium.orgf9841892013-11-25 12:01:13 +000055static void AddNumber(v8::Isolate* isolate,
56 v8::Local<v8::Object> object,
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +000057 intptr_t value,
58 const char* name) {
machenbach@chromium.orgf9841892013-11-25 12:01:13 +000059 object->Set(v8::String::NewFromUtf8(isolate, name),
ulan@chromium.org0f13e742014-01-03 15:51:11 +000060 v8::Number::New(isolate, static_cast<double>(value)));
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +000061}
62
63
machenbach@chromium.orgf9841892013-11-25 12:01:13 +000064static void AddNumber64(v8::Isolate* isolate,
65 v8::Local<v8::Object> object,
machenbach@chromium.org7ff76072013-11-21 09:47:43 +000066 int64_t value,
67 const char* name) {
machenbach@chromium.orgf9841892013-11-25 12:01:13 +000068 object->Set(v8::String::NewFromUtf8(isolate, name),
ulan@chromium.org0f13e742014-01-03 15:51:11 +000069 v8::Number::New(isolate, static_cast<double>(value)));
machenbach@chromium.org7ff76072013-11-21 09:47:43 +000070}
71
72
verwaest@chromium.orgd4be0f02013-06-05 13:39:03 +000073void StatisticsExtension::GetCounters(
74 const v8::FunctionCallbackInfo<v8::Value>& args) {
jkummerow@chromium.org3d00d0a2013-09-04 13:57:32 +000075 Isolate* isolate = reinterpret_cast<Isolate*>(args.GetIsolate());
yangguo@chromium.org304cc332012-07-24 07:59:48 +000076 Heap* heap = isolate->heap();
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +000077
yangguo@chromium.org304cc332012-07-24 07:59:48 +000078 if (args.Length() > 0) { // GC if first argument evaluates to true.
79 if (args[0]->IsBoolean() && args[0]->ToBoolean()->Value()) {
80 heap->CollectAllGarbage(Heap::kNoGCFlags, "counters extension");
81 }
82 }
83
84 Counters* counters = isolate->counters();
ulan@chromium.org0f13e742014-01-03 15:51:11 +000085 v8::Local<v8::Object> result = v8::Object::New(args.GetIsolate());
yangguo@chromium.org304cc332012-07-24 07:59:48 +000086
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +000087#define ADD_COUNTER(name, caption) \
machenbach@chromium.orgf9841892013-11-25 12:01:13 +000088 AddCounter(args.GetIsolate(), result, counters->name(), #name);
yangguo@chromium.org304cc332012-07-24 07:59:48 +000089
90 STATS_COUNTER_LIST_1(ADD_COUNTER)
91 STATS_COUNTER_LIST_2(ADD_COUNTER)
92#undef ADD_COUNTER
machenbach@chromium.orgf9841892013-11-25 12:01:13 +000093#define ADD_COUNTER(name) \
94 AddCounter(args.GetIsolate(), result, counters->count_of_##name(), \
95 "count_of_" #name); \
96 AddCounter(args.GetIsolate(), result, counters->size_of_##name(), \
97 "size_of_" #name);
yangguo@chromium.org304cc332012-07-24 07:59:48 +000098
99 INSTANCE_TYPE_LIST(ADD_COUNTER)
100#undef ADD_COUNTER
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000101#define ADD_COUNTER(name) \
102 AddCounter(args.GetIsolate(), result, counters->count_of_CODE_TYPE_##name(), \
103 "count_of_CODE_TYPE_" #name); \
104 AddCounter(args.GetIsolate(), result, counters->size_of_CODE_TYPE_##name(), \
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000105 "size_of_CODE_TYPE_" #name);
yangguo@chromium.org304cc332012-07-24 07:59:48 +0000106
107 CODE_KIND_LIST(ADD_COUNTER)
108#undef ADD_COUNTER
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000109#define ADD_COUNTER(name) \
110 AddCounter(args.GetIsolate(), result, \
111 counters->count_of_FIXED_ARRAY_##name(), \
112 "count_of_FIXED_ARRAY_" #name); \
113 AddCounter(args.GetIsolate(), result, \
114 counters->size_of_FIXED_ARRAY_##name(), \
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000115 "size_of_FIXED_ARRAY_" #name);
yangguo@chromium.org304cc332012-07-24 07:59:48 +0000116
117 FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(ADD_COUNTER)
118#undef ADD_COUNTER
119
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000120 AddNumber(args.GetIsolate(), result, isolate->memory_allocator()->Size(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000121 "total_committed_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000122 AddNumber(args.GetIsolate(), result, heap->new_space()->Size(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000123 "new_space_live_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000124 AddNumber(args.GetIsolate(), result, heap->new_space()->Available(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000125 "new_space_available_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000126 AddNumber(args.GetIsolate(), result, heap->new_space()->CommittedMemory(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000127 "new_space_commited_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000128 AddNumber(args.GetIsolate(), result, heap->old_pointer_space()->Size(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000129 "old_pointer_space_live_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000130 AddNumber(args.GetIsolate(), result, heap->old_pointer_space()->Available(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000131 "old_pointer_space_available_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000132 AddNumber(args.GetIsolate(), result,
133 heap->old_pointer_space()->CommittedMemory(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000134 "old_pointer_space_commited_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000135 AddNumber(args.GetIsolate(), result, heap->old_data_space()->Size(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000136 "old_data_space_live_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000137 AddNumber(args.GetIsolate(), result, heap->old_data_space()->Available(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000138 "old_data_space_available_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000139 AddNumber(args.GetIsolate(), result,
140 heap->old_data_space()->CommittedMemory(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000141 "old_data_space_commited_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000142 AddNumber(args.GetIsolate(), result, heap->code_space()->Size(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000143 "code_space_live_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000144 AddNumber(args.GetIsolate(), result, heap->code_space()->Available(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000145 "code_space_available_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000146 AddNumber(args.GetIsolate(), result, heap->code_space()->CommittedMemory(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000147 "code_space_commited_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000148 AddNumber(args.GetIsolate(), result, heap->cell_space()->Size(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000149 "cell_space_live_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000150 AddNumber(args.GetIsolate(), result, heap->cell_space()->Available(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000151 "cell_space_available_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000152 AddNumber(args.GetIsolate(), result, heap->cell_space()->CommittedMemory(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000153 "cell_space_commited_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000154 AddNumber(args.GetIsolate(), result, heap->property_cell_space()->Size(),
danno@chromium.org41728482013-06-12 22:31:22 +0000155 "property_cell_space_live_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000156 AddNumber(args.GetIsolate(), result, heap->property_cell_space()->Available(),
danno@chromium.org41728482013-06-12 22:31:22 +0000157 "property_cell_space_available_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000158 AddNumber(args.GetIsolate(), result,
159 heap->property_cell_space()->CommittedMemory(),
danno@chromium.org41728482013-06-12 22:31:22 +0000160 "property_cell_space_commited_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000161 AddNumber(args.GetIsolate(), result, heap->lo_space()->Size(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000162 "lo_space_live_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000163 AddNumber(args.GetIsolate(), result, heap->lo_space()->Available(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000164 "lo_space_available_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000165 AddNumber(args.GetIsolate(), result, heap->lo_space()->CommittedMemory(),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000166 "lo_space_commited_bytes");
machenbach@chromium.orgf9841892013-11-25 12:01:13 +0000167 AddNumber64(args.GetIsolate(), result,
168 heap->amount_of_external_allocated_memory(),
machenbach@chromium.org7ff76072013-11-21 09:47:43 +0000169 "amount_of_external_allocated_memory");
verwaest@chromium.orgd4be0f02013-06-05 13:39:03 +0000170 args.GetReturnValue().Set(result);
yangguo@chromium.org304cc332012-07-24 07:59:48 +0000171}
172
yangguo@chromium.org304cc332012-07-24 07:59:48 +0000173} } // namespace v8::internal