123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
/**
 * D header file for POSIX.
 *
 * Copyright: Public Domain
 * License:   Public Domain
 * Authors:   Sean Kelly
 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
 */
module tango.stdc.posix.sys.types;

private import tango.stdc.posix.config;
private import tango.stdc.stdint;
public import tango.stdc.stddef; // for size_t
public import tango.stdc.time;   // for clock_t, time_t

extern (C):

//
// Required
//
/*
blkcnt_t
blksize_t
dev_t
gid_t
ino_t
mode_t
nlink_t
off_t
pid_t
size_t
ssize_t
time_t
uid_t
*/

version( linux )
{
    alias c_ulong   ino_t;
    static if( __USE_LARGEFILE64 )
    {
      alias long      off_t;      // actually C header's off64_t in this mode
      alias long      blkcnt_t;   // actually C header's blkcnt64_t in this mode
      alias ulong     ino64_t;
      alias ino64_t   inol_t;
    }
    else
    {
      alias c_long    off_t;
      alias c_long    blkcnt_t;
      alias ino_t   inol_t;
    }
    alias ulong     dev_t;
    alias uint      mode_t;
    alias c_ulong   nlink_t;
    alias uint      uid_t;
    alias uint      gid_t;
    alias c_long    blksize_t;
    alias int       pid_t;
    //size_t (defined in tango.stdc.stddef)
    alias ptrdiff_t ssize_t;
    //time_t (defined in tango.stdc.time)
}
else version( darwin )
{
    alias long      blkcnt_t;
    alias int       blksize_t;
    alias int       dev_t;
    alias uint      gid_t;
    alias uint      ino_t;
    alias ino_t     inol_t;
    alias ushort    mode_t;
    alias ushort    nlink_t;
    alias long      off_t;
    alias int       pid_t;
    //size_t (defined in tango.stdc.stddef)
    alias ptrdiff_t  ssize_t;
    //time_t (defined in tango.stdc.time)
    alias uint      uid_t;
}
else version( FreeBSD )
{
    alias long      blkcnt_t;
    alias uint      blksize_t;
    alias uint      dev_t;
    alias uint      gid_t;
    alias uint      ino_t;
    alias ino_t     inol_t;
    alias ushort    mode_t;
    alias ushort    nlink_t;
    alias long      off_t;
    alias int       pid_t;
    //size_t (defined in tango.stdc.stddef)
    alias ptrdiff_t ssize_t;
    //time_t (defined in tango.stdc.time)
    alias uint      uid_t;
    alias uint      fflags_t;
}
else version( solaris )
{
    alias c_ulong   ino_t;
    static if( __USE_LARGEFILE64 )
    {
      alias long      off_t;
      alias long      blkcnt_t;
      alias ulong     ino64_t;
      alias ino64_t   inol_t;
    }
    else
    {
      alias c_long    off_t;
      alias c_long    blkcnt_t;
      alias ino_t     inol_t;
    }
    alias int       blksize_t;
    alias c_ulong   dev_t;
    alias uint      mode_t;
    alias uint      nlink_t;
    alias uint      uid_t;
    alias uint      gid_t;
    alias int       pid_t;
    //size_t (defined in tango.stdc.stddef)
    alias ptrdiff_t ssize_t;
    //time_t (defined in tango.stdc.time)


    alias char*     caddr_t;    /* ?<core address> type */
    alias c_long    daddr_t;    /* <disk address> type */
    alias short     cnt_t;      /* ?<count> type */
}
//
// XOpen (XSI)
//
/*
clock_t
fsblkcnt_t
fsfilcnt_t
id_t
key_t
suseconds_t
useconds_t
*/

version( linux )
{
  static if( __USE_LARGEFILE64 )
  {
    alias ulong     fsblkcnt_t;
    alias ulong     fsfilcnt_t;
  }
  else
  {
    alias c_ulong   fsblkcnt_t;
    alias c_ulong   fsfilcnt_t;
  }
    // clock_t (defined in tango.stdc.time)
    alias uint      id_t;
    alias int       key_t;
    alias c_long    suseconds_t;
    alias uint      useconds_t;
}
else version( darwin )
{
    //clock_t
    alias uint  fsblkcnt_t;
    alias uint  fsfilcnt_t;
    alias uint  id_t;
    // key_t
    alias int   suseconds_t;
    alias uint  useconds_t;
}
else version( FreeBSD )
{
    //clock_t
    alias ulong     fsblkcnt_t;
    alias ulong     fsfilcnt_t;
    alias long      id_t;
    alias c_long    key_t;
    alias c_long    suseconds_t;
    alias uint      useconds_t;
}
else version( solaris )
{
  static if( __USE_LARGEFILE64 )
  {
    alias ulong     fsblkcnt_t;
    alias ulong     fsfilcnt_t;
  }
  else
  {
    alias c_ulong   fsblkcnt_t;
    alias c_ulong   fsfilcnt_t;
  }
    // clock_t (defined in tango.stdc.time)
    alias int       id_t;
    alias int       key_t;
    alias c_long    suseconds_t;
    alias uint      useconds_t;
}

//
// Thread (THR)
//
/*
pthread_attr_t
pthread_cond_t
pthread_condattr_t
pthread_key_t
pthread_mutex_t
pthread_mutexattr_t
pthread_once_t
pthread_rwlock_t
pthread_rwlockattr_t
pthread_t
*/

version( linux )
{
    private struct __sched_param
    {
        int __sched_priority;
    }

    struct pthread_attr_t
    {
        int             __detachstate;
        int             __schedpolicy;
        __sched_param   __schedparam;
        int             __inheritsched;
        int             __scope;
        size_t          __guardsize;
        int             __stackaddr_set;
        void*           __stackaddr;
        size_t          __stacksize;
    }

    private alias int __atomic_lock_t;

    private struct _pthread_fastlock
    {
        c_long          __status;
        __atomic_lock_t __spinlock;
    }

    private alias void* _pthread_descr;

    private alias long __pthread_cond_align_t;

    struct pthread_cond_t
    {
        _pthread_fastlock       __c_lock;
        _pthread_descr          __c_waiting;
        char[48 -
             _pthread_fastlock.sizeof -
             _pthread_descr.sizeof -
             __pthread_cond_align_t.sizeof]
                                __padding;
        __pthread_cond_align_t  __align;
    }

    struct pthread_condattr_t
    {
        int __dummy;
    }

    alias uint pthread_key_t;

    struct pthread_mutex_t
    {
        int                 __m_reserved;
        int                 __m_count;
        _pthread_descr      __m_owner;
        int                 __m_kind;
        _pthread_fastlock   __m_lock;
    }

    struct pthread_mutexattr_t
    {
        int __mutexkind;
    }

    alias int pthread_once_t;

    struct pthread_rwlock_t
    {
        _pthread_fastlock   __rw_lock;
        int                 __rw_readers;
        _pthread_descr      __rw_writer;
        _pthread_descr      __rw_read_waiting;
        _pthread_descr      __rw_write_waiting;
        int                 __rw_kind;
        int                 __rw_pshared;
    }

    struct pthread_rwlockattr_t
    {
        int __lockkind;
        int __pshared;
    }

    alias c_ulong pthread_t;
}
else version( darwin )
{
    private
    {
        static if ((void*).sizeof>int.sizeof)
        {
            // version( LP64 )
            const __PTHREAD_SIZE__              = 1168;
            const __PTHREAD_ATTR_SIZE__         = 56;
            const __PTHREAD_MUTEXATTR_SIZE__    = 8;
            const __PTHREAD_MUTEX_SIZE__        = 56;
            const __PTHREAD_CONDATTR_SIZE__     = 8;
            const __PTHREAD_COND_SIZE__         = 40;
            const __PTHREAD_ONCE_SIZE__         = 8;
            const __PTHREAD_RWLOCK_SIZE__       = 192;
            const __PTHREAD_RWLOCKATTR_SIZE__   = 16;
        }
        else
        {
            const __PTHREAD_SIZE__              = 596;
            const __PTHREAD_ATTR_SIZE__         = 36;
            const __PTHREAD_MUTEXATTR_SIZE__    = 8;
            const __PTHREAD_MUTEX_SIZE__        = 40;
            const __PTHREAD_CONDATTR_SIZE__     = 4;
            const __PTHREAD_COND_SIZE__         = 24;
            const __PTHREAD_ONCE_SIZE__         = 4;
            const __PTHREAD_RWLOCK_SIZE__       = 124;
            const __PTHREAD_RWLOCKATTR_SIZE__   = 12;
        }
    }

    struct pthread_handler_rec
    {
      void function(void*)  __routine;
      void*                 __arg;
      pthread_handler_rec*  __next;
    }

    struct pthread_attr_t
    {
        c_long                              __sig;
        byte[__PTHREAD_ATTR_SIZE__]         __opaque;
    }

    struct pthread_cond_t
    {
        c_long                              __sig;
        byte[__PTHREAD_COND_SIZE__]         __opaque;
    }

    struct pthread_condattr_t
    {
        c_long                              __sig;
        byte[__PTHREAD_CONDATTR_SIZE__]     __opaque;
    }

    alias c_ulong pthread_key_t;

    struct pthread_mutex_t
    {
        c_long                              __sig;
        byte[__PTHREAD_MUTEX_SIZE__]        __opaque;
    }

    struct pthread_mutexattr_t
    {
        c_long                              __sig;
        byte[__PTHREAD_MUTEXATTR_SIZE__]    __opaque;
    }

    struct pthread_once_t
    {
        c_long                              __sig;
        byte[__PTHREAD_ONCE_SIZE__]         __opaque;
    }

    struct pthread_rwlock_t
    {
        c_long                              __sig;
        byte[__PTHREAD_RWLOCK_SIZE__]       __opaque;
    }

    struct pthread_rwlockattr_t
    {
        c_long                             __sig;
        byte[__PTHREAD_RWLOCKATTR_SIZE__]   __opaque;
    }

    private struct _opaque_pthread_t
    {
        c_long                  __sig;
        pthread_handler_rec*    __cleanup_stack;
        byte[__PTHREAD_SIZE__]  __opaque;
    }

    alias _opaque_pthread_t* pthread_t;
}
else version( FreeBSD )
{
    alias int lwpid_t;

    alias void* pthread_attr_t;
    alias void* pthread_cond_t;
    alias void* pthread_condattr_t;
    alias void* pthread_key_t;
    alias void* pthread_mutex_t;
    alias void* pthread_mutexattr_t;
    alias void* pthread_once_t;
    alias void* pthread_rwlock_t;
    alias void* pthread_rwlockattr_t;
    alias void* pthread_t;
}
else version( solaris )
{   
    struct pthread_attr_t {
        void* __pthread_attrp;
    }
    
    struct pthread_cond_t {
        struct __pthread_cond_flags {
            uint8_t[4]  __pthread_cond_flag;
            uint16_t    __pthread_cond_type;
            uint16_t    __pthread_cond_magic;
        }
        private upad64_t __pthread_cond_data;
    }
    
    struct pthread_condattr_t {
        void* __pthread_condattrp;
    }
    
    alias uint pthread_key_t;
    
    struct pthread_mutex_t {
        struct __pthread_mutex_flags {
            uint16_t    __pthread_mutex_flag1;
            uint8_t     __pthread_mutex_flag2;
            uint8_t     __pthread_mutex_ceiling;
            uint16_t    __pthread_mutex_type;
            uint16_t    __pthread_mutex_magic;
        }
        union __pthread_mutex_lock {
            struct __pthread_mutex_lock64 {
                uint8_t[8] __pthread_mutex_pad;
            }
            struct __pthread_mutex_lock32 {
                uint32_t __pthread_ownerpid;
                uint32_t __pthread_lockword;
            }
            private upad64_t __pthread_mutex_owner64;
        }
        private upad64_t __pthread_mutex_data;
    }
    
    struct pthread_mutexattr_t {
        void* __pthread_mutexattrp;
    }
    
    struct pthread_once_t {
        private upad64_t[4] __pthread_once_pad;
    }
    
    struct pthread_rwlock_t {
        int32_t     __pthread_rwlock_readers;
        uint16_t    __pthread_rwlock_type;
        uint16_t    __pthread_rwlock_magic;
        pthread_mutex_t __pthread_rwlock_mutex;
        pthread_cond_t  __pthread_rwlock_readercv;
        pthread_cond_t  __pthread_rwlock_writercv;
    }
    
    struct pthread_rwlockattr_t {
        void* __pthread_rwlockattrp;
    }
    
    alias uint pthread_t;
}

//
// Barrier (BAR)
//
/*
pthread_barrier_t
pthread_barrierattr_t
*/

version( linux )
{
    struct pthread_barrier_t
    {
        _pthread_fastlock   __ba_lock;
        int                 __ba_required;
        int                 __ba_present;
        _pthread_descr      __ba_waiting;
    }

    struct pthread_barrierattr_t
    {
        int __pshared;
    }
}
else version( darwin )
{
    // NOTE: The following definitions are Tango-specific because darwin does
    //       not support them directly.

    struct pthread_barrier_t
    {
        pthread_mutex_t b_lock;
        pthread_cond_t  b_cond;
        int             b_count;
        int             b_waiters;
        int             b_generation;
    }

    struct pthread_barrierattr_t
    {
        int             pshared;
    }
}
else version( FreeBSD )
{
    alias void* pthread_barrier_t;
    alias void* pthread_barrierattr_t;
}
else version ( solaris )
{
    struct pthread_barrier_t {
        uint32_t        __pthread_barrier_count;
        uint32_t        __pthread_barrier_current;
        upad64_t        __pthread_barrier_cycle;
        upad64_t        __pthread_barrier_reserved;
        pthread_mutex_t __pthread_barrier_lock;
        pthread_cond_t  __pthread_barrier_cond;
    }
    
    struct pthread_barrierattr_t {
        void* __pthread_barrierattrp;
    }
}

//
// Spin (SPN)
//
/*
pthread_spinlock_t
*/

version( linux )
{
    alias int pthread_spinlock_t; // volatile
}
else version( darwin )
{
    version (LDC)
        alias void* pthread_spinlock_t;
        
    else
        struct pthread_spinlock_t;
}
else version( FreeBSD )
{
    alias void* pthread_spinlock_t;
}
else version ( solaris )
{
    alias pthread_mutex_t pthread_spinlock_t;
}

//
// Timer (TMR)
//
/*
clockid_t
timer_t
*/

//
// Trace (TRC)
//
/*
trace_attr_t
trace_event_id_t
trace_event_set_t
trace_id_t
*/