| // Copyright (c) 2022, 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. |
| // |
| // SharedObjects=ffi_test_functions |
| |
| // Regression test for b/216834909. |
| // |
| // Check that subprocess spawning implementation uses _exit rather than exit on |
| // paths which terminate fork child without exec-ing. |
| |
| // @dart = 2.9 |
| |
| import 'dart:async'; |
| import 'dart:ffi'; |
| import 'dart:io'; |
| import 'dart:isolate'; |
| |
| import "package:expect/expect.dart"; |
| import '../../../../tests/ffi/dylib_utils.dart'; |
| |
| final ffiTestFunctions = dlopenPlatformSpecific('ffi_test_functions'); |
| |
| final setAtExit = |
| ffiTestFunctions.lookupFunction<Void Function(Int64), void Function(int)>( |
| 'Regress216834909_SetAtExit'); |
| |
| main(List<String> args) async { |
| // We only care about platforms which use fork/exec. |
| if (!Platform.isLinux && !Platform.isAndroid && !Platform.isMacOS) { |
| return; |
| } |
| setAtExit(1); // Install at exit handler. |
| await Process.start('true', [], mode: ProcessStartMode.detached); |
| setAtExit(0); // Clear at exit handler. |
| } |