// Copyright (c) 2020, 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=--worker-thread-priority=15

import 'dart:ffi';
import 'dart:io';

import 'package:expect/expect.dart';
import 'package:ffi/ffi.dart';

// pthread_t pthread_self()
typedef PthreadSelfFT = int Function();
typedef PthreadSelfNFT = IntPtr Function();

// int pthread_getschedparam(pthread_t thread, int *policy, struct sched_param *param);
typedef GetSchedParamFT = int Function(
    int self, Pointer<Int32> policy, Pointer<SchedParam> param);
typedef GetSchedParamNFT = IntPtr Function(
    IntPtr self, Pointer<Int32> policy, Pointer<SchedParam> param);

final pthreadSelf = DynamicLibrary.process()
    .lookupFunction<PthreadSelfNFT, PthreadSelfFT>('pthread_self');

final pthreadGetSchedParam = DynamicLibrary.process()
    .lookupFunction<GetSchedParamNFT, GetSchedParamFT>('pthread_getschedparam');

//  struct sched_param { int sched_priority; }
class SchedParam extends Struct {
  @Int32()
  int schedPriority;
}

main(args) {
  if (Platform.isMacOS) {
    final policy = calloc<Int32>(1);
    final param = calloc<SchedParam>(1);
    Expect.equals(0, pthreadGetSchedParam(pthreadSelf(), policy, param));
    Expect.equals(15, param.ref.schedPriority);
    calloc.free(policy);
    calloc.free(param);
  }
}
