GRPC C++  1.14.0-dev
port_platform.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #ifndef GRPC_IMPL_CODEGEN_PORT_PLATFORM_H
20 #define GRPC_IMPL_CODEGEN_PORT_PLATFORM_H
21 
22 /*
23  * Define GPR_BACKWARDS_COMPATIBILITY_MODE to try harder to be ABI
24  * compatible with older platforms (currently only on Linux)
25  * Causes:
26  * - some libc calls to be gotten via dlsym
27  * - some syscalls to be made directly
28  */
29 
30 /* Get windows.h included everywhere (we need it) */
31 #if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32)
32 #ifndef WIN32_LEAN_AND_MEAN
33 #define GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
34 #define WIN32_LEAN_AND_MEAN
35 #endif /* WIN32_LEAN_AND_MEAN */
36 
37 #ifndef NOMINMAX
38 #define GRPC_NOMINMX_WAS_NOT_DEFINED
39 #define NOMINMAX
40 #endif /* NOMINMAX */
41 
42 #ifndef _WIN32_WINNT
43 #error \
44  "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"
45 #else /* !defined(_WIN32_WINNT) */
46 #if (_WIN32_WINNT < 0x0600)
47 #error \
48  "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"
49 #endif /* _WIN32_WINNT < 0x0600 */
50 #endif /* defined(_WIN32_WINNT) */
51 
52 #include <windows.h>
53 
54 #ifdef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
55 #undef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
56 #undef WIN32_LEAN_AND_MEAN
57 #endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */
58 
59 #ifdef GRPC_NOMINMAX_WAS_NOT_DEFINED
60 #undef GRPC_NOMINMAX_WAS_NOT_DEFINED
61 #undef NOMINMAX
62 #endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */
63 #endif /* defined(_WIN64) || defined(WIN64) || defined(_WIN32) || \
64  defined(WIN32) */
65 
66 /* Override this file with one for your platform if you need to redefine
67  things. */
68 
69 #if !defined(GPR_NO_AUTODETECT_PLATFORM)
70 #if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32)
71 #if defined(_WIN64) || defined(WIN64)
72 #define GPR_ARCH_64 1
73 #else
74 #define GPR_ARCH_32 1
75 #endif
76 #define GPR_PLATFORM_STRING "windows"
77 #define GPR_WINDOWS 1
78 #define GPR_WINDOWS_SUBPROCESS 1
79 #define GPR_WINDOWS_ENV
80 #ifdef __MSYS__
81 #define GPR_GETPID_IN_UNISTD_H 1
82 #define GPR_MSYS_TMPFILE
83 #define GPR_POSIX_LOG
84 #define GPR_POSIX_STRING
85 #define GPR_POSIX_TIME
86 #else
87 #define GPR_GETPID_IN_PROCESS_H 1
88 #define GPR_WINDOWS_TMPFILE
89 #define GPR_WINDOWS_LOG
90 #define GPR_WINDOWS_CRASH_HANDLER 1
91 #define GPR_WINDOWS_STRING
92 #define GPR_WINDOWS_TIME
93 #endif
94 #ifdef __GNUC__
95 #define GPR_GCC_ATOMIC 1
96 #define GPR_GCC_TLS 1
97 #else
98 #define GPR_WINDOWS_ATOMIC 1
99 #define GPR_MSVC_TLS 1
100 #endif
101 #elif defined(GPR_MANYLINUX1)
102 // TODO(atash): manylinux1 is just another __linux__ but with ancient
103 // libraries; it should be integrated with the `__linux__` definitions below.
104 #define GPR_PLATFORM_STRING "manylinux"
105 #define GPR_POSIX_CRASH_HANDLER 1
106 #define GPR_CPU_POSIX 1
107 #define GPR_GCC_ATOMIC 1
108 #define GPR_GCC_TLS 1
109 #define GPR_LINUX 1
110 #define GPR_LINUX_LOG 1
111 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
112 #define GPR_LINUX_ENV 1
113 #define GPR_POSIX_TMPFILE 1
114 #define GPR_POSIX_STRING 1
115 #define GPR_POSIX_SUBPROCESS 1
116 #define GPR_POSIX_SYNC 1
117 #define GPR_POSIX_TIME 1
118 #define GPR_GETPID_IN_UNISTD_H 1
119 #ifdef _LP64
120 #define GPR_ARCH_64 1
121 #else /* _LP64 */
122 #define GPR_ARCH_32 1
123 #endif /* _LP64 */
124 #elif defined(ANDROID) || defined(__ANDROID__)
125 #define GPR_PLATFORM_STRING "android"
126 #define GPR_ANDROID 1
127 #ifdef _LP64
128 #define GPR_ARCH_64 1
129 #else /* _LP64 */
130 #define GPR_ARCH_32 1
131 #endif /* _LP64 */
132 #define GPR_CPU_POSIX 1
133 #define GPR_GCC_SYNC 1
134 #define GPR_GCC_TLS 1
135 #define GPR_POSIX_ENV 1
136 #define GPR_POSIX_TMPFILE 1
137 #define GPR_ANDROID_LOG 1
138 #define GPR_POSIX_STRING 1
139 #define GPR_POSIX_SUBPROCESS 1
140 #define GPR_POSIX_SYNC 1
141 #define GPR_POSIX_TIME 1
142 #define GPR_GETPID_IN_UNISTD_H 1
143 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
144 #elif defined(__linux__)
145 #define GPR_PLATFORM_STRING "linux"
146 #ifndef _BSD_SOURCE
147 #define _BSD_SOURCE
148 #endif
149 #ifndef _DEFAULT_SOURCE
150 #define _DEFAULT_SOURCE
151 #endif
152 #ifndef _GNU_SOURCE
153 #define _GNU_SOURCE
154 #endif
155 #include <features.h>
156 #define GPR_CPU_LINUX 1
157 #define GPR_GCC_ATOMIC 1
158 #define GPR_GCC_TLS 1
159 #define GPR_LINUX 1
160 #define GPR_LINUX_LOG
161 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
162 #define GPR_LINUX_ENV 1
163 #define GPR_POSIX_TMPFILE 1
164 #define GPR_POSIX_STRING 1
165 #define GPR_POSIX_SUBPROCESS 1
166 #define GPR_POSIX_SYNC 1
167 #define GPR_POSIX_TIME 1
168 #define GPR_GETPID_IN_UNISTD_H 1
169 #ifdef _LP64
170 #define GPR_ARCH_64 1
171 #else /* _LP64 */
172 #define GPR_ARCH_32 1
173 #endif /* _LP64 */
174 #ifdef __GLIBC__
175 #define GPR_POSIX_CRASH_HANDLER 1
176 #define GPR_LINUX_PTHREAD_NAME 1
177 #else /* musl libc */
178 #define GPR_MUSL_LIBC_COMPAT 1
179 #endif
180 #elif defined(__APPLE__)
181 #include <Availability.h>
182 #include <TargetConditionals.h>
183 #ifndef _BSD_SOURCE
184 #define _BSD_SOURCE
185 #endif
186 #if TARGET_OS_IPHONE
187 #define GPR_PLATFORM_STRING "ios"
188 #define GPR_CPU_IPHONE 1
189 #define GPR_PTHREAD_TLS 1
190 #else /* TARGET_OS_IPHONE */
191 #define GPR_PLATFORM_STRING "osx"
192 #ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
193 #if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7
194 #define GPR_CPU_IPHONE 1
195 #define GPR_PTHREAD_TLS 1
196 #else /* __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7 */
197 #define GPR_CPU_POSIX 1
198 /* TODO(vjpai): there is a reported issue in bazel build for Mac where __thread
199  in a header is currently not working (bazelbuild/bazel#4341). Remove
200  the following conditional and use GPR_GCC_TLS when that is fixed */
201 #ifndef GRPC_BAZEL_BUILD
202 #define GPR_GCC_TLS 1
203 #else /* GRPC_BAZEL_BUILD */
204 #define GPR_PTHREAD_TLS 1
205 #endif /* GRPC_BAZEL_BUILD */
206 #define GPR_APPLE_PTHREAD_NAME 1
207 #endif
208 #else /* __MAC_OS_X_VERSION_MIN_REQUIRED */
209 #define GPR_CPU_POSIX 1
210 /* TODO(vjpai): Remove the following conditional and use only GPR_GCC_TLS
211  when bazelbuild/bazel#4341 is fixed */
212 #ifndef GRPC_BAZEL_BUILD
213 #define GPR_GCC_TLS 1
214 #else /* GRPC_BAZEL_BUILD */
215 #define GPR_PTHREAD_TLS 1
216 #endif /* GRPC_BAZEL_BUILD */
217 #endif
218 #define GPR_POSIX_CRASH_HANDLER 1
219 #endif
220 #define GPR_APPLE 1
221 #define GPR_GCC_ATOMIC 1
222 #define GPR_POSIX_LOG 1
223 #define GPR_POSIX_ENV 1
224 #define GPR_POSIX_TMPFILE 1
225 #define GPR_POSIX_STRING 1
226 #define GPR_POSIX_SUBPROCESS 1
227 #define GPR_POSIX_SYNC 1
228 #define GPR_POSIX_TIME 1
229 #define GPR_GETPID_IN_UNISTD_H 1
230 /* TODO(mxyan): Remove when CFStream becomes default */
231 #ifndef GRPC_CFSTREAM
232 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
233 #endif
234 #ifdef _LP64
235 #define GPR_ARCH_64 1
236 #else /* _LP64 */
237 #define GPR_ARCH_32 1
238 #endif /* _LP64 */
239 #elif defined(__FreeBSD__)
240 #define GPR_PLATFORM_STRING "freebsd"
241 #ifndef _BSD_SOURCE
242 #define _BSD_SOURCE
243 #endif
244 #define GPR_FREEBSD 1
245 #define GPR_CPU_POSIX 1
246 #define GPR_GCC_ATOMIC 1
247 #define GPR_GCC_TLS 1
248 #define GPR_POSIX_LOG 1
249 #define GPR_POSIX_ENV 1
250 #define GPR_POSIX_TMPFILE 1
251 #define GPR_POSIX_STRING 1
252 #define GPR_POSIX_SUBPROCESS 1
253 #define GPR_POSIX_SYNC 1
254 #define GPR_POSIX_TIME 1
255 #define GPR_GETPID_IN_UNISTD_H 1
256 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
257 #ifdef _LP64
258 #define GPR_ARCH_64 1
259 #else /* _LP64 */
260 #define GPR_ARCH_32 1
261 #endif /* _LP64 */
262 #elif defined(__OpenBSD__)
263 #define GPR_PLATFORM_STRING "openbsd"
264 #ifndef _BSD_SOURCE
265 #define _BSD_SOURCE
266 #endif
267 #define GPR_OPENBSD 1
268 #define GPR_CPU_POSIX 1
269 #define GPR_GCC_ATOMIC 1
270 #define GPR_GCC_TLS 1
271 #define GPR_POSIX_LOG 1
272 #define GPR_POSIX_ENV 1
273 #define GPR_POSIX_TMPFILE 1
274 #define GPR_POSIX_STRING 1
275 #define GPR_POSIX_SUBPROCESS 1
276 #define GPR_POSIX_SYNC 1
277 #define GPR_POSIX_TIME 1
278 #define GPR_GETPID_IN_UNISTD_H 1
279 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
280 #ifdef _LP64
281 #define GPR_ARCH_64 1
282 #else /* _LP64 */
283 #define GPR_ARCH_32 1
284 #endif /* _LP64 */
285 #elif defined(__native_client__)
286 #define GPR_PLATFORM_STRING "nacl"
287 #ifndef _BSD_SOURCE
288 #define _BSD_SOURCE
289 #endif
290 #ifndef _DEFAULT_SOURCE
291 #define _DEFAULT_SOURCE
292 #endif
293 #ifndef _GNU_SOURCE
294 #define _GNU_SOURCE
295 #endif
296 #define GPR_NACL 1
297 #define GPR_CPU_POSIX 1
298 #define GPR_GCC_ATOMIC 1
299 #define GPR_GCC_TLS 1
300 #define GPR_POSIX_LOG 1
301 #define GPR_POSIX_ENV 1
302 #define GPR_POSIX_TMPFILE 1
303 #define GPR_POSIX_STRING 1
304 #define GPR_POSIX_SUBPROCESS 1
305 #define GPR_POSIX_SYNC 1
306 #define GPR_POSIX_TIME 1
307 #define GPR_GETPID_IN_UNISTD_H 1
308 #ifdef _LP64
309 #define GPR_ARCH_64 1
310 #else /* _LP64 */
311 #define GPR_ARCH_32 1
312 #endif /* _LP64 */
313 #else
314 #error "Could not auto-detect platform"
315 #endif
316 #endif /* GPR_NO_AUTODETECT_PLATFORM */
317 
318 /*
319  * There are platforms for which TLS should not be used even though the
320  * compiler makes it seem like it's supported (Android NDK < r12b for example).
321  * This is primarily because of linker problems and toolchain misconfiguration:
322  * TLS isn't supported until NDK r12b per
323  * https://developer.android.com/ndk/downloads/revision_history.html
324  * TLS also does not work with Android NDK if GCC is being used as the compiler
325  * instead of Clang.
326  * Since NDK r16, `__NDK_MAJOR__` and `__NDK_MINOR__` are defined in
327  * <android/ndk-version.h>. For NDK < r16, users should define these macros,
328  * e.g. `-D__NDK_MAJOR__=11 -D__NKD_MINOR__=0` for NDK r11. */
329 #if defined(__ANDROID__) && defined(GPR_GCC_TLS)
330 #if __has_include(<android/ndk-version.h>)
331 #include <android/ndk-version.h>
332 #endif /* __has_include(<android/ndk-version.h>) */
333 #if (defined(__clang__) && defined(__NDK_MAJOR__) && defined(__NDK_MINOR__) && \
334  ((__NDK_MAJOR__ < 12) || \
335  ((__NDK_MAJOR__ == 12) && (__NDK_MINOR__ < 1)))) || \
336  (defined(__GNUC__) && !defined(__clang__))
337 #undef GPR_GCC_TLS
338 #define GPR_PTHREAD_TLS 1
339 #endif
340 #endif /*defined(__ANDROID__) && defined(GPR_GCC_TLS) */
341 
342 #if defined(__has_include)
343 #if __has_include(<atomic>)
344 #define GRPC_HAS_CXX11_ATOMIC
345 #endif /* __has_include(<atomic>) */
346 #endif /* defined(__has_include) */
347 
348 #ifndef GPR_PLATFORM_STRING
349 #warning "GPR_PLATFORM_STRING not auto-detected"
350 #define GPR_PLATFORM_STRING "unknown"
351 #endif
352 
353 #ifdef GPR_GCOV
354 #undef GPR_FORBID_UNREACHABLE_CODE
355 #define GPR_FORBID_UNREACHABLE_CODE 1
356 #endif
357 
358 #ifdef _MSC_VER
359 #if _MSC_VER < 1700
360 typedef __int8 int8_t;
361 typedef __int16 int16_t;
362 typedef __int32 int32_t;
363 typedef __int64 int64_t;
364 typedef unsigned __int8 uint8_t;
365 typedef unsigned __int16 uint16_t;
366 typedef unsigned __int32 uint32_t;
367 typedef unsigned __int64 uint64_t;
368 #else
369 #include <stdint.h>
370 #endif /* _MSC_VER < 1700 */
371 #else
372 #include <stdint.h>
373 #endif /* _MSC_VER */
374 
375 /* Cache line alignment */
376 #ifndef GPR_CACHELINE_SIZE_LOG
377 #if defined(__i386__) || defined(__x86_64__)
378 #define GPR_CACHELINE_SIZE_LOG 6
379 #endif
380 #ifndef GPR_CACHELINE_SIZE_LOG
381 /* A reasonable default guess. Note that overestimates tend to waste more
382  space, while underestimates tend to waste more time. */
383 #define GPR_CACHELINE_SIZE_LOG 6
384 #endif /* GPR_CACHELINE_SIZE_LOG */
385 #endif /* GPR_CACHELINE_SIZE_LOG */
386 
387 #define GPR_CACHELINE_SIZE (1 << GPR_CACHELINE_SIZE_LOG)
388 
389 /* scrub GCC_ATOMIC if it's not available on this compiler */
390 #if defined(GPR_GCC_ATOMIC) && !defined(__ATOMIC_RELAXED)
391 #undef GPR_GCC_ATOMIC
392 #define GPR_GCC_SYNC 1
393 #endif
394 
395 /* Validate platform combinations */
396 #if defined(GPR_GCC_ATOMIC) + defined(GPR_GCC_SYNC) + \
397  defined(GPR_WINDOWS_ATOMIC) != \
398  1
399 #error Must define exactly one of GPR_GCC_ATOMIC, GPR_GCC_SYNC, GPR_WINDOWS_ATOMIC
400 #endif
401 
402 #if defined(GPR_ARCH_32) + defined(GPR_ARCH_64) != 1
403 #error Must define exactly one of GPR_ARCH_32, GPR_ARCH_64
404 #endif
405 
406 #if defined(GPR_CPU_LINUX) + defined(GPR_CPU_POSIX) + defined(GPR_WINDOWS) + \
407  defined(GPR_CPU_IPHONE) + defined(GPR_CPU_CUSTOM) != \
408  1
409 #error Must define exactly one of GPR_CPU_LINUX, GPR_CPU_POSIX, GPR_WINDOWS, GPR_CPU_IPHONE, GPR_CPU_CUSTOM
410 #endif
411 
412 #if defined(GPR_MSVC_TLS) + defined(GPR_GCC_TLS) + defined(GPR_PTHREAD_TLS) + \
413  defined(GPR_CUSTOM_TLS) != \
414  1
415 #error Must define exactly one of GPR_MSVC_TLS, GPR_GCC_TLS, GPR_PTHREAD_TLS, GPR_CUSTOM_TLS
416 #endif
417 
418 /* maximum alignment needed for any type on this platform, rounded up to a
419  power of two */
420 #define GPR_MAX_ALIGNMENT 16
421 
422 #ifndef GRPC_ARES
423 #ifdef GPR_WINDOWS
424 #define GRPC_ARES 0
425 #else
426 #define GRPC_ARES 1
427 #endif
428 #endif
429 
430 #ifndef GRPC_MUST_USE_RESULT
431 #if defined(__GNUC__) && !defined(__MINGW32__)
432 #define GRPC_MUST_USE_RESULT __attribute__((warn_unused_result))
433 #define GPR_ALIGN_STRUCT(n) __attribute__((aligned(n)))
434 #else
435 #define GRPC_MUST_USE_RESULT
436 #define GPR_ALIGN_STRUCT(n)
437 #endif
438 #endif
439 
440 #ifndef GRPC_UNUSED
441 #if defined(__GNUC__) && !defined(__MINGW32__)
442 #define GRPC_UNUSED __attribute__((unused))
443 #else
444 #define GRPC_UNUSED
445 #endif
446 #endif
447 
448 #ifndef GPR_PRINT_FORMAT_CHECK
449 #ifdef __GNUC__
450 #define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS) \
451  __attribute__((format(printf, FORMAT_STR, ARGS)))
452 #else
453 #define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS)
454 #endif
455 #endif /* GPR_PRINT_FORMAT_CHECK */
456 
457 #if GPR_FORBID_UNREACHABLE_CODE
458 #define GPR_UNREACHABLE_CODE(STATEMENT)
459 #else
460 #define GPR_UNREACHABLE_CODE(STATEMENT) \
461  do { \
462  gpr_log(GPR_ERROR, "Should never reach here."); \
463  abort(); \
464  STATEMENT; \
465  } while (0)
466 #endif /* GPR_FORBID_UNREACHABLE_CODE */
467 
468 #ifndef GPRAPI
469 #define GPRAPI
470 #endif
471 
472 #ifndef GRPCAPI
473 #define GRPCAPI GPRAPI
474 #endif
475 
476 #ifndef CENSUSAPI
477 #define CENSUSAPI GRPCAPI
478 #endif
479 
480 #ifndef GPR_ATTRIBUTE_NO_TSAN /* (1) */
481 #if defined(__has_feature)
482 #if __has_feature(thread_sanitizer)
483 #define GPR_ATTRIBUTE_NO_TSAN __attribute__((no_sanitize("thread")))
484 #endif /* __has_feature(thread_sanitizer) */
485 #endif /* defined(__has_feature) */
486 #ifndef GPR_ATTRIBUTE_NO_TSAN /* (2) */
487 #define GPR_ATTRIBUTE_NO_TSAN
488 #endif /* GPR_ATTRIBUTE_NO_TSAN (2) */
489 #endif /* GPR_ATTRIBUTE_NO_TSAN (1) */
490 
491 /* GRPC_ALLOW_EXCEPTIONS should be 0 or 1 if exceptions are allowed or not */
492 #ifndef GRPC_ALLOW_EXCEPTIONS
493 /* If not already set, set to 1 on Windows (style guide standard) but to
494  * 0 on non-Windows platforms unless the compiler defines __EXCEPTIONS */
495 #ifdef GPR_WINDOWS
496 #define GRPC_ALLOW_EXCEPTIONS 1
497 #else /* GPR_WINDOWS */
498 #ifdef __EXCEPTIONS
499 #define GRPC_ALLOW_EXCEPTIONS 1
500 #else /* __EXCEPTIONS */
501 #define GRPC_ALLOW_EXCEPTIONS 0
502 #endif /* __EXCEPTIONS */
503 #endif /* __GPR_WINDOWS */
504 #endif /* GRPC_ALLOW_EXCEPTIONS */
505 
506 /* Use GPR_LIKELY only in cases where you are sure that a certain outcome is the
507  * most likely. Ideally, also collect performance numbers to justify the claim.
508  */
509 #ifdef __GNUC__
510 #define GPR_LIKELY(x) __builtin_expect((x), 1)
511 #define GPR_UNLIKELY(x) __builtin_expect((x), 0)
512 #else /* __GNUC__ */
513 #define GPR_LIKELY(x) (x)
514 #define GPR_UNLIKELY(x) (x)
515 #endif /* __GNUC__ */
516 
517 #ifndef __STDC_FORMAT_MACROS
518 #define __STDC_FORMAT_MACROS
519 #endif
520 
521 #endif /* GRPC_IMPL_CODEGEN_PORT_PLATFORM_H */