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, see <http://www.gnu.org/licenses/>.
23 #include <sys/types.h>
34 #error "Please include config.h before including this file!"
38 static inline void* PA_ALIGN_PTR(const void *p) {
39 return (void*) (((size_t) p) & ~(sizeof(void*) - 1));
43 static inline size_t PA_ALIGN(size_t l) {
44 return ((l + sizeof(void*) - 1) & ~(sizeof(void*) - 1));
48 #define PA_UNUSED __attribute__ ((unused))
53 #define PA_ELEMENTSOF(x) (sizeof(x)/sizeof((x)[0]))
56 #define PA_DECLARE_ALIGNED(n,t,v) t v __attribute__ ((aligned (n)))
58 #define PA_DECLARE_ALIGNED(n,t,v) t v
62 #define typeof __typeof__
65 /* The users of PA_MIN and PA_MAX, PA_CLAMP, PA_ROUND_UP should be
66 * aware that these macros on non-GCC executed code with side effects
67 * twice. It is thus considered misuse to use code with side effects
68 * as arguments to MIN and MAX. */
78 #define PA_MAX(a, b) ((a) > (b) ? (a) : (b))
89 #define PA_MIN(a, b) ((a) < (b) ? (a) : (b))
93 #define PA_ROUND_UP(a, b) \
97 ((_a + _b - 1) / _b) * _b; \
100 #define PA_ROUND_UP(a, b) ((((a) + (b) - 1) / (b)) * (b))
104 #define PA_ROUND_DOWN(a, b) \
106 typeof(a) _a = (a); \
107 typeof(b) _b = (b); \
111 #define PA_ROUND_DOWN(a, b) (((a) / (b)) * (b))
115 #define PA_CLIP_SUB(a, b) \
117 typeof(a) _a = (a); \
118 typeof(b) _b = (b); \
119 _a > _b ? _a - _b : 0; \
122 #define PA_CLIP_SUB(a, b) ((a) > (b) ? (a) - (b) : 0)
126 #define PA_PRETTY_FUNCTION __PRETTY_FUNCTION__
128 #define PA_PRETTY_FUNCTION ""
131 #define pa_return_if_fail(expr) \
133 if (PA_UNLIKELY(!(expr))) { \
134 pa_log_debug("Assertion '%s' failed at %s:%u, function %s.", #expr , __FILE__, __LINE__, PA_PRETTY_FUNCTION); \
139 #define pa_return_val_if_fail(expr, val) \
141 if (PA_UNLIKELY(!(expr))) { \
142 pa_log_debug("Assertion '%s' failed at %s:%u, function %s.", #expr , __FILE__, __LINE__, PA_PRETTY_FUNCTION); \
147 #define pa_return_null_if_fail(expr) pa_return_val_if_fail(expr, NULL)
149 /* pa_assert_se() is an assert which guarantees side effects of x,
150 * i.e. is never optimized away, regardless of NDEBUG or FASTPATH. */
152 #define pa_assert_se(expr) \
154 if (PA_UNLIKELY(!(expr))) { \
155 pa_log_error("Assertion '%s' failed at %s:%u, function %s(). Aborting.", #expr , __FILE__, __LINE__, PA_PRETTY_FUNCTION); \
160 #define pa_assert_se(expr) \
162 int _unique_var = (expr); \
168 /* Does exactly nothing */
169 #define pa_nop() do {} while (false)
171 /* pa_assert() is an assert that may be optimized away by defining
172 * NDEBUG. pa_assert_fp() is an assert that may be optimized away by
173 * defining FASTPATH. It is supposed to be used in inner loops. It's
174 * there for extra paranoia checking and should probably be removed in
175 * production builds. */
177 #define pa_assert(expr) pa_nop()
178 #define pa_assert_fp(expr) pa_nop()
179 #elif defined (FASTPATH)
180 #define pa_assert(expr) pa_assert_se(expr)
181 #define pa_assert_fp(expr) pa_nop()
183 #define pa_assert(expr) pa_assert_se(expr)
184 #define pa_assert_fp(expr) pa_assert_se(expr)
188 #define pa_assert_not_reached() abort()
190 #define pa_assert_not_reached() \
192 pa_log_error("Code should not be reached at %s:%u, function %s(). Aborting.", __FILE__, __LINE__, PA_PRETTY_FUNCTION); \
197 /* A compile time assertion */
198 #define pa_assert_cc(expr) \
207 #define PA_PTR_TO_UINT(p) ((unsigned int) ((uintptr_t) (p)))
208 #define PA_UINT_TO_PTR(u) ((void*) ((uintptr_t) (u)))
210 #define PA_PTR_TO_UINT32(p) ((uint32_t) ((uintptr_t) (p)))
211 #define PA_UINT32_TO_PTR(u) ((void*) ((uintptr_t) (u)))
213 #define PA_PTR_TO_INT(p) ((int) ((intptr_t) (p)))
214 #define PA_INT_TO_PTR(u) ((void*) ((intptr_t) (u)))
216 #define PA_PTR_TO_INT32(p) ((int32_t) ((intptr_t) (p)))
217 #define PA_INT32_TO_PTR(u) ((void*) ((intptr_t) (u)))
220 #define PA_PATH_SEP "\\"
221 #define PA_PATH_SEP_CHAR '\\'
223 #define PA_PATH_SEP "/"
224 #define PA_PATH_SEP_CHAR '/'
227 #if defined(__GNUC__) && defined(__ELF__)
229 #define PA_WARN_REFERENCE(sym, msg) \
230 __asm__(".section .gnu.warning." #sym); \
231 __asm__(".asciz \"" msg "\""); \
236 #define PA_WARN_REFERENCE(sym, msg)
240 #if defined(__i386__) || defined(__x86_64__)
241 #define PA_DEBUG_TRAP __asm__("int $3")
243 #define PA_DEBUG_TRAP raise(SIGTRAP)
246 #define pa_memzero(x,l) (memset((x), 0, (l)))
247 #define pa_zero(x) (pa_memzero(&(x), sizeof(x)))
249 #define PA_INT_TYPE_SIGNED(type) (!!((type) 0 > (type) -1))
251 #define PA_INT_TYPE_HALF(type) ((type) 1 << (sizeof(type)*8 - 2))
253 #define PA_INT_TYPE_MAX(type) \
254 ((type) (PA_INT_TYPE_SIGNED(type) \
255 ? (PA_INT_TYPE_HALF(type) - 1 + PA_INT_TYPE_HALF(type)) \
258 #define PA_INT_TYPE_MIN(type) \
259 ((type) (PA_INT_TYPE_SIGNED(type) \
260 ? (-1 - PA_INT_TYPE_MAX(type)) \
263 /* The '#' preprocessor operator doesn't expand any macros that are in the
264 * parameter, which is why we need a separate macro for those cases where the
265 * parameter contains a macro that needs expanding. */
266 #define PA_STRINGIZE(x) #x
267 #define PA_EXPAND_AND_STRINGIZE(x) PA_STRINGIZE(x)
269 /* We include this at the very last place */
270 #include <pulsecore/log.h>