1 #ifndef foopulsemacrohfoo
2 #define foopulsemacrohfoo
5 This file is part of PulseAudio.
7 Copyright 2004-2006 Lennart Poettering
9 PulseAudio is free software; you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License as published
11 by the Free Software Foundation; either version 2.1 of the License,
12 or (at your option) any later version.
14 PulseAudio is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public License
20 along with PulseAudio; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
25 #include <sys/types.h>
33 #include <pulse/gccmacro.h>
36 #error "Please include config.h before including this file!"
41 #define PA_LIKELY(x) (__builtin_expect(!!(x),1))
42 #define PA_UNLIKELY(x) (__builtin_expect(!!(x),0))
44 #define PA_LIKELY(x) (x)
45 #define PA_UNLIKELY(x) (x)
49 #if defined(PAGE_SIZE)
50 #define PA_PAGE_SIZE ((size_t) PAGE_SIZE)
51 #elif defined(PAGESIZE)
52 #define PA_PAGE_SIZE ((size_t) PAGESIZE)
53 #elif defined(HAVE_SYSCONF)
54 #define PA_PAGE_SIZE ((size_t) (sysconf(_SC_PAGE_SIZE)))
56 /* Let's hope it's like x86. */
57 #define PA_PAGE_SIZE ((size_t) 4096)
60 static inline size_t pa_align(size_t l) {
61 return (((l + sizeof(void*) - 1) / sizeof(void*)) * sizeof(void*));
63 #define PA_ALIGN(x) (pa_align(x))
65 static inline void* pa_page_align_ptr(const void *p) {
66 return (void*) (((size_t) p) & ~(PA_PAGE_SIZE-1));
68 #define PA_PAGE_ALIGN_PTR(x) (pa_page_align_ptr(x))
70 static inline size_t pa_page_align(size_t l) {
71 return l & ~(PA_PAGE_SIZE-1);
73 #define PA_PAGE_ALIGN(x) (pa_page_align(x))
75 #define PA_ELEMENTSOF(x) (sizeof(x)/sizeof((x)[0]))
77 /* The users of PA_MIN and PA_MAX should be aware that these macros on
78 * non-GCC executed code with side effects twice. It is thus
79 * considered misuse to use code with side effects as arguments to MIN
84 __extension__ ({ typeof(a) _a = (a); \
89 #define PA_MAX(a, b) ((a) > (b) ? (a) : (b))
94 __extension__ ({ typeof(a) _a = (a); \
99 #define PA_MIN(a, b) ((a) < (b) ? (a) : (b))
103 #define PA_CLAMP(x, low, high) \
104 __extension__ ({ typeof(x) _x = (x); \
105 typeof(low) _low = (low); \
106 typeof(high) _high = (high); \
107 ((_x > _high) ? _high : ((_x < _low) ? _low : _x)); \
110 #define PA_CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
114 #define PA_CLAMP_UNLIKELY(x, low, high) \
115 __extension__ ({ typeof(x) _x = (x); \
116 typeof(low) _low = (low); \
117 typeof(high) _high = (high); \
118 (PA_UNLIKELY(_x > _high) ? _high : (PA_UNLIKELY(_x < _low) ? _low : _x)); \
121 #define PA_CLAMP_UNLIKELY(x, low, high) (PA_UNLIKELY((x) > (high)) ? (high) : (PA_UNLIKELY((x) < (low)) ? (low) : (x)))
124 /* We don't define a PA_CLAMP_LIKELY here, because it doesn't really
125 * make sense: we cannot know if it is more likely that the values is
126 * lower or greater than the boundaries.*/
128 /* This type is not intended to be used in exported APIs! Use classic "int" there! */
130 typedef _Bool pa_bool_t;
132 typedef int pa_bool_t;
136 #define FALSE ((pa_bool_t) 0)
140 #define TRUE (!FALSE)
144 #define PA_PRETTY_FUNCTION __PRETTY_FUNCTION__
146 #define PA_PRETTY_FUNCTION ""
149 #define pa_return_if_fail(expr) \
151 if (PA_UNLIKELY(!(expr))) { \
152 pa_log_debug("Assertion '%s' failed at %s:%u, function %s.\n", #expr , __FILE__, __LINE__, PA_PRETTY_FUNCTION); \
157 #define pa_return_val_if_fail(expr, val) \
159 if (PA_UNLIKELY(!(expr))) { \
160 pa_log_debug("Assertion '%s' failed at %s:%u, function %s.\n", #expr , __FILE__, __LINE__, PA_PRETTY_FUNCTION); \
165 #define pa_return_null_if_fail(expr) pa_return_val_if_fail(expr, NULL)
167 /* An assert which guarantees side effects of x, i.e. is never
169 #define pa_assert_se(expr) \
171 if (PA_UNLIKELY(!(expr))) { \
172 pa_log_error("Assertion '%s' failed at %s:%u, function %s(). Aborting.", #expr , __FILE__, __LINE__, PA_PRETTY_FUNCTION); \
177 /* An assert that may be optimized away by defining NDEBUG */
179 #define pa_assert(expr) do {} while (FALSE)
181 #define pa_assert(expr) pa_assert_se(expr)
184 #define pa_assert_not_reached() \
186 pa_log_error("Code should not be reached at %s:%u, function %s(). Aborting.", __FILE__, __LINE__, PA_PRETTY_FUNCTION); \
190 #define PA_PTR_TO_UINT(p) ((unsigned int) ((uintptr_t) (p)))
191 #define PA_UINT_TO_PTR(u) ((void*) ((uintptr_t) (u)))
193 #define PA_PTR_TO_UINT32(p) ((uint32_t) ((uintptr_t) (p)))
194 #define PA_UINT32_TO_PTR(u) ((void*) ((uintptr_t) (u)))
196 #define PA_PTR_TO_INT(p) ((int) ((intptr_t) (p)))
197 #define PA_INT_TO_PTR(u) ((void*) ((intptr_t) (u)))
199 #define PA_PTR_TO_INT32(p) ((int32_t) ((intptr_t) (p)))
200 #define PA_INT32_TO_PTR(u) ((void*) ((intptr_t) (u)))
203 #define PA_PATH_SEP "\\"
204 #define PA_PATH_SEP_CHAR '\\'
206 #define PA_PATH_SEP "/"
207 #define PA_PATH_SEP_CHAR '/'
210 #if defined(__GNUC__) && defined(__ELF__)
212 #define PA_WARN_REFERENCE(sym, msg) \
213 __asm__(".section .gnu.warning." #sym); \
214 __asm__(".asciz \"" msg "\""); \
219 #define PA_WARN_REFERENCE(sym, msg)
223 #if defined(__i386__) || defined(__x86_64__)
224 #define PA_DEBUG_TRAP __asm__("int $3")
226 #define PA_DEBUG_TRAP raise(SIGTRAP)
229 /* We include this at the very last place */
230 #include <pulsecore/log.h>