Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: src/cpu-profiler.cc

Issue 6685088: Merge isolates to bleeding_edge. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/cpu-profiler.h ('k') | src/d8.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 28 matching lines...) Expand all
39 #include "../include/v8-profiler.h" 39 #include "../include/v8-profiler.h"
40 40
41 namespace v8 { 41 namespace v8 {
42 namespace internal { 42 namespace internal {
43 43
44 static const int kEventsBufferSize = 256*KB; 44 static const int kEventsBufferSize = 256*KB;
45 static const int kTickSamplesBufferChunkSize = 64*KB; 45 static const int kTickSamplesBufferChunkSize = 64*KB;
46 static const int kTickSamplesBufferChunksCount = 16; 46 static const int kTickSamplesBufferChunksCount = 16;
47 47
48 48
49 ProfilerEventsProcessor::ProfilerEventsProcessor(ProfileGenerator* generator) 49 ProfilerEventsProcessor::ProfilerEventsProcessor(Isolate* isolate,
50 : Thread("v8:ProfEvntProc"), 50 ProfileGenerator* generator)
51 : Thread(isolate, "v8:ProfEvntProc"),
51 generator_(generator), 52 generator_(generator),
52 running_(true), 53 running_(true),
53 ticks_buffer_(sizeof(TickSampleEventRecord), 54 ticks_buffer_(sizeof(TickSampleEventRecord),
54 kTickSamplesBufferChunkSize, 55 kTickSamplesBufferChunkSize,
55 kTickSamplesBufferChunksCount), 56 kTickSamplesBufferChunksCount),
56 enqueue_order_(0) { 57 enqueue_order_(0) {
57 } 58 }
58 59
59 60
60 void ProfilerEventsProcessor::CallbackCreateEvent(Logger::LogEventsAndTags tag, 61 void ProfilerEventsProcessor::CallbackCreateEvent(Logger::LogEventsAndTags tag,
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 rec->start = start; 177 rec->start = start;
177 rec->entry = generator_->NewCodeEntry(tag, prefix, name); 178 rec->entry = generator_->NewCodeEntry(tag, prefix, name);
178 rec->size = size; 179 rec->size = size;
179 events_buffer_.Enqueue(evt_rec); 180 events_buffer_.Enqueue(evt_rec);
180 } 181 }
181 182
182 183
183 void ProfilerEventsProcessor::AddCurrentStack() { 184 void ProfilerEventsProcessor::AddCurrentStack() {
184 TickSampleEventRecord record; 185 TickSampleEventRecord record;
185 TickSample* sample = &record.sample; 186 TickSample* sample = &record.sample;
186 sample->state = Top::current_vm_state(); 187 sample->state = Isolate::Current()->current_vm_state();
187 sample->pc = reinterpret_cast<Address>(sample); // Not NULL. 188 sample->pc = reinterpret_cast<Address>(sample); // Not NULL.
188 sample->tos = NULL; 189 sample->tos = NULL;
189 sample->frames_count = 0; 190 sample->frames_count = 0;
190 for (StackTraceFrameIterator it; 191 for (StackTraceFrameIterator it;
191 !it.done() && sample->frames_count < TickSample::kMaxFramesCount; 192 !it.done() && sample->frames_count < TickSample::kMaxFramesCount;
192 it.Advance()) { 193 it.Advance()) {
193 sample->stack[sample->frames_count++] = it.frame()->pc(); 194 sample->stack[sample->frames_count++] = it.frame()->pc();
194 } 195 }
195 record.order = enqueue_order_; 196 record.order = enqueue_order_;
196 ticks_from_vm_buffer_.Enqueue(record); 197 ticks_from_vm_buffer_.Enqueue(record);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 YieldCPU(); 266 YieldCPU();
266 } 267 }
267 268
268 // Process remaining tick events. 269 // Process remaining tick events.
269 ticks_buffer_.FlushResidualRecords(); 270 ticks_buffer_.FlushResidualRecords();
270 // Perform processing until we have tick events, skip remaining code events. 271 // Perform processing until we have tick events, skip remaining code events.
271 while (ProcessTicks(dequeue_order) && ProcessCodeEvent(&dequeue_order)) { } 272 while (ProcessTicks(dequeue_order) && ProcessCodeEvent(&dequeue_order)) { }
272 } 273 }
273 274
274 275
275 CpuProfiler* CpuProfiler::singleton_ = NULL;
276 Atomic32 CpuProfiler::is_profiling_ = false;
277
278 void CpuProfiler::StartProfiling(const char* title) { 276 void CpuProfiler::StartProfiling(const char* title) {
279 ASSERT(singleton_ != NULL); 277 ASSERT(Isolate::Current()->cpu_profiler() != NULL);
280 singleton_->StartCollectingProfile(title); 278 Isolate::Current()->cpu_profiler()->StartCollectingProfile(title);
281 } 279 }
282 280
283 281
284 void CpuProfiler::StartProfiling(String* title) { 282 void CpuProfiler::StartProfiling(String* title) {
285 ASSERT(singleton_ != NULL); 283 ASSERT(Isolate::Current()->cpu_profiler() != NULL);
286 singleton_->StartCollectingProfile(title); 284 Isolate::Current()->cpu_profiler()->StartCollectingProfile(title);
287 } 285 }
288 286
289 287
290 CpuProfile* CpuProfiler::StopProfiling(const char* title) { 288 CpuProfile* CpuProfiler::StopProfiling(const char* title) {
291 return is_profiling() ? singleton_->StopCollectingProfile(title) : NULL; 289 return is_profiling() ?
290 Isolate::Current()->cpu_profiler()->StopCollectingProfile(title) : NULL;
292 } 291 }
293 292
294 293
295 CpuProfile* CpuProfiler::StopProfiling(Object* security_token, String* title) { 294 CpuProfile* CpuProfiler::StopProfiling(Object* security_token, String* title) {
296 return is_profiling() ? 295 return is_profiling() ?
297 singleton_->StopCollectingProfile(security_token, title) : NULL; 296 Isolate::Current()->cpu_profiler()->StopCollectingProfile(
297 security_token, title) : NULL;
298 } 298 }
299 299
300 300
301 int CpuProfiler::GetProfilesCount() { 301 int CpuProfiler::GetProfilesCount() {
302 ASSERT(singleton_ != NULL); 302 ASSERT(Isolate::Current()->cpu_profiler() != NULL);
303 // The count of profiles doesn't depend on a security token. 303 // The count of profiles doesn't depend on a security token.
304 return singleton_->profiles_->Profiles( 304 return Isolate::Current()->cpu_profiler()->profiles_->Profiles(
305 TokenEnumerator::kNoSecurityToken)->length(); 305 TokenEnumerator::kNoSecurityToken)->length();
306 } 306 }
307 307
308 308
309 CpuProfile* CpuProfiler::GetProfile(Object* security_token, int index) { 309 CpuProfile* CpuProfiler::GetProfile(Object* security_token, int index) {
310 ASSERT(singleton_ != NULL); 310 ASSERT(Isolate::Current()->cpu_profiler() != NULL);
311 const int token = singleton_->token_enumerator_->GetTokenId(security_token); 311 CpuProfiler* profiler = Isolate::Current()->cpu_profiler();
312 return singleton_->profiles_->Profiles(token)->at(index); 312 const int token = profiler->token_enumerator_->GetTokenId(security_token);
313 return profiler->profiles_->Profiles(token)->at(index);
313 } 314 }
314 315
315 316
316 CpuProfile* CpuProfiler::FindProfile(Object* security_token, unsigned uid) { 317 CpuProfile* CpuProfiler::FindProfile(Object* security_token, unsigned uid) {
317 ASSERT(singleton_ != NULL); 318 ASSERT(Isolate::Current()->cpu_profiler() != NULL);
318 const int token = singleton_->token_enumerator_->GetTokenId(security_token); 319 CpuProfiler* profiler = Isolate::Current()->cpu_profiler();
319 return singleton_->profiles_->GetProfile(token, uid); 320 const int token = profiler->token_enumerator_->GetTokenId(security_token);
321 return profiler->profiles_->GetProfile(token, uid);
320 } 322 }
321 323
322 324
323 TickSample* CpuProfiler::TickSampleEvent() { 325 TickSample* CpuProfiler::TickSampleEvent(Isolate* isolate) {
324 if (CpuProfiler::is_profiling()) { 326 if (CpuProfiler::is_profiling(isolate)) {
325 return singleton_->processor_->TickSampleEvent(); 327 return isolate->cpu_profiler()->processor_->TickSampleEvent();
326 } else { 328 } else {
327 return NULL; 329 return NULL;
328 } 330 }
329 } 331 }
330 332
331 333
332 void CpuProfiler::CallbackEvent(String* name, Address entry_point) { 334 void CpuProfiler::CallbackEvent(String* name, Address entry_point) {
333 singleton_->processor_->CallbackCreateEvent( 335 Isolate::Current()->cpu_profiler()->processor_->CallbackCreateEvent(
334 Logger::CALLBACK_TAG, CodeEntry::kEmptyNamePrefix, name, entry_point); 336 Logger::CALLBACK_TAG, CodeEntry::kEmptyNamePrefix, name, entry_point);
335 } 337 }
336 338
337 339
338 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, 340 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
339 Code* code, const char* comment) { 341 Code* code, const char* comment) {
340 singleton_->processor_->CodeCreateEvent( 342 Isolate::Current()->cpu_profiler()->processor_->CodeCreateEvent(
341 tag, comment, code->address(), code->ExecutableSize()); 343 tag, comment, code->address(), code->ExecutableSize());
342 } 344 }
343 345
344 346
345 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, 347 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
346 Code* code, String* name) { 348 Code* code, String* name) {
347 singleton_->processor_->CodeCreateEvent( 349 Isolate::Current()->cpu_profiler()->processor_->CodeCreateEvent(
348 tag, 350 tag,
349 name, 351 name,
350 Heap::empty_string(), 352 HEAP->empty_string(),
351 v8::CpuProfileNode::kNoLineNumberInfo, 353 v8::CpuProfileNode::kNoLineNumberInfo,
352 code->address(), 354 code->address(),
353 code->ExecutableSize(), 355 code->ExecutableSize(),
354 NULL); 356 NULL);
355 } 357 }
356 358
357 359
358 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, 360 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
359 Code* code, 361 Code* code,
360 SharedFunctionInfo* shared, 362 SharedFunctionInfo* shared,
361 String* name) { 363 String* name) {
362 singleton_->processor_->CodeCreateEvent( 364 Isolate::Current()->cpu_profiler()->processor_->CodeCreateEvent(
363 tag, 365 tag,
364 name, 366 name,
365 Heap::empty_string(), 367 HEAP->empty_string(),
366 v8::CpuProfileNode::kNoLineNumberInfo, 368 v8::CpuProfileNode::kNoLineNumberInfo,
367 code->address(), 369 code->address(),
368 code->ExecutableSize(), 370 code->ExecutableSize(),
369 shared->address()); 371 shared->address());
370 } 372 }
371 373
372 374
373 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, 375 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
374 Code* code, 376 Code* code,
375 SharedFunctionInfo* shared, 377 SharedFunctionInfo* shared,
376 String* source, int line) { 378 String* source, int line) {
377 singleton_->processor_->CodeCreateEvent( 379 Isolate::Current()->cpu_profiler()->processor_->CodeCreateEvent(
378 tag, 380 tag,
379 shared->DebugName(), 381 shared->DebugName(),
380 source, 382 source,
381 line, 383 line,
382 code->address(), 384 code->address(),
383 code->ExecutableSize(), 385 code->ExecutableSize(),
384 shared->address()); 386 shared->address());
385 } 387 }
386 388
387 389
388 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, 390 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
389 Code* code, int args_count) { 391 Code* code, int args_count) {
390 singleton_->processor_->CodeCreateEvent( 392 Isolate::Current()->cpu_profiler()->processor_->CodeCreateEvent(
391 tag, 393 tag,
392 args_count, 394 args_count,
393 code->address(), 395 code->address(),
394 code->ExecutableSize()); 396 code->ExecutableSize());
395 } 397 }
396 398
397 399
398 void CpuProfiler::CodeMoveEvent(Address from, Address to) { 400 void CpuProfiler::CodeMoveEvent(Address from, Address to) {
399 singleton_->processor_->CodeMoveEvent(from, to); 401 Isolate::Current()->cpu_profiler()->processor_->CodeMoveEvent(from, to);
400 } 402 }
401 403
402 404
403 void CpuProfiler::CodeDeleteEvent(Address from) { 405 void CpuProfiler::CodeDeleteEvent(Address from) {
404 singleton_->processor_->CodeDeleteEvent(from); 406 Isolate::Current()->cpu_profiler()->processor_->CodeDeleteEvent(from);
405 } 407 }
406 408
407 409
408 void CpuProfiler::SharedFunctionInfoMoveEvent(Address from, Address to) { 410 void CpuProfiler::SharedFunctionInfoMoveEvent(Address from, Address to) {
409 singleton_->processor_->SharedFunctionInfoMoveEvent(from, to); 411 CpuProfiler* profiler = Isolate::Current()->cpu_profiler();
412 profiler->processor_->SharedFunctionInfoMoveEvent(from, to);
410 } 413 }
411 414
412 415
413 void CpuProfiler::GetterCallbackEvent(String* name, Address entry_point) { 416 void CpuProfiler::GetterCallbackEvent(String* name, Address entry_point) {
414 singleton_->processor_->CallbackCreateEvent( 417 Isolate::Current()->cpu_profiler()->processor_->CallbackCreateEvent(
415 Logger::CALLBACK_TAG, "get ", name, entry_point); 418 Logger::CALLBACK_TAG, "get ", name, entry_point);
416 } 419 }
417 420
418 421
419 void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) { 422 void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) {
420 singleton_->processor_->RegExpCodeCreateEvent( 423 Isolate::Current()->cpu_profiler()->processor_->RegExpCodeCreateEvent(
421 Logger::REG_EXP_TAG, 424 Logger::REG_EXP_TAG,
422 "RegExp: ", 425 "RegExp: ",
423 source, 426 source,
424 code->address(), 427 code->address(),
425 code->ExecutableSize()); 428 code->ExecutableSize());
426 } 429 }
427 430
428 431
429 void CpuProfiler::SetterCallbackEvent(String* name, Address entry_point) { 432 void CpuProfiler::SetterCallbackEvent(String* name, Address entry_point) {
430 singleton_->processor_->CallbackCreateEvent( 433 Isolate::Current()->cpu_profiler()->processor_->CallbackCreateEvent(
431 Logger::CALLBACK_TAG, "set ", name, entry_point); 434 Logger::CALLBACK_TAG, "set ", name, entry_point);
432 } 435 }
433 436
434 437
435 CpuProfiler::CpuProfiler() 438 CpuProfiler::CpuProfiler()
436 : profiles_(new CpuProfilesCollection()), 439 : profiles_(new CpuProfilesCollection()),
437 next_profile_uid_(1), 440 next_profile_uid_(1),
438 token_enumerator_(new TokenEnumerator()), 441 token_enumerator_(new TokenEnumerator()),
439 generator_(NULL), 442 generator_(NULL),
440 processor_(NULL) { 443 processor_(NULL),
444 is_profiling_(false) {
441 } 445 }
442 446
443 447
444 CpuProfiler::~CpuProfiler() { 448 CpuProfiler::~CpuProfiler() {
445 delete token_enumerator_; 449 delete token_enumerator_;
446 delete profiles_; 450 delete profiles_;
447 } 451 }
448 452
449 453
450 void CpuProfiler::StartCollectingProfile(const char* title) { 454 void CpuProfiler::StartCollectingProfile(const char* title) {
451 if (profiles_->StartProfiling(title, next_profile_uid_++)) { 455 if (profiles_->StartProfiling(title, next_profile_uid_++)) {
452 StartProcessorIfNotStarted(); 456 StartProcessorIfNotStarted();
453 } 457 }
454 processor_->AddCurrentStack(); 458 processor_->AddCurrentStack();
455 } 459 }
456 460
457 461
458 void CpuProfiler::StartCollectingProfile(String* title) { 462 void CpuProfiler::StartCollectingProfile(String* title) {
459 StartCollectingProfile(profiles_->GetName(title)); 463 StartCollectingProfile(profiles_->GetName(title));
460 } 464 }
461 465
462 466
463 void CpuProfiler::StartProcessorIfNotStarted() { 467 void CpuProfiler::StartProcessorIfNotStarted() {
464 if (processor_ == NULL) { 468 if (processor_ == NULL) {
465 // Disable logging when using the new implementation. 469 // Disable logging when using the new implementation.
466 saved_logging_nesting_ = Logger::logging_nesting_; 470 saved_logging_nesting_ = LOGGER->logging_nesting_;
467 Logger::logging_nesting_ = 0; 471 LOGGER->logging_nesting_ = 0;
468 generator_ = new ProfileGenerator(profiles_); 472 generator_ = new ProfileGenerator(profiles_);
469 processor_ = new ProfilerEventsProcessor(generator_); 473 processor_ = new ProfilerEventsProcessor(Isolate::Current(), generator_);
470 NoBarrier_Store(&is_profiling_, true); 474 NoBarrier_Store(&is_profiling_, true);
471 processor_->Start(); 475 processor_->Start();
472 // Enumerate stuff we already have in the heap. 476 // Enumerate stuff we already have in the heap.
473 if (Heap::HasBeenSetup()) { 477 if (HEAP->HasBeenSetup()) {
474 if (!FLAG_prof_browser_mode) { 478 if (!FLAG_prof_browser_mode) {
475 bool saved_log_code_flag = FLAG_log_code; 479 bool saved_log_code_flag = FLAG_log_code;
476 FLAG_log_code = true; 480 FLAG_log_code = true;
477 Logger::LogCodeObjects(); 481 LOGGER->LogCodeObjects();
478 FLAG_log_code = saved_log_code_flag; 482 FLAG_log_code = saved_log_code_flag;
479 } 483 }
480 Logger::LogCompiledFunctions(); 484 LOGGER->LogCompiledFunctions();
481 Logger::LogAccessorCallbacks(); 485 LOGGER->LogAccessorCallbacks();
482 } 486 }
483 // Enable stack sampling. 487 // Enable stack sampling.
484 Sampler* sampler = reinterpret_cast<Sampler*>(Logger::ticker_); 488 Sampler* sampler = reinterpret_cast<Sampler*>(LOGGER->ticker_);
485 if (!sampler->IsActive()) sampler->Start(); 489 if (!sampler->IsActive()) sampler->Start();
486 sampler->IncreaseProfilingDepth(); 490 sampler->IncreaseProfilingDepth();
487 } 491 }
488 } 492 }
489 493
490 494
491 CpuProfile* CpuProfiler::StopCollectingProfile(const char* title) { 495 CpuProfile* CpuProfiler::StopCollectingProfile(const char* title) {
492 const double actual_sampling_rate = generator_->actual_sampling_rate(); 496 const double actual_sampling_rate = generator_->actual_sampling_rate();
493 StopProcessorIfLastProfile(title); 497 StopProcessorIfLastProfile(title);
494 CpuProfile* result = 498 CpuProfile* result =
(...skipping 12 matching lines...) Expand all
507 const double actual_sampling_rate = generator_->actual_sampling_rate(); 511 const double actual_sampling_rate = generator_->actual_sampling_rate();
508 const char* profile_title = profiles_->GetName(title); 512 const char* profile_title = profiles_->GetName(title);
509 StopProcessorIfLastProfile(profile_title); 513 StopProcessorIfLastProfile(profile_title);
510 int token = token_enumerator_->GetTokenId(security_token); 514 int token = token_enumerator_->GetTokenId(security_token);
511 return profiles_->StopProfiling(token, profile_title, actual_sampling_rate); 515 return profiles_->StopProfiling(token, profile_title, actual_sampling_rate);
512 } 516 }
513 517
514 518
515 void CpuProfiler::StopProcessorIfLastProfile(const char* title) { 519 void CpuProfiler::StopProcessorIfLastProfile(const char* title) {
516 if (profiles_->IsLastProfile(title)) { 520 if (profiles_->IsLastProfile(title)) {
517 Sampler* sampler = reinterpret_cast<Sampler*>(Logger::ticker_); 521 Sampler* sampler = reinterpret_cast<Sampler*>(LOGGER->ticker_);
518 sampler->DecreaseProfilingDepth(); 522 sampler->DecreaseProfilingDepth();
519 sampler->Stop(); 523 sampler->Stop();
520 processor_->Stop(); 524 processor_->Stop();
521 processor_->Join(); 525 processor_->Join();
522 delete processor_; 526 delete processor_;
523 delete generator_; 527 delete generator_;
524 processor_ = NULL; 528 processor_ = NULL;
525 NoBarrier_Store(&is_profiling_, false); 529 NoBarrier_Store(&is_profiling_, false);
526 generator_ = NULL; 530 generator_ = NULL;
527 Logger::logging_nesting_ = saved_logging_nesting_; 531 LOGGER->logging_nesting_ = saved_logging_nesting_;
528 } 532 }
529 } 533 }
530 534
531 } } // namespace v8::internal 535 } } // namespace v8::internal
532 536
533 #endif // ENABLE_LOGGING_AND_PROFILING 537 #endif // ENABLE_LOGGING_AND_PROFILING
534 538
535 namespace v8 { 539 namespace v8 {
536 namespace internal { 540 namespace internal {
537 541
538 void CpuProfiler::Setup() { 542 void CpuProfiler::Setup() {
539 #ifdef ENABLE_LOGGING_AND_PROFILING 543 #ifdef ENABLE_LOGGING_AND_PROFILING
540 if (singleton_ == NULL) { 544 Isolate* isolate = Isolate::Current();
541 singleton_ = new CpuProfiler(); 545 if (isolate->cpu_profiler() == NULL) {
546 isolate->set_cpu_profiler(new CpuProfiler());
542 } 547 }
543 #endif 548 #endif
544 } 549 }
545 550
546 551
547 void CpuProfiler::TearDown() { 552 void CpuProfiler::TearDown() {
548 #ifdef ENABLE_LOGGING_AND_PROFILING 553 #ifdef ENABLE_LOGGING_AND_PROFILING
549 if (singleton_ != NULL) { 554 Isolate* isolate = Isolate::Current();
550 delete singleton_; 555 if (isolate->cpu_profiler() != NULL) {
556 delete isolate->cpu_profiler();
551 } 557 }
552 singleton_ = NULL; 558 isolate->set_cpu_profiler(NULL);
553 #endif 559 #endif
554 } 560 }
555 561
556 } } // namespace v8::internal 562 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/cpu-profiler.h ('k') | src/d8.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698