Chromium Code Reviews| Index: runtime/bin/vmservice/client/lib/tracer.dart |
| diff --git a/runtime/bin/vmservice/client/lib/tracer.dart b/runtime/bin/vmservice/client/lib/tracer.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a28fb65c12c42419f0bf8fc70b917a17f883339e |
| --- /dev/null |
| +++ b/runtime/bin/vmservice/client/lib/tracer.dart |
| @@ -0,0 +1,90 @@ |
| +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +library tracer; |
| + |
| +import 'dart:async'; |
| +import 'dart:html'; |
| + |
| +import 'package:logging/logging.dart'; |
| +import 'package:observe/observe.dart'; |
| + |
| +_deepCopy(src) { |
| + if (src is Map) { |
| + var dest = {}; |
| + src.forEach((key, val) { |
| + dest[key] = _deepCopy(val); |
| + }); |
| + return dest; |
| + } else if (src is List) { |
| + var dest = []; |
| + src.forEach((val) { |
| + dest.add(_deepCopy(val)); |
| + }); |
| + return dest; |
| + } else { |
| + return src; |
| + } |
| +} |
| + |
| +class TraceEvent { |
| + TraceEvent.msg(this._time, this.message, Map originalMap) { |
| + map = _deepCopy(originalMap); |
| + } |
| + |
| + String get timeStamp => "T+${_time.toStringAsFixed(3)}"; |
| + |
| + String toString() { |
| + return "[${timeStamp}] ${message}"; |
| + } |
| + |
| + double _time; |
| + String message; |
| + Map map; |
| +} |
| + |
| +class Tracer extends Observable { |
| + // The current global tracer. |
| + static Tracer get current => _current; |
| + |
| + static Tracer _current; |
| + |
| + static void start() { |
| + if (_current == null) { |
| + _current = new Tracer(); |
| + } |
| + } |
| + static void stop() { |
| + _current = null; |
| + } |
| + |
| + // The tracer subscribes to all logging events. |
| + StreamSubscription loggerSub = null; |
| + |
| + // The start time for the current request. |
| + double _startTime; |
| + |
| + // A list of all tracing events for thre current request. |
| + ObservableList<TraceEvent> events = new ObservableList<TraceEvent>(); |
| + |
| + Tracer() { |
| + loggerSub = Logger.root.onRecord.listen((LogRecord rec) { |
| + // Echo all log messages to the trace. |
| + trace('${rec.level.name}: ${rec.message}'); |
| + }); |
|
Cutch
2014/07/30 18:20:46
Should we cancel this subscription in stop()?
turnidge
2014/07/30 19:28:15
Done.
|
| + reset(); |
| + } |
| + |
| + void reset() { |
| + _startTime = window.performance.now(); |
|
Cutch
2014/07/30 18:20:46
If you use a Stopwatch you could not depend on dar
turnidge
2014/07/30 19:28:15
Done.
|
| + events.clear(); |
| + } |
| + |
| + TraceEvent trace(String message, {Map map: null}) { |
| + double now = window.performance.now(); |
| + var event = new TraceEvent.msg((now - _startTime), message, map); |
| + events.add(event); |
| + return event; |
| + } |
| +} |