X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;ds=sidebyside;f=include%2Flttng%2Falign.h;h=3f43a3b4d8beb5a02e0c908e9a969ea8f26fabbd;hb=b72687b85f4f07a9b63be329ad1fe95b36d24900;hp=94d0d6e3f3adb02ae03524f245e70d85ac1bfb53;hpb=a60d70e608a727038ebc27e493aac65b49932146;p=lttng-ust.git diff --git a/include/lttng/align.h b/include/lttng/align.h index 94d0d6e3..3f43a3b4 100644 --- a/include/lttng/align.h +++ b/include/lttng/align.h @@ -6,53 +6,108 @@ * * (C) Copyright 2010-2011 - Mathieu Desnoyers * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ #include +#include +#include -/* - * Align pointer on natural object alignment. - */ -#define object_align(obj) PTR_ALIGN(obj, __alignof__(*(obj))) -#define object_align_floor(obj) PTR_ALIGN_FLOOR(obj, __alignof__(*(obj))) +#ifdef __FreeBSD__ +#include +#endif + +#ifdef _SC_PAGE_SIZE +#define LTTNG_UST_PAGE_SIZE sysconf(_SC_PAGE_SIZE) +#elif defined(PAGE_SIZE) +#define LTTNG_UST_PAGE_SIZE PAGE_SIZE +#else +#error "Please add page size detection for your OS." +#endif + +#define LTTNG_UST_PAGE_MASK (~(LTTNG_UST_PAGE_SIZE - 1)) + +#define __LTTNG_UST_ALIGN_MASK(v, mask) (((v) + (mask)) & ~(mask)) +#define LTTNG_UST_ALIGN(v, align) __LTTNG_UST_ALIGN_MASK(v, (__typeof__(v)) (align) - 1) +#define LTTNG_UST_PAGE_ALIGN(addr) LTTNG_UST_ALIGN(addr, LTTNG_UST_PAGE_SIZE) /** - * offset_align - Calculate the offset needed to align an object on its natural - * alignment towards higher addresses. + * lttng_ust_offset_align - Calculate the offset needed to align an object on + * its natural alignment towards higher addresses. * @align_drift: object offset from an "alignment"-aligned address. * @alignment: natural object alignment. Must be non-zero, power of 2. * * Returns the offset that must be added to align towards higher * addresses. */ -#define offset_align(align_drift, alignment) \ +#define lttng_ust_offset_align(align_drift, alignment) \ ({ \ - BUILD_RUNTIME_BUG_ON((alignment) == 0 \ + LTTNG_BUILD_RUNTIME_BUG_ON((alignment) == 0 \ || ((alignment) & ((alignment) - 1))); \ (((alignment) - (align_drift)) & ((alignment) - 1)); \ }) /** - * offset_align_floor - Calculate the offset needed to align an object - * on its natural alignment towards lower addresses. + * lttng_ust_offset_align_floor - Calculate the offset needed to align an + * object on its natural alignment towards lower addresses. * @align_drift: object offset from an "alignment"-aligned address. * @alignment: natural object alignment. Must be non-zero, power of 2. * * Returns the offset that must be substracted to align towards lower addresses. */ -#define offset_align_floor(align_drift, alignment) \ +#define lttng_ust_offset_align_floor(align_drift, alignment) \ ({ \ - BUILD_RUNTIME_BUG_ON((alignment) == 0 \ + LTTNG_BUILD_RUNTIME_BUG_ON((alignment) == 0 \ || ((alignment) & ((alignment) - 1))); \ - (((align_drift) - (alignment)) & ((alignment) - 1); \ + (((align_drift) - (alignment)) & ((alignment) - 1)); \ }) +/* + * Non-namespaced defines for backwards compatibility, + * introduced in 2.13, should be removed in the future. + */ + +/* Cygwin limits.h defines its own PAGE_SIZE */ +#ifndef PAGE_SIZE +#define PAGE_SIZE LTTNG_UST_PAGE_SIZE +#endif + +/* FreeBSD and macOS defines their own PAGE_MASK. */ +#ifndef PAGE_MASK +#define PAGE_MASK LTTNG_UST_PAGE_MASK +#endif + +/* FreeBSD machine/param.h defines its own ALIGN */ +#ifndef ALIGN +#define ALIGN LTTNG_UST_ALIGN +#endif + +#ifndef PAGE_ALIGN +#define PAGE_ALIGN LTTNG_UST_PAGE_ALIGN +#endif + +#ifndef offset_align +#define offset_align lttng_ust_offset_align +#endif + +#ifndef offset_align_floor +#define offset_align_floor lttng_ust_offset_align_floor +#endif + #endif /* _UST_ALIGN_H */