| // Copyright (c) 2026, 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:ffi'; |
| |
| import 'package:expect/expect.dart'; |
| import 'package:ffi/ffi.dart'; |
| |
| typedef PthreadAttrInitFT = int Function(Pointer<Char>); |
| typedef PthreadAttrInitNFT = IntPtr Function(Pointer<Char>); |
| final pthreadAttrInit = DynamicLibrary.process() |
| .lookupFunction<PthreadAttrInitNFT, PthreadAttrInitFT>('pthread_attr_init'); |
| |
| typedef PthreadAttrDestroyFT = int Function(Pointer<Char>); |
| typedef PthreadAttrDestroyNFT = IntPtr Function(Pointer<Char>); |
| final pthreadAttrDestroy = DynamicLibrary.process() |
| .lookupFunction<PthreadAttrDestroyNFT, PthreadAttrDestroyFT>( |
| 'pthread_attr_destroy', |
| ); |
| |
| typedef PthreadCreateFT = |
| int Function(Pointer<IntPtr>, Pointer<Char>, Pointer, Pointer<Void>); |
| typedef PthreadCreateNFT = |
| IntPtr Function(Pointer<IntPtr>, Pointer<Char>, Pointer, Pointer<Void>); |
| final pthreadCreate = DynamicLibrary.process() |
| .lookupFunction<PthreadCreateNFT, PthreadCreateFT>('pthread_create'); |
| |
| typedef PthreadJoinFT = int Function(int, Pointer<Void>); |
| typedef PthreadJoinNFT = IntPtr Function(IntPtr, Pointer<Void>); |
| final pthreadJoin = DynamicLibrary.process() |
| .lookupFunction<PthreadJoinNFT, PthreadJoinFT>('pthread_join'); |
| |
| typedef PthreadSelfFT = int Function(); |
| typedef PthreadSelfNFT = IntPtr Function(); |
| final pthreadSelf = DynamicLibrary.process() |
| .lookupFunction<PthreadSelfNFT, PthreadSelfFT>('pthread_self'); |
| |
| class ThreadInfo { |
| final ptr_attr = calloc<Char>(64); // big enough to fit pthread_attr_t? |
| final ptr_tid = calloc<IntPtr>(1); |
| final ptr_data = calloc<Int32>(1024); |
| final ptr_retval = calloc<IntPtr>(1024); |
| |
| void join() { |
| Expect.equals(0, pthreadJoin(ptr_tid.value, ptr_retval.cast<Void>())); |
| calloc.free(ptr_retval); |
| |
| calloc.free(ptr_data); |
| calloc.free(ptr_tid); |
| |
| Expect.equals(0, pthreadAttrDestroy(ptr_attr)); |
| calloc.free(ptr_attr); |
| } |
| } |