1 2 /* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7 #ifndef _NXT_TYPES_H_INCLUDED_ 8 #define _NXT_TYPES_H_INCLUDED_ 9 10 11 /* 12 * nxt_int_t corresponds to the most efficient integer type, 13 * an architecture word. It is usually the long type, 14 * but on Win64 the long is int32_t, so pointer size suits better. 15 * nxt_int_t must be no less than int32_t. 16 */ 17 18 #if (__amd64__) 19 /* 20 * AMD64 64-bit multiplication and division operations 21 * are slower and 64-bit instructions are longer. 22 */ 23 #define NXT_INT_T_SIZE 4 24 typedef int nxt_int_t; 25 typedef u_int nxt_uint_t; 26 27 #else 28 #define NXT_INT_T_SIZE NXT_PTR_SIZE 29 typedef intptr_t nxt_int_t; 30 typedef uintptr_t nxt_uint_t; 31 #endif 32 33 34 typedef nxt_uint_t nxt_bool_t; 35 36 37 /* 38 * nxt_off_t corresponds to OS's off_t, a file offset type. 39 * Although Linux, Solaris, and HP-UX define both off_t and off64_t, 40 * setting _FILE_OFFSET_BITS to 64 defines off_t as off64_t. 41 */ 42 typedef off_t nxt_off_t; 43 44 45 /* 46 * nxt_time_t corresponds to OS's time_t, time in seconds. nxt_time_t is 47 * a signed integer. OS's time_t may be an integer or real-floating type, 48 * though it is usually a signed 32-bit or 64-bit integer depending on 49 * platform bit count. There are however exceptions, e.g., time_t is: 50 * 32-bit on 64-bit NetBSD prior to 6.0 version; 51 * 64-bit on 32-bit NetBSD 6.0; 52 * 32-bit on 64-bit OpenBSD; 53 * 64-bit in Linux x32 ABI; 54 * 64-bit in 32-bit Visual Studio C++ 2005. 55 */ 56 #if (NXT_QNX) 57 /* 58 * QNX defines time_t as uint32_t. 59 * Y2038 fix: "typedef int64_t nxt_time_t". 60 */ 61 typedef int32_t nxt_time_t; 62 63 #else 64 /* Y2038, if time_t is 32-bit integer. */ 65 typedef time_t nxt_time_t; 66 #endif 67 68 69 #if (NXT_PTR_SIZE == 8) 70 #define NXT_64BIT 1 71 #define NXT_32BIT 0 72 73 #else 74 #define NXT_64BIT 0 75 #define NXT_32BIT 1 76 #endif 77 78 79 #define NXT_INT64_T_LEN (sizeof("-9223372036854775808") - 1) 80 #define NXT_INT32_T_LEN (sizeof("-2147483648") - 1) 81 82 #define NXT_INT64_T_HEXLEN (sizeof("fffffffffffffffff") - 1) 83 #define NXT_INT32_T_HEXLEN (sizeof("ffffffff") - 1) 84 85 #define NXT_INT64_T_MAX 0x7fffffffffffffffLL 86 #define NXT_INT32_T_MAX 0x7fffffff 87 88 89 #if (NXT_INT_T_SIZE == 8) 90 #define NXT_INT_T_LEN NXT_INT64_T_LEN 91 #define NXT_INT_T_HEXLEN NXT_INT64_T_HEXLEN 92 #define NXT_INT_T_MAX NXT_INT64_T_MAX 93 94 #else 95 #define NXT_INT_T_LEN NXT_INT32_T_LEN 96 #define NXT_INT_T_HEXLEN NXT_INT32_T_HEXLEN 97 #define NXT_INT_T_MAX NXT_INT32_T_MAX 98 #endif 99 100 101 #if (NXT_64BIT) 102 #define NXT_ATOMIC_T_LEN NXT_INT64_T_LEN 103 #define NXT_ATOMIC_T_HEXLEN NXT_INT64_T_HEXLEN 104 #define NXT_ATOMIC_T_MAX NXT_INT64_T_MAX 105 106 #else 107 #define NXT_ATOMIC_T_LEN NXT_INT32_T_LEN 108 #define NXT_ATOMIC_T_HEXLEN NXT_INT32_T_HEXLEN 109 #define NXT_ATOMIC_T_MAX NXT_INT32_T_MAX 110 #endif 111 112 113 #if (NXT_OFF_T_SIZE == 8) 114 typedef uint64_t nxt_uoff_t; 115 #define NXT_OFF_T_LEN NXT_INT64_T_LEN 116 #define NXT_OFF_T_HEXLEN NXT_INT64_T_HEXLEN 117 #define NXT_OFF_T_MAX NXT_INT64_T_MAX 118 119 #else 120 typedef uint32_t nxt_uoff_t; 121 #define NXT_OFF_T_LEN NXT_INT32_T_LEN 122 #define NXT_OFF_T_HEXLEN NXT_INT32_T_HEXLEN 123 #define NXT_OFF_T_MAX NXT_INT32_T_MAX 124 #endif 125 126 127 #if (NXT_SIZE_T_SIZE == 8) 128 #define NXT_SIZE_T_LEN NXT_INT64_T_LEN 129 #define NXT_SIZE_T_HEXLEN NXT_INT64_T_HEXLEN 130 #define NXT_SIZE_T_MAX NXT_INT64_T_MAX 131 132 #else 133 #define NXT_SIZE_T_LEN NXT_INT32_T_LEN 134 #define NXT_SIZE_T_HEXLEN NXT_INT32_T_HEXLEN 135 #define NXT_SIZE_T_MAX NXT_INT32_T_MAX 136 #endif 137 138 139 #if (NXT_TIME_T_SIZE == 8) 140 #define NXT_TIME_T_LEN NXT_INT64_T_LEN 141 #define NXT_TIME_T_HEXLEN NXT_INT64_T_HEXLEN 142 #define NXT_TIME_T_MAX NXT_INT64_T_MAX 143 144 #else 145 #define NXT_TIME_T_LEN NXT_INT32_T_LEN 146 #define NXT_TIME_T_HEXLEN NXT_INT32_T_HEXLEN 147 #define NXT_TIME_T_MAX NXT_INT32_T_MAX 148 #endif 149 150 151 #endif /* _NXT_TYPES_H_INCLUDED_ */ 152