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

Side by Side Diff: runtime/bin/main.cc

Issue 11428067: Merge the Merlin heap tracing to top-of-trunk. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: add yet another missing file 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 | « no previous file | runtime/include/dart_api.h » ('j') | runtime/include/dart_api.h » ('J')
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 <stdlib.h> 5 #include <stdlib.h>
6 #include <string.h> 6 #include <string.h>
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include "include/dart_api.h" 9 #include "include/dart_api.h"
10 #include "include/dart_debugger_api.h" 10 #include "include/dart_debugger_api.h"
(...skipping 14 matching lines...) Expand all
25 // snapshot_buffer points to a snapshot if we link in a snapshot otherwise 25 // snapshot_buffer points to a snapshot if we link in a snapshot otherwise
26 // it is initialized to NULL. 26 // it is initialized to NULL.
27 extern const uint8_t* snapshot_buffer; 27 extern const uint8_t* snapshot_buffer;
28 28
29 29
30 // Global state that indicates whether perf_events symbol information 30 // Global state that indicates whether perf_events symbol information
31 // is to be generated or not. 31 // is to be generated or not.
32 static File* perf_events_symbols_file = NULL; 32 static File* perf_events_symbols_file = NULL;
33 33
34 34
35 // Global state that indicates whether heap tracing is on.
36 static bool heap_trace = false;
37
38
39 // Global state that indicates the file name prefix to use for heap
40 // trace output files.
41 static const char* heap_trace_file_prefix = "dart_heap_trace";
42
43
35 // Global state that indicates whether pprof symbol information is 44 // Global state that indicates whether pprof symbol information is
36 // to be generated or not. 45 // to be generated or not.
37 static const char* generate_pprof_symbols_filename = NULL; 46 static const char* generate_pprof_symbols_filename = NULL;
38 47
39 48
40 // Global state that stores a pointer to the application script snapshot. 49 // Global state that stores a pointer to the application script snapshot.
41 static bool use_script_snapshot = false; 50 static bool use_script_snapshot = false;
42 static File* snapshot_file = NULL; 51 static File* snapshot_file = NULL;
43 52
44 // Global state that indicates whether there is a debug breakpoint. 53 // Global state that indicates whether there is a debug breakpoint.
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 } 182 }
174 183
175 184
176 static bool ProcessPprofOption(const char* filename) { 185 static bool ProcessPprofOption(const char* filename) {
177 ASSERT(filename != NULL); 186 ASSERT(filename != NULL);
178 generate_pprof_symbols_filename = filename; 187 generate_pprof_symbols_filename = filename;
179 return true; 188 return true;
180 } 189 }
181 190
182 191
192 static bool ProcessHeapTraceOption(const char* heap_trace_option) {
193 heap_trace = true;
194 return true;
195 }
196
197
198 static bool ProcessHeapTraceFilePrefixOption(
199 const char* heap_trace_file_prefix_option) {
200 ASSERT(heap_trace_file_prefix_option != NULL);
201 heap_trace_file_prefix = heap_trace_file_prefix_option;
202 return true;
203 }
204
205
183 static bool ProcessScriptSnapshotOption(const char* filename) { 206 static bool ProcessScriptSnapshotOption(const char* filename) {
184 if (filename != NULL && strlen(filename) != 0) { 207 if (filename != NULL && strlen(filename) != 0) {
185 use_script_snapshot = true; 208 use_script_snapshot = true;
186 snapshot_file = File::Open(filename, File::kRead); 209 snapshot_file = File::Open(filename, File::kRead);
187 } 210 }
188 return true; 211 return true;
189 } 212 }
190 213
191 214
192 static struct { 215 static struct {
193 const char* option_name; 216 const char* option_name;
194 bool (*process)(const char* option); 217 bool (*process)(const char* option);
195 } main_options[] = { 218 } main_options[] = {
196 // Standard options shared with dart2js. 219 // Standard options shared with dart2js.
197 { "--version", ProcessVersionOption }, 220 { "--version", ProcessVersionOption },
198 { "--help", ProcessHelpOption }, 221 { "--help", ProcessHelpOption },
199 { "-h", ProcessHelpOption }, 222 { "-h", ProcessHelpOption },
200 { "--verbose", ProcessVerboseOption }, 223 { "--verbose", ProcessVerboseOption },
201 { "-v", ProcessVerboseOption }, 224 { "-v", ProcessVerboseOption },
202 { "--package-root=", ProcessPackageRootOption }, 225 { "--package-root=", ProcessPackageRootOption },
203 { "-p", ProcessPackageRootOption }, 226 { "-p", ProcessPackageRootOption },
204 // VM specific options to the standalone dart program. 227 // VM specific options to the standalone dart program.
205 { "--break_at=", ProcessBreakpointOption }, 228 { "--break_at=", ProcessBreakpointOption },
206 { "--compile_all", ProcessCompileAllOption }, 229 { "--compile_all", ProcessCompileAllOption },
207 { "--debug", ProcessDebugOption }, 230 { "--debug", ProcessDebugOption },
208 { "--generate_perf_events_symbols", ProcessPerfEventsOption }, 231 { "--generate_perf_events_symbols", ProcessPerfEventsOption },
209 { "--generate_pprof_symbols=", ProcessPprofOption }, 232 { "--generate_pprof_symbols=", ProcessPprofOption },
233 { "--heap_trace", ProcessHeapTraceOption },
234 { "--heap_trace_file_prefix=", ProcessHeapTraceFilePrefixOption },
210 { "--use_script_snapshot=", ProcessScriptSnapshotOption }, 235 { "--use_script_snapshot=", ProcessScriptSnapshotOption },
211 { NULL, NULL } 236 { NULL, NULL }
212 }; 237 };
213 238
214 239
215 static bool ProcessMainOptions(const char* option) { 240 static bool ProcessMainOptions(const char* option) {
216 int i = 0; 241 int i = 0;
217 const char* name = main_options[0].option_name; 242 const char* name = main_options[0].option_name;
218 while (name != NULL) { 243 while (name != NULL) {
219 int length = strlen(name); 244 int length = strlen(name);
220 if (strncmp(option, name, length) == 0) { 245 if (strncmp(option, name, length) == 0) {
221 return main_options[i].process(option + length); 246 return main_options[i].process(option + length);
222 } 247 }
223 i += 1; 248 i += 1;
224 name = main_options[i].option_name; 249 name = main_options[i].option_name;
225 } 250 }
226 return false; 251 return false;
227 } 252 }
228 253
229 254
230 static void WriteToPerfEventsFile(const char* buffer, int64_t num_bytes) { 255 static void WriteToPerfEventsFile(const char* buffer, int64_t num_bytes) {
231 ASSERT(perf_events_symbols_file != NULL); 256 ASSERT(perf_events_symbols_file != NULL);
232 perf_events_symbols_file->WriteFully(buffer, num_bytes); 257 perf_events_symbols_file->WriteFully(buffer, num_bytes);
233 } 258 }
234 259
260
261 // This function used by the heap trace to open new trace files, one
262 // file per isolate.
263 static void* OpenHeapTraceFile(const char* name) {
264 File* file = File::Open(name, File::kWriteTruncate);
265 ASSERT(file != NULL);
266 return reinterpret_cast<void*>(file);
267 }
268
269
270 // Function used by the heap trace to write to trace files.
271 static void WriteToHeapTraceFile(const void* buffer,
272 intptr_t num_bytes,
273 void* stream) {
274 ASSERT(stream != NULL);
275 File* file_stream = reinterpret_cast<File*>(stream);
276 bool bytes_written = file_stream->WriteFully(buffer, num_bytes);
277 ASSERT(bytes_written);
278 }
279
280
281 // Function used by the heap trace to close trace files.
282 static void CloseHeapTraceFile(void* stream) {
283 File* file_stream = reinterpret_cast<File*>(stream);
284 delete file_stream; // Closes the file.
285 }
286
287
235 // Convert all the arguments to UTF8. On Windows, the arguments are 288 // Convert all the arguments to UTF8. On Windows, the arguments are
236 // encoded in the current code page and not UTF8. 289 // encoded in the current code page and not UTF8.
237 // 290 //
238 // Returns true if the arguments are converted. In that case 291 // Returns true if the arguments are converted. In that case
239 // each of the arguments need to be deallocated using free. 292 // each of the arguments need to be deallocated using free.
240 static bool Utf8ConvertArgv(int argc, char** argv) { 293 static bool Utf8ConvertArgv(int argc, char** argv) {
241 bool result = false; 294 bool result = false;
242 for (int i = 0; i < argc; i++) { 295 for (int i = 0; i < argc; i++) {
243 char* arg = argv[i]; 296 char* arg = argv[i];
244 argv[i] = StringUtils::SystemStringToUtf8(arg); 297 argv[i] = StringUtils::SystemStringToUtf8(arg);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 } 344 }
292 345
293 if (perf_events_symbols_file != NULL) { 346 if (perf_events_symbols_file != NULL) {
294 Dart_InitPerfEventsSupport(&WriteToPerfEventsFile); 347 Dart_InitPerfEventsSupport(&WriteToPerfEventsFile);
295 } 348 }
296 349
297 if (generate_pprof_symbols_filename != NULL) { 350 if (generate_pprof_symbols_filename != NULL) {
298 Dart_InitPprofSupport(); 351 Dart_InitPprofSupport();
299 } 352 }
300 353
354 if (heap_trace) {
355 Dart_InitHeapTrace(&OpenHeapTraceFile,
356 &WriteToHeapTraceFile,
357 &CloseHeapTraceFile,
358 heap_trace_file_prefix);
359 }
360
301 // Get the script name. 361 // Get the script name.
302 if (i < argc) { 362 if (i < argc) {
303 *script_name = argv[i]; 363 *script_name = argv[i];
304 i++; 364 i++;
305 } else { 365 } else {
306 return -1; 366 return -1;
307 } 367 }
308 368
309 // Parse out options to be passed to dart main. 369 // Parse out options to be passed to dart main.
310 while (i < argc) { 370 while (i < argc) {
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 Dart_ShutdownIsolate(); 835 Dart_ShutdownIsolate();
776 // Terminate process exit-code handler. 836 // Terminate process exit-code handler.
777 Process::TerminateExitCodeHandler(); 837 Process::TerminateExitCodeHandler();
778 // Free copied argument strings if converted. 838 // Free copied argument strings if converted.
779 if (argv_converted) { 839 if (argv_converted) {
780 for (int i = 0; i < argc; i++) free(argv[i]); 840 for (int i = 0; i < argc; i++) free(argv[i]);
781 } 841 }
782 842
783 return 0; 843 return 0;
784 } 844 }
OLDNEW
« no previous file with comments | « no previous file | runtime/include/dart_api.h » ('j') | runtime/include/dart_api.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698