macro.h revision 3b63d2d31d0850bd7a81ab9b468218d2c4c461e8
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#ifndef foomacrohfoo
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define foomacrohfoo
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering/***
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering This file is part of systemd.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering Copyright 2010 Lennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering systemd is free software; you can redistribute it and/or modify it
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering under the terms of the GNU General Public License as published by
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering the Free Software Foundation; either version 2 of the License, or
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering (at your option) any later version.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering systemd is distributed in the hope that it will be useful, but
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering General Public License for more details.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering You should have received a copy of the GNU General Public License
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering***/
1693a943ca581aca2beebb4c812ec6c9f17b8164Lennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include <assert.h>
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include <sys/types.h>
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include <sys/uio.h>
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen#include <inttypes.h>
914d6c09f1a449c60c8495c179a8bbe012315ba2Tom Gundersen
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define PAGE_SIZE 4096
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define _printf_attr_(a,b) __attribute__ ((format (printf, a, b)))
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define _sentinel_ __attribute__ ((sentinel))
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define _noreturn_ __attribute__((noreturn))
49699bac94d24b444274f91f85c82e6fad04d029Susant Sahani#define _unused_ __attribute__ ((unused))
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define _destructor_ __attribute__ ((destructor))
914d6c09f1a449c60c8495c179a8bbe012315ba2Tom Gundersen#define _pure_ __attribute__ ((pure))
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen#define _const_ __attribute__ ((const))
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define _deprecated_ __attribute__ ((deprecated))
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define _packed_ __attribute__ ((packed))
db73295accbec0c6513817f0a64a92018592bb26Lennart Poettering#define _malloc_ __attribute__ ((malloc))
d8500c53789eafefe28d4ace088bf4b912280bf9Tom Gundersen#define _weak_ __attribute__ ((weak))
266b538958932e6fc27dfce4917336e70e17e29eTom Gundersen#define _likely_(x) (__builtin_expect(!!(x),1))
288a74cce597f81d3ba01d8a5ca7d2ba5b654b7eRonny Chevalier#define _unlikely_(x) (__builtin_expect(!!(x),0))
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define _public_ __attribute__ ((visibility("default")))
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define _hidden_ __attribute__ ((visibility("hidden")))
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define _weakref_(x) __attribute__((weakref(#x)))
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering/* Rounds up */
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic inline size_t ALIGN(size_t l) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return ((l + sizeof(void*) - 1) & ~(sizeof(void*) - 1));
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering}
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic inline size_t PAGE_ALIGN(size_t l) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return ((l + PAGE_SIZE - 1) & ~(PAGE_SIZE -1));
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering}
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
914d6c09f1a449c60c8495c179a8bbe012315ba2Tom Gundersen#define ELEMENTSOF(x) (sizeof(x)/sizeof((x)[0]))
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#ifndef MAX
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define MAX(a,b) \
914d6c09f1a449c60c8495c179a8bbe012315ba2Tom Gundersen __extension__ ({ \
914d6c09f1a449c60c8495c179a8bbe012315ba2Tom Gundersen typeof(a) _a = (a); \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering typeof(b) _b = (b); \
732b7f39a2b3b1a2af90102c6262186ae71197acRonny Chevalier _a > _b ? _a : _b; \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering })
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#endif
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define MAX3(a,b,c) \
914d6c09f1a449c60c8495c179a8bbe012315ba2Tom Gundersen MAX(MAX(a,b),c)
914d6c09f1a449c60c8495c179a8bbe012315ba2Tom Gundersen
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#ifndef MIN
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define MIN(a,b) \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering __extension__ ({ \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering typeof(a) _a = (a); \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering typeof(b) _b = (b); \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering _a < _b ? _a : _b; \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering })
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#endif
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define MIN3(a,b,c) \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering MIN(MIN(a,b),c)
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define CLAMP(x, low, high) \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering __extension__ ({ \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering typeof(x) _x = (x); \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering typeof(low) _low = (low); \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering typeof(high) _high = (high); \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering ((_x > _high) ? _high : ((_x < _low) ? _low : _x)); \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering })
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#define assert_se(expr) \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering do { \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (_unlikely_(!(expr))) \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering log_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering "Assertion '%s' failed at %s:%u, function %s(). Aborting.", \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering #expr , __FILE__, __LINE__, __PRETTY_FUNCTION__); \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering } while (false) \
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering/* We override the glibc assert() here. */
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#undef assert
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#ifdef NDEBUG
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define assert(expr) do {} while(false)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#else
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define assert(expr) assert_se(expr)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#endif
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define assert_not_reached(t) \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering do { \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering log_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering "Code should not be reached '%s' at %s:%u, function %s(). Aborting.", \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering t, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering } while (false)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define assert_cc(expr) \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering do { \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering switch (0) { \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering case 0: \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering case !!(expr): \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering ; \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering } \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering } while (false)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define PTR_TO_UINT(p) ((unsigned int) ((uintptr_t) (p)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define UINT_TO_PTR(u) ((void*) ((uintptr_t) (u)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define PTR_TO_UINT32(p) ((uint32_t) ((uintptr_t) (p)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define UINT32_TO_PTR(u) ((void*) ((uintptr_t) (u)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define PTR_TO_ULONG(p) ((unsigned long) ((uintptr_t) (p)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define ULONG_TO_PTR(u) ((void*) ((uintptr_t) (u)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define PTR_TO_INT(p) ((int) ((intptr_t) (p)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define INT_TO_PTR(u) ((void*) ((intptr_t) (u)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define TO_INT32(p) ((int32_t) ((intptr_t) (p)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define INT32_TO_PTR(u) ((void*) ((intptr_t) (u)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define PTR_TO_LONG(p) ((long) ((intptr_t) (p)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define LONG_TO_PTR(u) ((void*) ((intptr_t) (u)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define memzero(x,l) (memset((x), 0, (l)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define zero(x) (memzero(&(x), sizeof(x)))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define char_array_0(x) x[sizeof(x)-1] = 0;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering#define IOVEC_SET_STRING(i, s) \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering do { \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering struct iovec *_i = &(i); \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering char *_s = (char *)(s); \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering _i->iov_base = _s; \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering _i->iov_len = strlen(_s); \
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering } while(false);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
a6a4f528899b1dab47408733b4a423c66ea40f7aThomas Hindoe Paaboel Andersenstatic inline size_t IOVEC_TOTAL_SIZE(const struct iovec *i, unsigned n) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering unsigned j;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering size_t r = 0;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering for (j = 0; j < n; j++)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r += i[j].iov_len;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering return r;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering}
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poetteringstatic inline size_t IOVEC_INCREMENT(struct iovec *i, unsigned n, size_t k) {
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering unsigned j;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering for (j = 0; j < n; j++) {
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering size_t sub;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering if (_unlikely_(k <= 0))
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering break;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering sub = MIN(i[j].iov_len, k);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering i[j].iov_len -= sub;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering i[j].iov_base = (uint8_t*) i[j].iov_base + sub;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering k -= sub;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering }
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering return k;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering}
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering#include "log.h"
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering#endif
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering