// 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.

// @dart = 2.9

// VMOptions=--enable-isolate-groups --experimental-enable-isolate-groups-jit
// VMOptions=--no-enable-isolate-groups

import "dart:isolate";
import "dart:async";
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";

isomain1(replyPort) {
  RawReceivePort port = new RawReceivePort();
  bool firstEvent = true;
  port.handler = (v) {
    if (!firstEvent) {
      throw "Survived suicide";
    }
    var controlPort = v[0];
    var killCapability = v[1];
    firstEvent = false;
    var isolate = new Isolate(controlPort, terminateCapability: killCapability);
    isolate.kill(priority: Isolate.immediate);
  };
  replyPort.send(port.sendPort);
}

void main() {
  asyncStart();
  var completer = new Completer(); // Completed by first reply from isolate.
  RawReceivePort reply = new RawReceivePort(completer.complete);
  Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
    completer.future.then((isolatePort) {
      RawReceivePort exitSignal;
      exitSignal = new RawReceivePort((_) {
        exitSignal.close();
        asyncEnd();
      });
      isolate.addOnExitListener(exitSignal.sendPort);
      isolatePort.send([isolate.controlPort, isolate.terminateCapability]);
      reply.close();
    });
  });
}
