OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 26 matching lines...) Expand all Loading... |
37 #include "../include/v8-profiler.h" | 37 #include "../include/v8-profiler.h" |
38 | 38 |
39 namespace v8 { | 39 namespace v8 { |
40 namespace internal { | 40 namespace internal { |
41 | 41 |
42 static const int kTickSamplesBufferChunkSize = 64 * KB; | 42 static const int kTickSamplesBufferChunkSize = 64 * KB; |
43 static const int kTickSamplesBufferChunksCount = 16; | 43 static const int kTickSamplesBufferChunksCount = 16; |
44 static const int kProfilerStackSize = 64 * KB; | 44 static const int kProfilerStackSize = 64 * KB; |
45 | 45 |
46 | 46 |
47 ProfilerEventsProcessor::ProfilerEventsProcessor(ProfileGenerator* generator) | 47 ProfilerEventsProcessor::ProfilerEventsProcessor( |
| 48 ProfileGenerator* generator, CpuProfilesCollection* profiles) |
48 : Thread(Thread::Options("v8:ProfEvntProc", kProfilerStackSize)), | 49 : Thread(Thread::Options("v8:ProfEvntProc", kProfilerStackSize)), |
49 generator_(generator), | 50 generator_(generator), |
| 51 profiles_(profiles), |
50 running_(true), | 52 running_(true), |
51 ticks_buffer_(sizeof(TickSampleEventRecord), | 53 ticks_buffer_(sizeof(TickSampleEventRecord), |
52 kTickSamplesBufferChunkSize, | 54 kTickSamplesBufferChunkSize, |
53 kTickSamplesBufferChunksCount), | 55 kTickSamplesBufferChunksCount), |
54 enqueue_order_(0) { | 56 enqueue_order_(0) { |
55 } | 57 } |
56 | 58 |
57 | 59 |
58 void ProfilerEventsProcessor::CallbackCreateEvent(Logger::LogEventsAndTags tag, | 60 void ProfilerEventsProcessor::CallbackCreateEvent(Logger::LogEventsAndTags tag, |
59 const char* prefix, | 61 const char* prefix, |
60 Name* name, | 62 Name* name, |
61 Address start) { | 63 Address start) { |
62 if (FilterOutCodeCreateEvent(tag)) return; | 64 if (FilterOutCodeCreateEvent(tag)) return; |
63 CodeEventsContainer evt_rec; | 65 CodeEventsContainer evt_rec; |
64 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 66 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
65 rec->type = CodeEventRecord::CODE_CREATION; | 67 rec->type = CodeEventRecord::CODE_CREATION; |
66 rec->order = ++enqueue_order_; | 68 rec->order = ++enqueue_order_; |
67 rec->start = start; | 69 rec->start = start; |
68 rec->entry = generator_->NewCodeEntry(tag, prefix, name); | 70 rec->entry = profiles_->NewCodeEntry(tag, prefix, name); |
69 rec->size = 1; | 71 rec->size = 1; |
70 rec->shared = NULL; | 72 rec->shared = NULL; |
71 events_buffer_.Enqueue(evt_rec); | 73 events_buffer_.Enqueue(evt_rec); |
72 } | 74 } |
73 | 75 |
74 | 76 |
75 void ProfilerEventsProcessor::CodeCreateEvent(Logger::LogEventsAndTags tag, | 77 void ProfilerEventsProcessor::CodeCreateEvent(Logger::LogEventsAndTags tag, |
76 Name* name, | 78 Name* name, |
77 String* resource_name, | 79 String* resource_name, |
78 int line_number, | 80 int line_number, |
79 Address start, | 81 Address start, |
80 unsigned size, | 82 unsigned size, |
81 Address shared) { | 83 Address shared) { |
82 if (FilterOutCodeCreateEvent(tag)) return; | 84 if (FilterOutCodeCreateEvent(tag)) return; |
83 CodeEventsContainer evt_rec; | 85 CodeEventsContainer evt_rec; |
84 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 86 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
85 rec->type = CodeEventRecord::CODE_CREATION; | 87 rec->type = CodeEventRecord::CODE_CREATION; |
86 rec->order = ++enqueue_order_; | 88 rec->order = ++enqueue_order_; |
87 rec->start = start; | 89 rec->start = start; |
88 rec->entry = generator_->NewCodeEntry(tag, name, resource_name, line_number); | 90 rec->entry = profiles_->NewCodeEntry(tag, name, resource_name, line_number); |
89 rec->size = size; | 91 rec->size = size; |
90 rec->shared = shared; | 92 rec->shared = shared; |
91 events_buffer_.Enqueue(evt_rec); | 93 events_buffer_.Enqueue(evt_rec); |
92 } | 94 } |
93 | 95 |
94 | 96 |
95 void ProfilerEventsProcessor::CodeCreateEvent(Logger::LogEventsAndTags tag, | 97 void ProfilerEventsProcessor::CodeCreateEvent(Logger::LogEventsAndTags tag, |
96 const char* name, | 98 const char* name, |
97 Address start, | 99 Address start, |
98 unsigned size) { | 100 unsigned size) { |
99 if (FilterOutCodeCreateEvent(tag)) return; | 101 if (FilterOutCodeCreateEvent(tag)) return; |
100 CodeEventsContainer evt_rec; | 102 CodeEventsContainer evt_rec; |
101 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 103 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
102 rec->type = CodeEventRecord::CODE_CREATION; | 104 rec->type = CodeEventRecord::CODE_CREATION; |
103 rec->order = ++enqueue_order_; | 105 rec->order = ++enqueue_order_; |
104 rec->start = start; | 106 rec->start = start; |
105 rec->entry = generator_->NewCodeEntry(tag, name); | 107 rec->entry = profiles_->NewCodeEntry(tag, name); |
106 rec->size = size; | 108 rec->size = size; |
107 rec->shared = NULL; | 109 rec->shared = NULL; |
108 events_buffer_.Enqueue(evt_rec); | 110 events_buffer_.Enqueue(evt_rec); |
109 } | 111 } |
110 | 112 |
111 | 113 |
112 void ProfilerEventsProcessor::CodeCreateEvent(Logger::LogEventsAndTags tag, | 114 void ProfilerEventsProcessor::CodeCreateEvent(Logger::LogEventsAndTags tag, |
113 int args_count, | 115 int args_count, |
114 Address start, | 116 Address start, |
115 unsigned size) { | 117 unsigned size) { |
116 if (FilterOutCodeCreateEvent(tag)) return; | 118 if (FilterOutCodeCreateEvent(tag)) return; |
117 CodeEventsContainer evt_rec; | 119 CodeEventsContainer evt_rec; |
118 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 120 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
119 rec->type = CodeEventRecord::CODE_CREATION; | 121 rec->type = CodeEventRecord::CODE_CREATION; |
120 rec->order = ++enqueue_order_; | 122 rec->order = ++enqueue_order_; |
121 rec->start = start; | 123 rec->start = start; |
122 rec->entry = generator_->NewCodeEntry(tag, args_count); | 124 rec->entry = profiles_->NewCodeEntry(tag, args_count); |
123 rec->size = size; | 125 rec->size = size; |
124 rec->shared = NULL; | 126 rec->shared = NULL; |
125 events_buffer_.Enqueue(evt_rec); | 127 events_buffer_.Enqueue(evt_rec); |
126 } | 128 } |
127 | 129 |
128 | 130 |
129 void ProfilerEventsProcessor::CodeMoveEvent(Address from, Address to) { | 131 void ProfilerEventsProcessor::CodeMoveEvent(Address from, Address to) { |
130 CodeEventsContainer evt_rec; | 132 CodeEventsContainer evt_rec; |
131 CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_; | 133 CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_; |
132 rec->type = CodeEventRecord::CODE_MOVE; | 134 rec->type = CodeEventRecord::CODE_MOVE; |
(...skipping 22 matching lines...) Expand all Loading... |
155 const char* prefix, | 157 const char* prefix, |
156 String* name, | 158 String* name, |
157 Address start, | 159 Address start, |
158 unsigned size) { | 160 unsigned size) { |
159 if (FilterOutCodeCreateEvent(tag)) return; | 161 if (FilterOutCodeCreateEvent(tag)) return; |
160 CodeEventsContainer evt_rec; | 162 CodeEventsContainer evt_rec; |
161 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 163 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
162 rec->type = CodeEventRecord::CODE_CREATION; | 164 rec->type = CodeEventRecord::CODE_CREATION; |
163 rec->order = ++enqueue_order_; | 165 rec->order = ++enqueue_order_; |
164 rec->start = start; | 166 rec->start = start; |
165 rec->entry = generator_->NewCodeEntry(tag, prefix, name); | 167 rec->entry = profiles_->NewCodeEntry(tag, prefix, name); |
166 rec->size = size; | 168 rec->size = size; |
167 events_buffer_.Enqueue(evt_rec); | 169 events_buffer_.Enqueue(evt_rec); |
168 } | 170 } |
169 | 171 |
170 | 172 |
171 void ProfilerEventsProcessor::AddCurrentStack() { | 173 void ProfilerEventsProcessor::AddCurrentStack() { |
172 TickSampleEventRecord record(enqueue_order_); | 174 TickSampleEventRecord record(enqueue_order_); |
173 TickSample* sample = &record.sample; | 175 TickSample* sample = &record.sample; |
174 Isolate* isolate = Isolate::Current(); | 176 Isolate* isolate = Isolate::Current(); |
175 sample->state = isolate->current_vm_state(); | 177 sample->state = isolate->current_vm_state(); |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 StartProfiling(profiles_->GetName(title), record_samples); | 438 StartProfiling(profiles_->GetName(title), record_samples); |
437 } | 439 } |
438 | 440 |
439 | 441 |
440 void CpuProfiler::StartProcessorIfNotStarted() { | 442 void CpuProfiler::StartProcessorIfNotStarted() { |
441 if (processor_ == NULL) { | 443 if (processor_ == NULL) { |
442 // Disable logging when using the new implementation. | 444 // Disable logging when using the new implementation. |
443 saved_logging_nesting_ = isolate_->logger()->logging_nesting_; | 445 saved_logging_nesting_ = isolate_->logger()->logging_nesting_; |
444 isolate_->logger()->logging_nesting_ = 0; | 446 isolate_->logger()->logging_nesting_ = 0; |
445 generator_ = new ProfileGenerator(profiles_); | 447 generator_ = new ProfileGenerator(profiles_); |
446 processor_ = new ProfilerEventsProcessor(generator_); | 448 processor_ = new ProfilerEventsProcessor(generator_, profiles_); |
447 is_profiling_ = true; | 449 is_profiling_ = true; |
448 processor_->StartSynchronously(); | 450 processor_->StartSynchronously(); |
449 // Enumerate stuff we already have in the heap. | 451 // Enumerate stuff we already have in the heap. |
450 if (isolate_->heap()->HasBeenSetUp()) { | 452 if (isolate_->heap()->HasBeenSetUp()) { |
451 if (!FLAG_prof_browser_mode) { | 453 if (!FLAG_prof_browser_mode) { |
452 bool saved_log_code_flag = FLAG_log_code; | 454 bool saved_log_code_flag = FLAG_log_code; |
453 FLAG_log_code = true; | 455 FLAG_log_code = true; |
454 isolate_->logger()->LogCodeObjects(); | 456 isolate_->logger()->LogCodeObjects(); |
455 FLAG_log_code = saved_log_code_flag; | 457 FLAG_log_code = saved_log_code_flag; |
456 } | 458 } |
457 isolate_->logger()->LogCompiledFunctions(); | 459 isolate_->logger()->LogCompiledFunctions(); |
458 isolate_->logger()->LogAccessorCallbacks(); | 460 isolate_->logger()->LogAccessorCallbacks(); |
459 } | 461 } |
460 // Enable stack sampling. | 462 // Enable stack sampling. |
461 Sampler* sampler = reinterpret_cast<Sampler*>(isolate_->logger()->ticker_); | 463 Sampler* sampler = isolate_->logger()->sampler(); |
462 sampler->IncreaseProfilingDepth(); | 464 sampler->IncreaseProfilingDepth(); |
463 if (!sampler->IsActive()) { | 465 if (!sampler->IsActive()) { |
464 sampler->Start(); | 466 sampler->Start(); |
465 need_to_stop_sampler_ = true; | 467 need_to_stop_sampler_ = true; |
466 } | 468 } |
467 } | 469 } |
468 } | 470 } |
469 | 471 |
470 | 472 |
471 CpuProfile* CpuProfiler::StopProfiling(const char* title) { | 473 CpuProfile* CpuProfiler::StopProfiling(const char* title) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 processor_->Join(); | 513 processor_->Join(); |
512 delete processor_; | 514 delete processor_; |
513 delete generator_; | 515 delete generator_; |
514 processor_ = NULL; | 516 processor_ = NULL; |
515 generator_ = NULL; | 517 generator_ = NULL; |
516 logger->logging_nesting_ = saved_logging_nesting_; | 518 logger->logging_nesting_ = saved_logging_nesting_; |
517 } | 519 } |
518 | 520 |
519 | 521 |
520 } } // namespace v8::internal | 522 } } // namespace v8::internal |
OLD | NEW |