OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
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. | |
4 | |
5 part of dart.developer; | |
6 | |
7 typedef dynamic TimelineSyncFunction(); | |
8 | |
9 /// Add to the timeline. | |
10 class Timeline { | |
11 /// Open a synchronous block of time for |category| with |name|. | |
12 /// A |SyncBlock| should not be kept open across isolate messages. | |
13 static SyncBlock openSync(String category, String name) { | |
14 if (category is! String) { | |
15 throw new ArgumentError.value(category, | |
16 'category', | |
17 'Must be a String'); | |
18 } | |
19 if (name is! String) { | |
20 throw new ArgumentError.value(name, | |
21 'name', | |
22 'Must be a String'); | |
23 } | |
24 return new SyncBlock._(category, name, _getTraceClock()); | |
25 } | |
26 | |
27 /// A utility method to time a synchronous |function|. Opens a block | |
28 /// for |category| with |name|. | |
29 static dynamic timeSync(String category, | |
30 String name, | |
31 TimelineSyncFunction function, | |
32 {Map arguments}) { | |
33 final block = openSync(category, name); | |
34 final returnValue = function(); | |
rmacnak
2015/09/29 22:36:41
try {
return function();
} finally {
if (argum
Cutch
2015/09/30 14:42:29
Done.
| |
35 if (arguments is Map) { | |
36 block.arguments.addAll(arguments); | |
37 } | |
38 block.close(); | |
39 return returnValue; | |
40 } | |
41 } | |
42 | |
43 /// A synchronous block of time on the timeline. This block should not be | |
44 /// kept open across isolate messages. | |
45 class SyncBlock { | |
46 /// The category this block belongs to. | |
47 final String category; | |
48 /// The name of this block. | |
49 final String name; | |
50 /// An (optional) set of arguments which will be serialized to JSON and | |
51 /// associated with this block. | |
52 final Map arguments = {}; | |
53 // The start time stamp. | |
54 final int _start; | |
55 // Has this block been closed? | |
56 bool _closed = false; | |
57 | |
58 SyncBlock._(this.category, | |
59 this.name, | |
60 this._start); | |
61 | |
62 /// Close this block of time. At this point, this block can no longer be | |
63 /// used. | |
64 void close() { | |
65 if (_closed) { | |
66 throw new StateError( | |
67 'It is illegal to call close twice on the same SyncBlock'); | |
68 } | |
69 _closed = true; | |
70 var end = _getTraceClock(); | |
71 | |
72 // Encode arguments map as JSON before reporting. | |
73 var argumentsAsJson = JSON.encode(arguments); | |
74 | |
75 // Report event to runtime. | |
76 _reportCompleteEvent(_start, | |
77 end, | |
78 category, | |
79 name, | |
80 argumentsAsJson); | |
81 } | |
82 } | |
83 | |
84 /// Returns the current value from the trace clock. | |
85 external int _getTraceClock(); | |
86 | |
87 /// Reports a complete synchronous event. | |
88 external void _reportCompleteEvent(int start, | |
89 int end, | |
90 String category, | |
91 String name, | |
92 String argumentsAsJson); | |
OLD | NEW |