Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
complete reorganisation of examples/smpi/NAS
[simgrid.git] / include / xbt / base.h
1 /* xbt.h - Public interface to the xbt (simgrid's toolbox)                     */
2
3 /* Copyright (c) 2004-2015. The SimGrid Team.
4  * All rights reserved.                                                     */
5
6 /* This program is free software; you can redistribute it and/or modify it
7  * under the terms of the license (GNU LGPL) which comes with this package. */
8
9 #ifndef XBT_BASE_H
10 #define XBT_BASE_H
11
12 #include "simgrid_config.h"
13
14 /* Define _GNU_SOURCE for getline, isfinite, etc. */
15 #ifndef _GNU_SOURCE
16   #define _GNU_SOURCE
17 #endif
18
19 /* On MinGW, stdio.h defines __MINGW_PRINTF_FORMAT and __MINGW_SCANF_FORMAT
20    which are the suitable format style (either gnu_printf or ms_printf)
21    depending on which version is available (__USE_MINGW_ANSI_STDIO): */
22 #ifdef __MINGW32__
23   #include <stdio.h>
24
25   # define XBT_ATTRIB_PRINTF( format_idx, arg_idx )    \
26      __attribute__((__format__ (__MINGW_PRINTF_FORMAT, format_idx, arg_idx)))
27   # define XBT_ATTRIB_SCANF( format_idx, arg_idx )     \
28          __attribute__((__MINGW_SCANF_FORMAT (__scanf__, format_idx, arg_idx)))
29 #else
30   # define XBT_ATTRIB_PRINTF( format_idx, arg_idx )    \
31      __attribute__((__format__ (__printf__, format_idx, arg_idx)))
32   # define XBT_ATTRIB_SCANF( format_idx, arg_idx )     \
33          __attribute__((__format__ (__scanf__, format_idx, arg_idx)))
34 #endif
35
36 # define XBT_ATTRIB_NORETURN __attribute__((__noreturn__))
37 # define XBT_ATTRIB_UNUSED  __attribute__((__unused__))
38
39 /* Constructor priorities exist since gcc 4.3.  Apparently, they are however not
40  * supported on Macs. */
41 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && !defined(__APPLE__)
42 #  define _XBT_GNUC_CONSTRUCTOR(prio) __attribute__((__constructor__ (prio)))
43 #  define _XBT_GNUC_DESTRUCTOR(prio) __attribute__((__destructor__ (prio)))
44 # else
45 #  define _XBT_GNUC_CONSTRUCTOR(prio) __attribute__((__constructor__))
46 #  define _XBT_GNUC_DESTRUCTOR(prio) __attribute__((__destructor__))
47 # endif
48 # undef _XBT_NEED_INIT_PRAGMA
49
50 #if defined(__GNUC__)
51 #   define XBT_ALWAYS_INLINE inline __attribute__ ((always_inline))
52 #else
53 #   define XBT_ALWAYS_INLINE inline
54 #endif
55
56 #if defined(__GNUC__)
57 #   define XBT_THREAD_LOCAL __thread
58 #else
59 #   define XBT_THREAD_LOCAL No thread local on this architecture
60 #endif
61
62 /* improvable on gcc (by evaluating arguments only once), but wouldn't be portable */
63 #ifdef MIN
64 # undef MIN
65 #endif
66 #define MIN(a,b) ((a)<(b)?(a):(b))
67
68 #ifdef MAX
69 # undef MAX
70 #endif
71 #define MAX(a,b) ((a)>(b)?(a):(b))
72
73 /*
74  * Expands to `one' if there is only one argument for the variadic part.
75  * Otherwise, expands to `more'.
76  * Works with up to 63 arguments, which is the maximum mandated by the C99 standard.
77  */
78 #define _XBT_IF_ONE_ARG(one, more, ...)                                 \
79     _XBT_IF_ONE_ARG_(__VA_ARGS__,                                       \
80                      more, more, more, more, more, more, more, more,    \
81                      more, more, more, more, more, more, more, more,    \
82                      more, more, more, more, more, more, more, more,    \
83                      more, more, more, more, more, more, more, more,    \
84                      more, more, more, more, more, more, more, more,    \
85                      more, more, more, more, more, more, more, more,    \
86                      more, more, more, more, more, more, more, more,    \
87                      more, more, more, more, more, more, more, one)
88 #define _XBT_IF_ONE_ARG_(a64, a63, a62, a61, a60, a59, a58, a57,        \
89                          a56, a55, a54, a53, a52, a51, a50, a49,        \
90                          a48, a47, a46, a45, a44, a43, a42, a41,        \
91                          a40, a39, a38, a37, a36, a35, a34, a33,        \
92                          a32, a31, a30, a29, a28, a27, a26, a25,        \
93                          a24, a23, a22, a21, a20, a19, a18, a17,        \
94                          a16, a15, a14, a13, a12, a11, a10, a9,         \
95                          a8, a7, a6, a5, a4, a3, a2, a1, N, ...) N
96
97 /* Handle import/export stuff
98  *
99  * Rational of XBT_PUBLIC:
100  *   * This is for library symbols visible from the application-land.
101  *     Basically, any symbols defined in the include/directory must be like this (plus some other globals).
102  *
103  *     UNIX coders should just think of it as a special way to say "extern".
104  *
105  *   * If you build the DLL, define the DLL_EXPORT symbol so that all symbols actually get exported by this file.
106  *
107  *   * If you link your application against the DLL or if you do a UNIX build, don't do anything special. This file
108  *     will do the right thing for you by default.
109  *
110  * Rational of XBT_EXPORT_NO_IMPORT: (windows-only)
111  *   * Symbols which must be exported in the DLL, but not imported from it.
112  *
113  *   * This is obviously useful for initialized globals (which cannot be  extern or similar).
114  *   * This is also used in the log mechanism where a macro creates the variable automatically. When the macro is
115  *     called from within SimGrid, the symbol must be exported, but when called  from within the client code, it must
116  *     not try to retrieve the symbol from the DLL since it's not in there.
117  *
118  * Rational of XBT_IMPORT_NO_EXPORT: (windows-only)
119  *   * Symbols which must be imported from the DLL, but not explicitly  exported from it.
120  *
121  *   * The root log category is already exported, but not imported explicitly when creating a subcategory since we
122  *     cannot import the parent category to deal with the fact that the parent may be in application space, not DLL
123  *     space.
124  */
125
126 /* Build the DLL */
127 #if defined(DLL_EXPORT)
128 #  define XBT_PUBLIC(type)            __declspec(dllexport) type
129 #  define XBT_EXPORT_NO_IMPORT(type)  __declspec(dllexport) type
130 #  define XBT_IMPORT_NO_EXPORT(type)  type
131 #  define XBT_PUBLIC_DATA(type)       extern __declspec(dllexport) type
132 #  define XBT_PUBLIC_CLASS            class __declspec(dllexport)
133 #  define XBT_PRIVATE
134
135 /* Link against the DLL */
136 #elif (defined(_WIN32) && !defined(DLL_EXPORT))
137 #  define XBT_PUBLIC(type)            __declspec(dllimport) type
138 #  define XBT_EXPORT_NO_IMPORT(type)  type
139 #  define XBT_IMPORT_NO_EXPORT(type)  __declspec(dllimport) type
140 #  define XBT_PUBLIC_DATA(type)       extern __declspec(dllimport) type
141 #  define XBT_PUBLIC_CLASS            class __declspec(dllimport)
142 #  define XBT_PRIVATE
143
144 #elif defined(__ELF__) 
145 #  define XBT_PUBLIC(type)            __attribute__((visibility("default"))) type
146 #  define XBT_EXPORT_NO_IMPORT(type)  __attribute__((visibility("default"))) type
147 #  define XBT_IMPORT_NO_EXPORT(type)  __attribute__((visibility("default"))) type
148 #  define XBT_PUBLIC_DATA(type)       extern __attribute__((visibility("default"))) type
149 #  define XBT_PUBLIC_CLASS            class __attribute__((visibility("default")))
150 #  define XBT_PRIVATE                 __attribute__((visibility("hidden")))
151
152 #else
153 #  define XBT_PUBLIC(type)            type
154 #  define XBT_EXPORT_NO_IMPORT(type)  type
155 #  define XBT_IMPORT_NO_EXPORT(type)  type
156 #  define XBT_PUBLIC_DATA(type)       extern type
157 #  define XBT_PUBLIC_CLASS            class
158 #  define XBT_PRIVATE
159
160 #endif
161
162 #define TRUE  1
163 #define FALSE 0
164
165 /*! C++ users need love */
166 #ifndef SG_BEGIN_DECL
167 # ifdef __cplusplus
168 #  define SG_BEGIN_DECL() extern "C" {
169 # else
170 #  define SG_BEGIN_DECL()
171 # endif
172 #endif
173
174 #ifndef SG_END_DECL
175 # ifdef __cplusplus
176 #  define SG_END_DECL() }
177 # else
178 #  define SG_END_DECL()
179 # endif
180 #endif
181 /* End of cruft for C++ */
182
183 #endif