diff --git a/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc b/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc index 9ecaa7ec688..77ab3511f53 100644 --- a/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc +++ b/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc @@ -894,16 +894,11 @@ DART_EXPORT void ThreadPoolTest_BarrierSync( dart_exit_isolate(); { std::unique_lock lock(mutex); - ++thread_count; - if (thread_count < num_threads) { - while (thread_count < num_threads) { - cvar.wait(lock); - } - } else { - if (thread_count != num_threads) FATAL("bug"); - cvar.notify_all(); + while (thread_count < num_threads) { + cvar.wait(lock); } + cvar.notify_all(); } dart_enter_isolate(isolate); } @@ -1282,6 +1277,11 @@ DART_EXPORT void SetFfiNativeResolverForTest(Dart_Handle url) { ENSURE(!Dart_IsError(result)); } +DART_EXPORT void WaitUntilNThreadsEnterBarrier(intptr_t num_threads) { + ThreadPoolTest_BarrierSync(Dart_CurrentIsolate_DL, Dart_EnterIsolate_DL, + Dart_ExitIsolate_DL, num_threads); +} + //////////////////////////////////////////////////////////////////////////////// // Helper for the regression test for b/216834909 //////////////////////////////////////////////////////////////////////////////// diff --git a/runtime/include/dart_api_dl.h b/runtime/include/dart_api_dl.h index ba50d992369..cce34500947 100644 --- a/runtime/include/dart_api_dl.h +++ b/runtime/include/dart_api_dl.h @@ -90,6 +90,10 @@ typedef void (*Dart_NativeMessageHandler_DL)(Dart_Port_DL dest_port_id, F(Dart_UpdateFinalizableExternalSize, void, \ (Dart_FinalizableHandle object, Dart_Handle strong_ref_to_object, \ intptr_t external_allocation_size)) \ + /* Isolates */ \ + F(Dart_CurrentIsolate, Dart_Isolate, (void)) \ + F(Dart_ExitIsolate, void, (void)) \ + F(Dart_EnterIsolate, void, (Dart_Isolate)) \ /* Dart_Port */ \ F(Dart_Post, bool, (Dart_Port_DL port_id, Dart_Handle object)) \ F(Dart_NewSendPort, Dart_Handle, (Dart_Port_DL port_id)) \ diff --git a/runtime/include/dart_version.h b/runtime/include/dart_version.h index 680fb539bbe..e2d3651fbd3 100644 --- a/runtime/include/dart_version.h +++ b/runtime/include/dart_version.h @@ -11,6 +11,6 @@ // On backwards compatible changes the minor version is increased. // The versioning covers the symbols exposed in dart_api_dl.h #define DART_API_DL_MAJOR_VERSION 2 -#define DART_API_DL_MINOR_VERSION 2 +#define DART_API_DL_MINOR_VERSION 3 #endif /* RUNTIME_INCLUDE_DART_VERSION_H_ */ /* NOLINT */ diff --git a/tests/ffi/dl_api_exit_enter_isolate_test.dart b/tests/ffi/dl_api_exit_enter_isolate_test.dart new file mode 100644 index 00000000000..5842cc8ba72 --- /dev/null +++ b/tests/ffi/dl_api_exit_enter_isolate_test.dart @@ -0,0 +1,33 @@ +// Copyright (c) 2023, 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 + +import 'dart:ffi'; +import 'dart:isolate'; + +import 'package:expect/expect.dart'; + +import 'dylib_utils.dart'; + +final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions"); + +final initializeApi = ffiTestFunctions.lookupFunction< + IntPtr Function(Pointer), + int Function(Pointer)>("InitDartApiDL"); +final enterBarrier = + ffiTestFunctions.lookupFunction( + "WaitUntilNThreadsEnterBarrier"); + +main() async { + const threadBarrierCount = 30; + + initializeApi(NativeApi.initializeApiDLData); + + final all = []; + for (int i = 0; i < threadBarrierCount; ++i) { + all.add(Isolate.run(() => enterBarrier(threadBarrierCount))); + } + await Future.wait(all); +} diff --git a/tests/ffi_2/dl_api_exit_enter_isolate_test.dart b/tests/ffi_2/dl_api_exit_enter_isolate_test.dart new file mode 100644 index 00000000000..03abbb3ed50 --- /dev/null +++ b/tests/ffi_2/dl_api_exit_enter_isolate_test.dart @@ -0,0 +1,35 @@ +// Copyright (c) 2023, 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 + +// SharedObjects=ffi_test_functions + +import 'dart:ffi'; +import 'dart:isolate'; + +import 'package:expect/expect.dart'; + +import 'dylib_utils.dart'; + +final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions"); + +final initializeApi = ffiTestFunctions.lookupFunction< + IntPtr Function(Pointer), + int Function(Pointer)>("InitDartApiDL"); +final enterBarrier = + ffiTestFunctions.lookupFunction( + "WaitUntilNThreadsEnterBarrier"); + +main() async { + const threadBarrierCount = 30; + + initializeApi(NativeApi.initializeApiDLData); + + final all = []; + for (int i = 0; i < threadBarrierCount; ++i) { + all.add(Isolate.run(() => enterBarrier(threadBarrierCount))); + } + await Future.wait(all); +}