blob: 73fd5706de0c86d3e21b2936aaeab8a668197acd [file] [edit]
// 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);
}
}