提交 0ce96c8a 编写于 作者: J Jason Simmons

Delete DartState during isolate shutdown

This solves two problems:
* UIDartState was being deleted during destruction of DartController after the
  isolate had been shut down.  The UIDartState held persistent handles to Dart
  objects, and deleting them when the isolate no longer exists caused an
  assertion failure.
* DartStates created for secondary isolates were never being deleted

Fixes https://github.com/flutter/flutter/issues/2549
上级 d1515e67
......@@ -40,15 +40,16 @@
namespace blink {
DartController::DartController() : weak_factory_(this) {
DartController::DartController()
: ui_dart_state_(nullptr),
weak_factory_(this) {
}
DartController::~DartController() {
if (ui_dart_state_) {
// Don't use a DartIsolateScope here since we never exit the isolate.
Dart_EnterIsolate(ui_dart_state_->isolate());
Dart_ShutdownIsolate();
ui_dart_state_->SetIsolate(nullptr);
Dart_ShutdownIsolate(); // deletes ui_dart_state_
ui_dart_state_ = nullptr;
}
}
......@@ -162,12 +163,12 @@ void DartController::RunFromLibrary(const std::string& name,
void DartController::CreateIsolateFor(std::unique_ptr<UIDartState> state) {
char* error = nullptr;
ui_dart_state_ = std::move(state);
Dart_Isolate isolate = Dart_CreateIsolate(
ui_dart_state_->url().c_str(), "main",
state->url().c_str(), "main",
reinterpret_cast<uint8_t*>(DART_SYMBOL(kDartIsolateSnapshotBuffer)),
nullptr, static_cast<DartState*>(ui_dart_state_.get()), &error);
nullptr, static_cast<DartState*>(state.get()), &error);
CHECK(isolate) << error;
ui_dart_state_ = state.release();
auto& message_handler = dart_state()->message_handler();
message_handler.set_quit_message_loop_when_isolate_exits(false);
DCHECK(Platform::current());
......
......@@ -40,14 +40,17 @@ class DartController {
void CreateIsolateFor(std::unique_ptr<UIDartState> ui_dart_state);
void Shutdown();
UIDartState* dart_state() const { return ui_dart_state_.get(); }
UIDartState* dart_state() const { return ui_dart_state_; }
private:
void DidLoadMainLibrary(std::string url);
void DidLoadSnapshot();
bool SendStartMessage(Dart_Handle root_library);
std::unique_ptr<UIDartState> ui_dart_state_;
// The DartState associated with the main isolate. This will be deleted
// during isolate shutdown.
UIDartState* ui_dart_state_;
std::unique_ptr<DartSnapshotLoader> snapshot_loader_;
base::WeakPtrFactory<DartController> weak_factory_;
......
......@@ -102,7 +102,8 @@ const char kFileUriPrefix[] = "file://";
const char kDartFlags[] = "dart-flags";
void IsolateShutdownCallback(void* callback_data) {
// TODO(dart)
DartState* dart_state = static_cast<DartState*>(callback_data);
delete dart_state;
}
bool IsServiceIsolateURL(const char* url_name) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册