312c13be73
Review URL: https://codereview.chromium.org//336903003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@37335 260f80e4-7a28-3924-810f-c04153c831b5
53 lines
1.6 KiB
Dart
53 lines
1.6 KiB
Dart
// Copyright (c) 2014, 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.
|
|
|
|
import "dart:async";
|
|
import "dart:isolate";
|
|
|
|
// This type corresponds to the VM-internal class LibraryPrefix.
|
|
class _LibraryPrefix {
|
|
|
|
bool _load() native "LibraryPrefix_load";
|
|
|
|
bool _invalidateDependentCode()
|
|
native "LibraryPrefix_invalidateDependentCode";
|
|
|
|
loadLibrary() {
|
|
var completer = _outstandingLoadRequests[this];
|
|
if (completer != null) {
|
|
return completer.future;
|
|
}
|
|
completer = new Completer<bool>();
|
|
_outstandingLoadRequests[this] = completer;
|
|
Timer.run(() {
|
|
var hasCompleted = this._load();
|
|
// Loading can complete immediately, for example when the same
|
|
// library has been loaded eagerly or through another deferred
|
|
// prefix. If that is the case, we must invalidate the dependent
|
|
// code and complete the future now since there will be no callback
|
|
// from the VM.
|
|
if (hasCompleted) {
|
|
_invalidateDependentCode();
|
|
completer.complete(true);
|
|
_outstandingLoadRequests.remove(this);
|
|
}
|
|
});
|
|
return completer.future;
|
|
}
|
|
}
|
|
|
|
var _outstandingLoadRequests = new Map<_LibraryPrefix, Completer>();
|
|
|
|
|
|
// Called from the VM when all outstanding load requests have
|
|
// finished.
|
|
_completeDeferredLoads() {
|
|
var lenghth = _outstandingLoadRequests;
|
|
_outstandingLoadRequests.forEach((prefix, completer) {
|
|
prefix._invalidateDependentCode();
|
|
completer.complete(true);
|
|
});
|
|
_outstandingLoadRequests.clear();
|
|
}
|