/** Copyright 2007-2014 Haiku, Inc. All rights reserved.* Distributed under the terms of the MIT License.** Authors:* Niels Sascha Reedijk, niels.reedijk@gmail.com* John Scipione, jscipione@gmail.com** Corresponds to:* headers/os/support/SupportDefs.h hrev54953*//*!\file SupportDefs.h\ingroup support\ingroup libbe\brief Defines basic types and definitions for the Haiku API.*//*!\name Fixed-Size Integer Types*///! @{/*!\typedef typedef __haiku_int8 int8\brief 1-byte signed integer.*//*!\typedef typedef __haiku_uint8 uint8\brief 1-byte unsigned integer.*//*!\typedef typedef __haiku_int16 int16\brief 2-bytes signed integer.*//*!\typedef typedef __haiku_uint16 uint16\brief 2-bytes unsigned integer.*//*!\typedef typedef __haiku_int32 int32\brief 4-bytes signed integer.*//*!\typedef typedef __haiku_uint32 uint32\brief 4-bytes unsigned integer.*//*!\typedef typedef __haiku_int64 int64\brief 8-bytes signed integer.*//*!\typedef typedef __haiku_uint64 uint64\brief 8-bytes unsigned integer.*///! @}/*!\name Fixed-size Volatile Types*///! @{/*!\typedef typedef volatile int8 vint8\brief 1-byte volatile signed integer.*//*!\typedef typedef volatile uint8 vuint8\brief 1-byte volatile unsigned integer.*//*!\typedef typedef volatile int16 vint16\brief 2-bytes volatile signed integer.*//*!\typedef typedef volatile uint16 vuint16\brief 2-bytes volatile unsigned integer.*//*!\typedef typedef volatile int32 vint32\brief 4-bytes volatile signed integer.*//*!\typedef typedef volatile uint32 vuint32\brief 4-bytes volatile unsigned integer.*//*!\typedef typedef volatile int64 vint64\brief 8-bytes volatile signed integer.*//*!\typedef typedef volatile uint64 vuint64\brief 8-bytes volatile unsigned integer.*///! @}/*!\name Short-hand Volatile Type Names*///! @{/*!\typedef typedef volatile long vlong\brief Volatile signed long.*//*!\typedef typedef volatile int vint\brief Volatile signed int.*//*!\typedef typedef volatile short vshort\brief Volatile signed short.*//*!\typedef typedef volatile char vchar\brief Volatile signed char.*//*!\typedef typedef volatile unsigned long vulong\brief Volatile unsigned long.*//*!\typedef typedef volatile unsigned int vuint\brief Volatile unsigned int.*//*!\typedef typedef volatile unsigned short vushort\brief Volatile unsigned short.*//*!\typedef typedef volatile unsigned char vuchar\brief Volatile unsigned char.*///! @}/*!\name Character Type Formats*///! @{/*!\typedef typedef unsigned char uchar\brief Unsigned 1-byte wide character.*///! @}/*!\name Descriptive Type Formats*///! @{/*!\typedef typedef int32 status_t\brief Represents one of the status codes defined in Errors.h.\since BeOS R3*//*!\typedef typedef int64 bigtime_t\brief Represents time in microseconds.\since BeOS R3*//*!\typedef typedef int64 nanotime_t\brief Represents time in nanoseconds.*//*!\typedef typedef uint32 type_code\brief Represents a certain type of data. See TypeConstants.h forpossible values.\since Haiku R1*//*!\typedef typedef uint32 perform_code\brief Defined to support 'hidden' commands or extensions to classes.The Haiku API has none of these.\since Haiku R1*//*!\typedef typedef __haiku_phys_addr_t phys_addr_t\brief Represents a physical address.This has the length of 4 bytes on a 32 bit platform, and 8 bytes on a 64bit platform.\since Haiku R1*//*!\typedef typedef phys_addr_t phys_size_t\brief Represents a size of physical memory.This has the length of 4 bytes on a 32 bit platform, and 8 bytes on a 64bit platform.\since Haiku R1*//*!\typedef typedef __haiku_generic_addr_t generic_addr_t\brief Represents a generic address.A generic address is wide enough to store both physical and virtualaddresses.\since Haiku R1*//*!\typedef typedef generic_addr_t generic_size_t\brief Represents a size of generic memory.A generic address is wide enough to store both physical and virtualaddresses.\since Haiku R1*///! @}/*!\name Format strings for printf() and scanf() for integer types*///! @{/*!\def B_PRId8\brief printf() constant for i8 as decimal*//*!\def B_PRIi8\brief printf() constant for i8 as decimal*//*!\def B_PRId16\brief printf() constant for i16 as decimal*//*!\def B_PRIi16\brief printf() constant for i16 as decimal*//*!\def B_PRId32\brief printf() constant for i32 as decimal*//*!\def B_PRIi32\brief printf() constant for i32 as decimal*//*!\def B_PRId64\brief printf() constant for i64 as decimal*//*!\def B_PRIi64\brief printf() constant for i64 as decimal*//*!\def B_PRIu8\brief printf() constant for u8 as decimal*//*!\def B_PRIo8\brief printf() constant for u8 as octal*//*!\def B_PRIx8\brief printf() constant for u8 as lowercase hexadecimal*//*!\def B_PRIX8\brief printf() constant for u8 as uppercase hexadecimal*//*!\def B_PRIu16\brief printf() constant for u16 as decimal*//*!\def B_PRIo16\brief printf() constant for u16 as octal*//*!\def B_PRIx16\brief printf() constant for u16 as lowercase hexadecimal*//*!\def B_PRIX16\brief printf() constant for u16 as uppercase hexadecimal*//*!\def B_PRIu32\brief printf() constant for u32 as decimal*//*!\def B_PRIo32\brief printf() constant for u32 as octal*//*!\def B_PRIx32\brief printf() constant for u32 as lowercase hexadecimal*//*!\def B_PRIX32\brief printf() constant for u32 as uppercase hexadecimal*//*!\def B_PRIu64\brief printf() constant for u64 as decimal*//*!\def B_PRIo64\brief printf() constant for u64 as octal*//*!\def B_PRIx64\brief printf() constant for u64 as lowercase hexadecimal*//*!\def B_PRIX64\brief printf() constant for u64 as uppercase hexadecimal*//*!\def B_SCNd8\brief scanf() constant for i8 as decimal*//*!\def B_SCNi8\brief scanf() constant for i8 as decimal, octal or hexadecimal*//*!\def B_SCNd16\brief scanf() constant for i16 as decimal*//*!\def B_SCNi16\brief scanf() constant for i16 as decimal, octal or hexadecimal*//*!\def B_SCNd32\brief scanf() constant for i32 as decimal*//*!\def B_SCNi32\brief scanf() constant for i32 as decimal, octal or hexadecimal*//*!\def B_SCNd64\brief scanf() constant for i64 as decimal*//*!\def B_SCNi64\brief scanf() constant for i64 as decimal, octal or hexadecimal*//*!\def B_SCNu8\brief scanf() constant for u8 as decimal*//*!\def B_SCNo8\brief scanf() constant for u8 as decimal, octal or hexadecimal*//*!\def B_SCNx8\brief scanf() constant for u8 as hexadecimal*//*!\def B_SCNu16\brief scanf() constant for u16 as decimal*//*!\def B_SCNo16\brief scanf() constant for u16 as decimal, octal or hexadecimal*//*!\def B_SCNx16\brief scanf() constant for u16 as hexadecimal*//*!\def B_SCNu32\brief scanf() constant for u32 as decimal*//*!\def B_SCNo32\brief scanf() constant for u32 as decimal, octal or hexadecimal*//*!\def B_SCNx32\brief scanf() constant for u32 as hexadecimal*//*!\def B_SCNu64\brief scanf() constant for u64 as decimal*//*!\def B_SCNo64\brief scanf() constant for u64 as decimal, octal or hexadecimal*//*!\def B_SCNx64\brief scanf() constant for u64 as hexadecimal*///! @}/*!\name Format strings for several standard types*///! @{/*!\def B_PRIuSIZE\brief printf() constant for size_t as decimal*//*!\def B_PRIoSIZE\brief printf() constant for size_t as octal*//*!\def B_PRIxSIZE\brief printf() constant for size_t as lowercase hexadecimal*//*!\def B_PRIXSIZE\brief printf() constant for size_t as uppercase hexadecimal*//*!\def B_SCNuSIZE\brief scanf() constant for size_t as decimal*//*!\def B_SCNoSIZE\brief scanf() constant for size_t as decimal, octal or hexadecimal*//*!\def B_SCNxSIZE\brief scanf() constant for size_t as hexadecimal*//*!\def B_PRIdSSIZE\brief printf() constant for ssize_t as decimal*//*!\def B_PRIiSSIZE\brief printf() constant for ssize_t as decimal*//*!\def B_SCNdSSIZE\brief scanf() constant for ssize_t as decimal*//*!\def B_SCNiSSIZE\brief scanf() constant for ssize_t as decimal, octal or hexadecimal*//*!\def B_PRIuADDR\brief printf() constant for addr_t as decimal*//*!\def B_PRIoADDR\brief printf() constant for addr_t as octal*//*!\def B_PRIxADDR\brief printf() constant for addr_t as lowercase hexadecimal*//*!\def B_PRIXADDR\brief printf() constant for addr_t as uppercase hexadecimal*//*!\def B_SCNuADDR\brief scanf() constant for addr_t as decimal*//*!\def B_SCNoADDR\brief scanf() constant for addr_t as decimal, octal or hexadecimal*//*!\def B_SCNxADDR\brief scanf() constant for addr_t as hexadecimal*//*!\def B_PRIuPHYSADDR\brief printf() constant for phys_addr_t as decimal*//*!\def B_PRIoPHYSADDR\brief printf() constant for phys_addr_t as octal*//*!\def B_PRIxPHYSADDR\brief printf() constant for phys_addr_t as lowercase hexadecimal*//*!\def B_PRIXPHYSADDR\brief printf() constant for phys_addr_t as uppercase hexadecimal*//*!\def B_SCNuPHYSADDR\brief scanf() constant for phys_addr_t as decimal*//*!\def B_SCNoPHYSADDR\brief scanf() constant for phys_addr_t as decimal, octal or hexadecimal*//*!\def B_SCNxPHYSADDR\brief scanf() constant for phys_addr_t as hexadecimal*//*!\def B_PRIuGENADDR\brief printf() constant for generic_addr_t as decimal*//*!\def B_PRIoGENADDR\brief printf() constant for generic_addr_t as octal*//*!\def B_PRIxGENADDR\brief printf() constant for generic_addr_t as lowercase hexadecimal*//*!\def B_PRIXGENADDR\brief printf() constant for generic_addr_t as uppercase hexadecimal*//*!\def B_SCNuGENADDR\brief scanf() constant for generic_addr_t as decimal*//*!\def B_SCNoGENADDR\brief scanf() constant for generic_addr_t as decimal, octal or hexadecimal*//*!\def B_SCNxGENADDR\brief scanf() constant for generic_addr_t as hexadecimal*//*!\def B_PRIdOFF\brief printf() constant for off_t as decimal*//*!\def B_PRIiOFF\brief printf() constant for off_t as decimal*//*!\def B_PRIxOFF\brief printf() constant for off_t as lowercase hexadecimal*//*!\def B_SCNdOFF\brief scanf() constant for off_t as decimal*//*!\def B_SCNiOFF\brief scanf() constant for off_t as decimal, octal or hexadecimal*//*!\def B_SCNxOFF\brief scanf() constant for off_t as octal*//*!\def B_PRIdDEV\brief printf() constant for dev_t as decimal*//*!\def B_PRIiDEV\brief printf() constant for dev_t as decimal*//*!\def B_PRIdINO\brief printf() constant for ino_t as decimal*//*!\def B_PRIiINO\brief printf() constant for ino_t as decimal*//*!\def B_PRIdTIME\brief printf() constant for time_t as decimal*//*!\def B_PRIiTIME\brief printf() constant for time_t as decimal*//*!\def B_PRIdBIGTIME\brief printf() constant for bigtime_t as decimal*//*!\def B_PRIiBIGTIME\brief printf() constant for bigtime_t as decimal*//*!\def B_PRINTF_POINTER_WIDTH\brief printf() argument for printed width of a pointer with the %p format(minus 0x prefix).*///! @}//////////////// Odds and ends/*!\var const char* B_EMPTY_STRING\brief Defines an empty string. Currently defined as the string "".\since BeOS R3*//*!\def min_c(a,b)\brief Returns the minimum of the values a and b.\note When including this header in a C file, use the C equivalent called\c min(a,b).\since Haiku R1*//*!\def max_c(a,b)\brief Returns the maximum of values a and b.\note When including this header in a C file, use the C equivalent called\c max(a,b).\since Haiku R1*//*!\def NULL\brief Defines the constant \c NULL if it hasn't already been defined.\since BeOS R3*//*!\def B_COUNT_OF(a)\brief Count items in an array.Set to (sizeof(a) / sizeof(a[0])).\since Haiku R1*//*!\addtogroup support_globals*///! @{/*!\fn void atomic_set(int32* value, int32 newValue)\brief Atomically set the variable \a value to \a newvalue.This is a thread-safe way of performing the \c *value \c = \c newValueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case. The variable must be naturally aligned.\sa atomic_set64() for a version that works on \c long \c long.\sa atomic_test_and_set()\sa atomic_add()\sa atomic_and()\sa atomic_or(),\sa atomic_get()\since Haiku R1*//*! \fn int32 atomic_get_and_set(int32* value, int32 newValue)\brief Atomically set the variable \a value to \a newvalue and return theold value.This is a thread-safe way of performing the \c *value \c = \c newValueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case.\return The original value of \c value.\sa atomic_get_and_set64() for a version that works on \c long \c long.\sa atomic_set()\sa atomic_test_and_set()\sa atomic_add()\sa atomic_and()\sa atomic_or(),\sa atomic_get()\since Haiku R1*//*! \fn int32 atomic_test_and_set(int32* value, int32 newValue,int32 testAgainst)\brief Atomically set the variable \a value to \a newValue if the currentvalue is \a testAgainst.This is a thread-safe way of conditionally performing the \c *value \c +=\c newValue operation. You should use these function when two or morethreads might access the variable simultaneously. You don't have to usea semaphore or a mutex in this case.\return The original value of \c value.\sa atomic_test_and_set64() for a version that works on \c long \c long.\sa atomic_get_and_set()\sa atomic_set()\sa atomic_add()\sa atomic_and()\sa atomic_or()\sa atomic_get()\since Haiku R1*//*!\fn int32 atomic_add(int32* value, int32 addValue)\brief Atomically add the value of \a addValue to \a value.This is a thread-safe way of performing the \c *value \c += \c addValueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case.\return The original value of \c value.\sa atomic_add64() for a version that works on \c long \c long.\sa atomic_get_and_set()\sa atomic_set()\sa atomic_test_and_set()\sa atomic_and()\sa atomic_or()\sa atomic_get()\since BeOS R3*//*! \fn int32 atomic_and(int32* value, int32 andValue)\brief Atomically perform a bitwise AND operation of \a andValue to thevariable \a andValue.This is a thread-safe way of performing the \c *value \c &= \c andValueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case.\return The original value of \c value.\sa atomic_and64() for a version that works on \c long \c long.\sa atomic_get_and_set()\sa atomic_set()\sa atomic_test_and_set()\sa atomic_add()\sa atomic_or()\sa atomic_get()\since BeOS R3*//*!\fn int32 atomic_or(int32* value, int32 orValue)\brief Atomically perform a bitwise OR operation of \a orValue to thevariable \a andValue.This is a thread-safe way of performing the \c *value \c |= \c orValueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case.\return The original value of \c value.\sa atomic_or64() for a version that works on \c long \c long.\sa atomic_get_and_set()\sa atomic_set()\sa atomic_test_and_set()\sa atomic_add()\sa atomic_and()\sa atomic_get()\since BeOS R3*//*!\fn int32 atomic_get(int32* value)\brief Atomically return the value of \c value.This is a thread-safe way of reading the contents of the \c valueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case. The variable must be naturally aligned.\return The original value of \c value.\sa atomic_get64() for a version that works on \c long \c long.\sa atomic_get_and_set()\sa atomic_set()\sa atomic_test_and_set()\sa atomic_add()\sa atomic_and()\sa atomic_or()\since Haiku R1*//*!\fn void atomic_set64(int64* value, int64 newValue)\brief Atomically set the variable \a value to \a newvalue.This is a thread-safe way of performing the \c *value \c = \c newValueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case. The variable must be naturally aligned.\sa atomic_set() for a version that works on an \c int32.\sa atomic_get_and_set64()\sa atomic_test_and_set64()\sa atomic_add64()\sa atomic_and64()\sa atomic_or64()\sa atomic_get64()\since Haiku R1*//*!\fn int64 atomic_get_and_set64(int64* value, int64 newValue)\brief Atomically set the variable \a value to \a newvalue and returnthe old value.This is a thread-safe way of performing the \c *value \c = \c newValueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case.\return The original value of \c value.\sa atomic_get_and_set() for a version that works on an \c int32.\sa atomic_set64()\sa atomic_test_and_set64()\sa atomic_add64()\sa atomic_and64()\sa atomic_or64()\sa atomic_get64()\since Haiku R1*//*!\fn int64 atomic_test_and_set64(int64* value, int64 newValue,int64 testAgainst)\brief Atomically set the variable \a value to \a newValue if the currentvalue is \a testAgainst.This is a thread-safe way of conditionally performing the \c *value\c += \c newValue operation. You should use these function when twoor more threads might access the variable simultaneously. You don'thave to use a semaphore or a mutex in this case.\return The original value of \c value.\sa atomic_test_and_set() for a version that works on an \c int32.\sa atomic_get_and_set64()\sa atomic_set64()\sa atomic_add64()\sa atomic_and64()\sa atomic_or64()\sa atomic_get64()\since Haiku R1*//*!\fn int64 atomic_add64(int64* value, int64 addValue)\brief Atomically add the value of \a addValue to \a value.This is a thread-safe way of performing the \c *value \c += \c addValueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case.\return The original value of \c value.\sa atomic_add() for a version that works on an \c int32.\sa atomic_get_and_set64()\sa atomic_set64()\sa atomic_test_and_set64()\sa atomic_and64()\sa atomic_or64()\sa atomic_get64()\since Haiku R1*//*!\fn int64 atomic_and64(int64* value, int64 andValue)\brief Atomically perform a bitwise AND operation of \a andValue to thevariable \a andValue.This is a thread-safe way of performing the \c *value \c &= \c andValueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case.\return The original value of \c value.\sa atomic_and() for a version that works on an \c int32.\sa atomic_get_and_set64()\sa atomic_set64()\sa atomic_test_and_set64()\sa atomic_add64()\sa atomic_or64()\sa atomic_get64()\since Haiku R1*//*!\fn int64 atomic_or64(int64* value, int64 orValue)\brief Atomically perform a bitwise OR operation of \a orValue to thevariable \a andValue.This is a thread-safe way of performing the \c *value \c |= \c orValueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case.\return The original value of \c value.\sa atomic_or() for a version that works on an \c int32.\sa atomic_get_and_set64()\sa atomic_set64()\sa atomic_test_and_set64()\sa atomic_add64()\sa atomic_and64()\sa atomic_get64()\since Haiku R1*//*!\fn int64 atomic_get64(int64* value)\brief Atomically return the value of \c value.This is a thread-safe way of reading the contents of the \c valueoperation. You should use these function when two or more threads mightaccess the variable simultaneously. You don't have to use a semaphore or amutex in this case. The variable must be naturally aligned.\return The original value of \c value.\sa atomic_get() for a version that works on an \c int32.\sa atomic_get_and_set64()\sa atomic_set64()\sa atomic_test_and_set64()\sa atomic_add64()\sa atomic_and64()\sa atomic_or64()\since Haiku R1*///! @}/*!\fn void* get_stack_frame(void)\brief Internal function.\internal*//*!\name Deprecated defines*///! @{/*!\def FALSE\brief Obsolete. Use \c false.\since BeOS R3*//*!\def TRUE\brief Obsolete. Use \c true.\since BeOS R3*///! @}