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

Side by Side Diff: runtime/vm/code_observers.cc

Issue 11490026: Move generate_perf_events_symbols flag to VM (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: undelete an accidentally deleted line Created 8 years 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 | « runtime/bin/main.cc ('k') | runtime/vm/dart.h » ('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 (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/code_observers.h" 5 #include "vm/code_observers.h"
6 6
7 #include "vm/dart.h" 7 #include "vm/dart.h"
8 #include "vm/debuginfo.h" 8 #include "vm/debuginfo.h"
9 #include "vm/flags.h" 9 #include "vm/flags.h"
10 #include "vm/isolate.h" 10 #include "vm/isolate.h"
11 #include "vm/os.h" 11 #include "vm/os.h"
12 #include "vm/vtune.h" 12 #include "vm/vtune.h"
13 #include "vm/zone.h" 13 #include "vm/zone.h"
14 #include "bin/file.h"
siva 2012/12/11 18:02:51 We can't include bin header files directly like th
Max Heinritz 2012/12/11 19:09:25 Done.
14 15
15 namespace dart { 16 namespace dart {
16 17
17 DEFINE_FLAG(bool, generate_gdb_symbols, false, 18 DEFINE_FLAG(bool, generate_gdb_symbols, false,
18 "Generate symbols of generated dart functions for debugging with GDB"); 19 "Generate symbols of generated dart functions for debugging with GDB");
20 DEFINE_FLAG(bool, generate_perf_events_symbols, false,
21 "Generate events symbols for profiling with perf");
19 22
20 intptr_t CodeObservers::observers_length_ = 0; 23 intptr_t CodeObservers::observers_length_ = 0;
21 CodeObserver** CodeObservers::observers_ = NULL; 24 CodeObserver** CodeObservers::observers_ = NULL;
22 25
23 26
24 void CodeObservers::Register(CodeObserver* observer) { 27 void CodeObservers::Register(CodeObserver* observer) {
25 observers_length_++; 28 observers_length_++;
26 observers_ = reinterpret_cast<CodeObserver**>( 29 observers_ = reinterpret_cast<CodeObserver**>(
27 realloc(observers_, sizeof(observer) * observers_length_)); 30 realloc(observers_, sizeof(observer) * observers_length_));
28 if (observers_ == NULL) { 31 if (observers_ == NULL) {
(...skipping 20 matching lines...) Expand all
49 bool CodeObservers::AreActive() { 52 bool CodeObservers::AreActive() {
50 for (intptr_t i = 0; i < observers_length_; i++) { 53 for (intptr_t i = 0; i < observers_length_; i++) {
51 if (observers_[i]->IsActive()) return true; 54 if (observers_[i]->IsActive()) return true;
52 } 55 }
53 return false; 56 return false;
54 } 57 }
55 58
56 59
57 class PerfCodeObserver : public CodeObserver { 60 class PerfCodeObserver : public CodeObserver {
58 public: 61 public:
62 PerfCodeObserver() {
63 Dart_FileOpenCallback file_open = Isolate::file_open_callback();
64 if (file_open == NULL) {
65 return;
66 }
67 const char* format = "/tmp/perf-%ld.map";
68 intptr_t pid = getpid();
siva 2012/12/11 18:02:51 This may not port to Windows, maybe you should add
Max Heinritz 2012/12/11 19:09:25 Could I do this in another CL? I added a condition
69 intptr_t len = OS::SNPrint(NULL, 0, format, pid);
70 char* filename = new char[len + 1];
71 OS::SNPrint(filename, len + 1, format, pid);
72 out_file_ = (*file_open)(filename);
73 }
74
75 // Not currently being called
76 ~PerfCodeObserver() {
77 Dart_FileCloseCallback file_close = Isolate::file_close_callback();
78 if (file_close != NULL) {
siva 2012/12/11 18:02:51 Also you probably need: ASSERT(out_file_ != NULL);
Max Heinritz 2012/12/11 19:09:25 Done.
79 (*file_close)(out_file_);
80 }
81 }
82
59 virtual bool IsActive() const { 83 virtual bool IsActive() const {
60 return Dart::perf_events_file() != NULL; 84 return FLAG_generate_perf_events_symbols;
61 } 85 }
62 86
63 virtual void Notify(const char* name, 87 virtual void Notify(const char* name,
64 uword base, 88 uword base,
65 uword prologue_offset, 89 uword prologue_offset,
66 uword size, 90 uword size,
67 bool optimized) { 91 bool optimized) {
92 Dart_FileWriteCallback file_write = Isolate::file_write_callback();
93 ASSERT(file_write != NULL);
68 const char* format = "%"Px" %"Px" %s%s\n"; 94 const char* format = "%"Px" %"Px" %s%s\n";
69 const char* marker = optimized ? "*" : ""; 95 const char* marker = optimized ? "*" : "";
70 intptr_t len = OS::SNPrint(NULL, 0, format, base, size, marker, name); 96 intptr_t len = OS::SNPrint(NULL, 0, format, base, size, marker, name);
71 char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1); 97 char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
72 OS::SNPrint(buffer, len + 1, format, base, size, marker, name); 98 OS::SNPrint(buffer, len + 1, format, base, size, marker, name);
73 Dart_FileWriteCallback file_write = Isolate::file_write_callback(); 99 ASSERT(out_file_ != NULL);
74 ASSERT(file_write != NULL); 100 (*file_write)(buffer, len, out_file_);
75 void* file = Dart::perf_events_file();
76 ASSERT(file != NULL);
77 (*file_write)(buffer, len, file);
78 } 101 }
102
103 private:
104 void* out_file_;
siva 2012/12/11 18:02:51 Not related to your change but these classes in th
Max Heinritz 2012/12/11 19:09:25 Any action to take here?
79 }; 105 };
80 106
81 107
82 class PprofCodeObserver : public CodeObserver { 108 class PprofCodeObserver : public CodeObserver {
83 public: 109 public:
84 virtual bool IsActive() const { 110 virtual bool IsActive() const {
85 return Dart::pprof_symbol_generator() != NULL; 111 return Dart::pprof_symbol_generator() != NULL;
86 } 112 }
87 113
88 virtual void Notify(const char* name, 114 virtual void Notify(const char* name,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 (base + prologue_offset), 150 (base + prologue_offset),
125 (size - prologue_offset)); 151 (size - prologue_offset));
126 } else { 152 } else {
127 DebugInfo::RegisterSection(name, base, size); 153 DebugInfo::RegisterSection(name, base, size);
128 } 154 }
129 } 155 }
130 }; 156 };
131 157
132 158
133 void CodeObservers::InitOnce() { 159 void CodeObservers::InitOnce() {
160 // TODO(meh): move OS-specific logic to separate module
161 #if defined(TARGET_OS_LINUX)
siva 2012/12/11 18:02:51 Why does this have to conditional on a OS define,
Max Heinritz 2012/12/11 19:09:25 Done. I had originally added this to prevent crea
134 Register(new PerfCodeObserver); 162 Register(new PerfCodeObserver);
163 #endif
135 Register(new PprofCodeObserver); 164 Register(new PprofCodeObserver);
136 Register(new GdbCodeObserver); 165 Register(new GdbCodeObserver);
137 #if defined(DART_VTUNE_SUPPORT) 166 #if defined(DART_VTUNE_SUPPORT)
138 Register(new VTuneCodeObserver); 167 Register(new VTuneCodeObserver);
139 #endif 168 #endif
140 } 169 }
141 170
142 171
143 } // namespace dart 172 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/bin/main.cc ('k') | runtime/vm/dart.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698