| Index: lib/runner.dart
|
| diff --git a/lib/runner.dart b/lib/runner.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cd26d5af981f3761562db0ac9ef63f118ab02911
|
| --- /dev/null
|
| +++ b/lib/runner.dart
|
| @@ -0,0 +1,61 @@
|
| +// Copyright (c) 2015, 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.
|
| +
|
| +/**
|
| + * A [Runner] runs a function, potentially in a different scope
|
| + * or even isolate.
|
| + */
|
| +library dart.pkg.isolate.runner;
|
| +
|
| +import "dart:async" show Future;
|
| +
|
| +/**
|
| + * Calls a function with an argument.
|
| + *
|
| + * The function can be run in a different place from where the `Runner`
|
| + * resides, e.g., in a different isolate.
|
| + */
|
| +class Runner {
|
| + /**
|
| + * Request that [function] be called with the provided arguments.
|
| + *
|
| + * The arguments will be applied to the function in the same way as by
|
| + * [Function.apply], but it may happen in a diffent isolate or setting.
|
| + *
|
| + * It's necessary that the function can be sent through a [SendPort]
|
| + * if the call is performed in another isolate.
|
| + * That means the other isolate should be created using [Isolate.spawn]
|
| + * so that it is running the same code as the sending isoalte,
|
| + * and the function must be a static or top-level function.
|
| + *
|
| + * Waits for the result of the call, and completes the returned future
|
| + * with the result, whether it's a value or an error.
|
| + *
|
| + * If the returned future does not complete before `timeLimit` has passed,
|
| + * the [onTimeout] action is executed instead, and its result (whether it
|
| + * returns or throws) is used as the result of the returned future.
|
| + *
|
| + * If `onTimeout` is omitted, a timeout will cause the returned future to
|
| + * complete with a [TimeoutException].
|
| + *
|
| + * The default implementation runs the function in the current isolate.
|
| + */
|
| + Future run(function(argument), Object argument,
|
| + {Duration timeout, onTimeout()}) {
|
| + Future result = new Future.sync(() => function(argument));
|
| + if (timeout != null) {
|
| + result = result.timeout(timeout, onTimeout: onTimeout);
|
| + }
|
| + return result;
|
| + }
|
| +
|
| + /**
|
| + * Stop the runner.
|
| + *
|
| + * If the runner has allocated resources, e.g., an isolate, it should
|
| + * be released. No further calls to [run] should be made after calling
|
| + * stop.
|
| + */
|
| + Future close() => new Future.value();
|
| +}
|
|
|