X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=compiler.h;h=99972f30e2ba89726f663c78261f4e9203b6d026;hp=2507ec88a0a6a6fbb11e84f73843bb042a9d850e;hb=ba59a0c7b244a0939a2298fc76a9002436ef9674;hpb=af02d47e5d0712e5ccde6d8f1ee89f18de798cad diff --git a/compiler.h b/compiler.h index 2507ec8..99972f3 100644 --- a/compiler.h +++ b/compiler.h @@ -8,28 +8,20 @@ * * Copyright (c) 2009 Mathieu Desnoyers * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. -* - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * IBM's contributions to this file may be relicensed under LGPLv2 or later. + * 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 "volatile" is due to gcc bugs */ -#define barrier() __asm__ __volatile__("": : :"memory") +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) -#define likely(x) __builtin_expect(!!(x), 1) -#define unlikely(x) __builtin_expect(!!(x), 0) +#define barrier() asm volatile("" : : : "memory"); /* * Instruct the compiler to perform only a single access to a variable @@ -43,6 +35,16 @@ * use is to mediate communication between process-level code and irq/NMI * handlers, all running on the same CPU. */ -#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) +#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&x) + +#if (__GNUC__ == 4) +#define __compiler_offsetof(a, b) __builtin_offsetof(a, b) +#endif + +#ifdef __compiler_offsetof +#define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) +#else +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif #endif /* _COMPILER_H */