blob: 5df9cf9a87aef8e5549f4758296e203fd8929f5c [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This Mojo app is a benchmark of Dart <=> Dart IPC Round Trip Times.
// To run it:
//
// $ ./mojo/devtools/common/mojo_benchmark [--release] mojo/tools/data/rtt_benchmarks
import 'dart:async';
import 'dart:isolate';
import 'package:common/tracing_helper.dart';
import 'package:mojo/application.dart';
import 'package:mojo/core.dart';
void echoIsolate(SendPort sendPort) {
var receivePort = new RawReceivePort();
sendPort.send(receivePort.sendPort);
receivePort.handler = ((msg) {
sendPort.send(msg);
});
}
class IsolateMessageApp extends Application {
static const Duration _WARMUP_DURATION = const Duration(seconds: 1);
static const Duration _DELAY = const Duration(microseconds: 50);
TracingHelper _tracing;
RawReceivePort _receivePort;
SendPort _sendPort;
Completer _sendPortCompleter;
Isolate _isolate;
List<Completer> _completers;
bool _doEcho;
bool _warmup;
IsolateMessageApp.fromHandle(MojoHandle handle) : super.fromHandle(handle) {
onError = _errorHandler;
}
void initialize(List<String> args, String url) {
// Initialize tracing.
_tracing = new TracingHelper.fromApplication(this, "isolate_rtt_benchmark");
// Start echoing.
_doEcho = true;
_completers = [];
_sendPortCompleter = new Completer();
_receivePort = new RawReceivePort();
_receivePort.handler = _isolateMessageHandler;
Isolate.spawn(echoIsolate, _receivePort.sendPort).then((isolate) {
_isolate = isolate;
_sendPortCompleter.future.then((sendPort) {
_sendPort = sendPort;
_run();
});
});
// Begin tracing echo rtts after waiting for _WARMUP_DURATION.
_warmup = true;
new Timer(_WARMUP_DURATION, () => _warmup = false);
}
_run() {
if (_doEcho) {
if (_warmup) {
_echo("ping").then((_) => new Timer(_DELAY, _run));
} else {
_tracedEcho().then((_) => new Timer(_DELAY, _run));
}
}
}
Future _tracedEcho() {
int start = getTimeTicksNow();
return _echo("ping").then((_) {
int end = getTimeTicksNow();
_tracing.traceDuration("ping", "isolate_rtt_benchmark", start, end);
});
}
Future _echo(String s) {
var completer = new Completer();
_completers.add(completer);
_sendPort.send("ping");
return completer.future;
}
_isolateMessageHandler(msg) {
if (msg is SendPort) {
_sendPortCompleter.complete(msg);
} else {
var completer = _completers.removeAt(0);
completer.complete(null);
}
}
void _errorHandler(Object e) {
_doEcho = false;
_receivePort.close();
MojoHandle.reportLeakedHandles();
}
}
main(List args) {
MojoHandle appHandle = new MojoHandle(args[0]);
new IsolateMessageApp.fromHandle(appHandle);
}