| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 Context::Scope context_scope(utility_context_); | 261 Context::Scope context_scope(utility_context_); |
| 262 Handle<Object> global = utility_context_->Global(); | 262 Handle<Object> global = utility_context_->Global(); |
| 263 Handle<Value> fun = global->Get(String::New("DebugCommandToJSONRequest")); | 263 Handle<Value> fun = global->Get(String::New("DebugCommandToJSONRequest")); |
| 264 static const int kArgc = 1; | 264 static const int kArgc = 1; |
| 265 Handle<Value> argv[kArgc] = { command }; | 265 Handle<Value> argv[kArgc] = { command }; |
| 266 Handle<Value> val = Handle<Function>::Cast(fun)->Call(global, kArgc, argv); | 266 Handle<Value> val = Handle<Function>::Cast(fun)->Call(global, kArgc, argv); |
| 267 return val; | 267 return val; |
| 268 } | 268 } |
| 269 | 269 |
| 270 | 270 |
| 271 int32_t* Counter::Bind(const char* name) { | 271 int32_t* Counter::Bind(const char* name, bool is_histogram) { |
| 272 int i; | 272 int i; |
| 273 for (i = 0; i < kMaxNameSize - 1 && name[i]; i++) | 273 for (i = 0; i < kMaxNameSize - 1 && name[i]; i++) |
| 274 name_[i] = static_cast<char>(name[i]); | 274 name_[i] = static_cast<char>(name[i]); |
| 275 name_[i] = '\0'; | 275 name_[i] = '\0'; |
| 276 return &counter_; | 276 is_histogram_ = is_histogram; |
| 277 return ptr(); |
| 278 } |
| 279 |
| 280 |
| 281 void Counter::AddSample(int32_t sample) { |
| 282 count_++; |
| 283 sample_total_ += sample; |
| 277 } | 284 } |
| 278 | 285 |
| 279 | 286 |
| 280 CounterCollection::CounterCollection() { | 287 CounterCollection::CounterCollection() { |
| 281 magic_number_ = 0xDEADFACE; | 288 magic_number_ = 0xDEADFACE; |
| 282 max_counters_ = kMaxCounters; | 289 max_counters_ = kMaxCounters; |
| 283 max_name_size_ = Counter::kMaxNameSize; | 290 max_name_size_ = Counter::kMaxNameSize; |
| 284 counters_in_use_ = 0; | 291 counters_in_use_ = 0; |
| 285 } | 292 } |
| 286 | 293 |
| 287 | 294 |
| 288 Counter* CounterCollection::GetNextCounter() { | 295 Counter* CounterCollection::GetNextCounter() { |
| 289 if (counters_in_use_ == kMaxCounters) return NULL; | 296 if (counters_in_use_ == kMaxCounters) return NULL; |
| 290 return &counters_[counters_in_use_++]; | 297 return &counters_[counters_in_use_++]; |
| 291 } | 298 } |
| 292 | 299 |
| 293 | 300 |
| 294 void Shell::MapCounters(const char* name) { | 301 void Shell::MapCounters(const char* name) { |
| 295 counters_file_ = i::OS::MemoryMappedFile::create(name, | 302 counters_file_ = i::OS::MemoryMappedFile::create(name, |
| 296 sizeof(CounterCollection), &local_counters_); | 303 sizeof(CounterCollection), &local_counters_); |
| 297 void* memory = (counters_file_ == NULL) ? | 304 void* memory = (counters_file_ == NULL) ? |
| 298 NULL : counters_file_->memory(); | 305 NULL : counters_file_->memory(); |
| 299 if (memory == NULL) { | 306 if (memory == NULL) { |
| 300 printf("Could not map counters file %s\n", name); | 307 printf("Could not map counters file %s\n", name); |
| 301 exit(1); | 308 exit(1); |
| 302 } | 309 } |
| 303 counters_ = static_cast<CounterCollection*>(memory); | 310 counters_ = static_cast<CounterCollection*>(memory); |
| 304 V8::SetCounterFunction(LookupCounter); | 311 V8::SetCounterFunction(LookupCounter); |
| 312 V8::SetCreateHistogramFunction(CreateHistogram); |
| 313 V8::SetAddHistogramSampleFunction(AddHistogramSample); |
| 305 } | 314 } |
| 306 | 315 |
| 307 | 316 |
| 308 int CounterMap::Hash(const char* name) { | 317 int CounterMap::Hash(const char* name) { |
| 309 int h = 0; | 318 int h = 0; |
| 310 int c; | 319 int c; |
| 311 while ((c = *name++) != 0) { | 320 while ((c = *name++) != 0) { |
| 312 h += h << 5; | 321 h += h << 5; |
| 313 h += c; | 322 h += c; |
| 314 } | 323 } |
| 315 return h; | 324 return h; |
| 316 } | 325 } |
| 317 | 326 |
| 318 | 327 |
| 328 Counter* Shell::GetCounter(const char* name, bool is_histogram) { |
| 329 Counter* counter = counter_map_->Lookup(name); |
| 330 |
| 331 if (counter == NULL) { |
| 332 counter = counters_->GetNextCounter(); |
| 333 if (counter != NULL) { |
| 334 counter_map_->Set(name, counter); |
| 335 counter->Bind(name, is_histogram); |
| 336 } |
| 337 } else { |
| 338 ASSERT(counter->is_histogram() == is_histogram); |
| 339 } |
| 340 return counter; |
| 341 } |
| 342 |
| 343 |
| 319 int* Shell::LookupCounter(const char* name) { | 344 int* Shell::LookupCounter(const char* name) { |
| 320 Counter* counter = counter_map_->Lookup(name); | 345 Counter* counter = GetCounter(name, false); |
| 346 |
| 321 if (counter != NULL) { | 347 if (counter != NULL) { |
| 322 return counter->ptr(); | 348 return counter->ptr(); |
| 349 } else { |
| 350 return NULL; |
| 323 } | 351 } |
| 324 Counter* result = counters_->GetNextCounter(); | 352 } |
| 325 if (result == NULL) return NULL; | 353 |
| 326 counter_map_->Set(name, result); | 354 |
| 327 return result->Bind(name); | 355 void* Shell::CreateHistogram(const char* name, |
| 356 int min, |
| 357 int max, |
| 358 size_t buckets) { |
| 359 return GetCounter(name, true); |
| 360 } |
| 361 |
| 362 |
| 363 void Shell::AddHistogramSample(void* histogram, int sample) { |
| 364 Counter* counter = reinterpret_cast<Counter*>(histogram); |
| 365 counter->AddSample(sample); |
| 328 } | 366 } |
| 329 | 367 |
| 330 | 368 |
| 331 void Shell::Initialize() { | 369 void Shell::Initialize() { |
| 332 Shell::counter_map_ = new CounterMap(); | 370 Shell::counter_map_ = new CounterMap(); |
| 333 // Set up counters | 371 // Set up counters |
| 334 if (i::FLAG_map_counters != NULL) | 372 if (i::FLAG_map_counters != NULL) |
| 335 MapCounters(i::FLAG_map_counters); | 373 MapCounters(i::FLAG_map_counters); |
| 336 if (i::FLAG_dump_counters) | 374 if (i::FLAG_dump_counters) { |
| 337 V8::SetCounterFunction(LookupCounter); | 375 V8::SetCounterFunction(LookupCounter); |
| 376 V8::SetCreateHistogramFunction(CreateHistogram); |
| 377 V8::SetAddHistogramSampleFunction(AddHistogramSample); |
| 378 } |
| 379 |
| 338 // Initialize the global objects | 380 // Initialize the global objects |
| 339 HandleScope scope; | 381 HandleScope scope; |
| 340 Handle<ObjectTemplate> global_template = ObjectTemplate::New(); | 382 Handle<ObjectTemplate> global_template = ObjectTemplate::New(); |
| 341 global_template->Set(String::New("print"), FunctionTemplate::New(Print)); | 383 global_template->Set(String::New("print"), FunctionTemplate::New(Print)); |
| 342 global_template->Set(String::New("load"), FunctionTemplate::New(Load)); | 384 global_template->Set(String::New("load"), FunctionTemplate::New(Load)); |
| 343 global_template->Set(String::New("quit"), FunctionTemplate::New(Quit)); | 385 global_template->Set(String::New("quit"), FunctionTemplate::New(Quit)); |
| 344 global_template->Set(String::New("version"), FunctionTemplate::New(Version)); | 386 global_template->Set(String::New("version"), FunctionTemplate::New(Version)); |
| 345 | 387 |
| 346 Handle<ObjectTemplate> os_templ = ObjectTemplate::New(); | 388 Handle<ObjectTemplate> os_templ = ObjectTemplate::New(); |
| 347 AddOSMethods(os_templ); | 389 AddOSMethods(os_templ); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 } | 441 } |
| 400 | 442 |
| 401 | 443 |
| 402 void Shell::OnExit() { | 444 void Shell::OnExit() { |
| 403 if (i::FLAG_dump_counters) { | 445 if (i::FLAG_dump_counters) { |
| 404 ::printf("+----------------------------------------+-------------+\n"); | 446 ::printf("+----------------------------------------+-------------+\n"); |
| 405 ::printf("| Name | Value |\n"); | 447 ::printf("| Name | Value |\n"); |
| 406 ::printf("+----------------------------------------+-------------+\n"); | 448 ::printf("+----------------------------------------+-------------+\n"); |
| 407 for (CounterMap::Iterator i(counter_map_); i.More(); i.Next()) { | 449 for (CounterMap::Iterator i(counter_map_); i.More(); i.Next()) { |
| 408 Counter* counter = i.CurrentValue(); | 450 Counter* counter = i.CurrentValue(); |
| 409 ::printf("| %-38s | %11i |\n", i.CurrentKey(), counter->value()); | 451 if (counter->is_histogram()) { |
| 452 ::printf("| c:%-36s | %11i |\n", i.CurrentKey(), counter->count()); |
| 453 ::printf("| t:%-36s | %11i |\n", |
| 454 i.CurrentKey(), |
| 455 counter->sample_total()); |
| 456 } else { |
| 457 ::printf("| %-38s | %11i |\n", i.CurrentKey(), counter->count()); |
| 458 } |
| 410 } | 459 } |
| 411 ::printf("+----------------------------------------+-------------+\n"); | 460 ::printf("+----------------------------------------+-------------+\n"); |
| 412 } | 461 } |
| 413 if (counters_file_ != NULL) | 462 if (counters_file_ != NULL) |
| 414 delete counters_file_; | 463 delete counters_file_; |
| 415 } | 464 } |
| 416 | 465 |
| 417 | 466 |
| 418 static char* ReadChars(const char *name, int* size_out) { | 467 static char* ReadChars(const char *name, int* size_out) { |
| 419 v8::Unlocker unlocker; // Release the V8 lock while reading files. | 468 v8::Unlocker unlocker; // Release the V8 lock while reading files. |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 668 return 0; | 717 return 0; |
| 669 } | 718 } |
| 670 | 719 |
| 671 | 720 |
| 672 } // namespace v8 | 721 } // namespace v8 |
| 673 | 722 |
| 674 | 723 |
| 675 int main(int argc, char* argv[]) { | 724 int main(int argc, char* argv[]) { |
| 676 return v8::Shell::Main(argc, argv); | 725 return v8::Shell::Main(argc, argv); |
| 677 } | 726 } |
| OLD | NEW |