#ifndef COSMOPOLITAN_LIBC_THREAD_FREEBSD_INTERNAL_H_
#define COSMOPOLITAN_LIBC_THREAD_FREEBSD_INTERNAL_H_
#include "libc/calls/struct/timespec.h"
#include "libc/errno.h"
#include "libc/intrin/asmflag.h"

/**
 * @fileoverview FreeBSD Threading
 *
 * @note even though FreeBSD uses a 64-bit type for thread IDs the
 *     maximum legal range is PID_MAX + 2 (100001) through INT_MAX
 */

#define THR_SUSPENDED    1
#define THR_SYSTEM_SCOPE 2

#define UMTX_OP_WAIT              2
#define UMTX_OP_WAIT_UINT         11
#define UMTX_OP_WAIT_UINT_PRIVATE 15
#define UMTX_OP_WAKE              3
#define UMTX_OP_WAKE_PRIVATE      16
#define UMTX_ABSTIME              1

#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_

struct rtprio {
  uint16_t type; /* scheduling class */
  uint16_t prio;
};

struct thr_param {
  void (*start_func)(void *);
  void *arg;
  char *stack_base;
  uint64_t stack_size;
  char *tls_base;
  uint64_t tls_size;
  int64_t *child_tid;
  int64_t *parent_tid;
  int32_t flags;
  struct rtprio *rtp;
};

struct _umtx_time {
  struct timespec _timeout;
  uint32_t _flags;
  uint32_t _clockid;
};

int sys_umtx_timedwait_uint(_Atomic(int) *, int, bool, const struct timespec *);

COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_THREAD_FREEBSD_INTERNAL_H_ */
