GRPC C++  1.55.0
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_SUPPORT_PORT_PLATFORM_H
20 #define GRPC_SUPPORT_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 // [[deprecated]] attribute is only available since C++14
31 #if __cplusplus >= 201402L
32 #define GRPC_DEPRECATED(reason) [[deprecated(reason)]]
33 #else
34 #define GRPC_DEPRECATED(reason)
35 #endif // __cplusplus >= 201402L
36 
37 /*
38  * Defines GPR_ABSEIL_SYNC to use synchronization features from Abseil
39  */
40 #ifndef GPR_ABSEIL_SYNC
41 #if defined(__APPLE__)
42 // This is disabled on Apple platforms because macos/grpc_basictests_c_cpp
43 // fails with this. https://github.com/grpc/grpc/issues/23661
44 #else
45 #define GPR_ABSEIL_SYNC 1
46 #endif
47 #endif // GPR_ABSEIL_SYNC
48 
49 /* Get windows.h included everywhere (we need it) */
50 #if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32)
51 #ifndef WIN32_LEAN_AND_MEAN
52 #define GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
53 #define WIN32_LEAN_AND_MEAN
54 #endif /* WIN32_LEAN_AND_MEAN */
55 
56 #ifndef NOMINMAX
57 #define GRPC_NOMINMX_WAS_NOT_DEFINED
58 #define NOMINMAX
59 #endif /* NOMINMAX */
60 
61 #include <windows.h>
62 
63 #ifndef _WIN32_WINNT
64 #error \
65  "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"
66 #else /* !defined(_WIN32_WINNT) */
67 #if (_WIN32_WINNT < 0x0600)
68 #error \
69  "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"
70 #endif /* _WIN32_WINNT < 0x0600 */
71 #endif /* defined(_WIN32_WINNT) */
72 
73 #ifdef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
74 #undef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
75 #undef WIN32_LEAN_AND_MEAN
76 #endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */
77 
78 #ifdef GRPC_NOMINMAX_WAS_NOT_DEFINED
79 #undef GRPC_NOMINMAX_WAS_NOT_DEFINED
80 #undef NOMINMAX
81 #endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */
82 #endif /* defined(_WIN64) || defined(WIN64) || defined(_WIN32) || \
83  defined(WIN32) */
84 
85 /* Override this file with one for your platform if you need to redefine
86  things. */
87 
88 #if !defined(GPR_NO_AUTODETECT_PLATFORM)
89 #if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32)
90 #if defined(_WIN64) || defined(WIN64)
91 #define GPR_ARCH_64 1
92 #else
93 #define GPR_ARCH_32 1
94 #endif
95 #define GPR_PLATFORM_STRING "windows"
96 #define GPR_WINDOWS 1
97 #define GPR_WINDOWS_SUBPROCESS 1
98 #define GPR_WINDOWS_ENV
99 #ifdef __MSYS__
100 #define GPR_GETPID_IN_UNISTD_H 1
101 #define GPR_MSYS_TMPFILE
102 #define GPR_POSIX_LOG
103 #define GPR_POSIX_STRING
104 #define GPR_POSIX_TIME
105 #else
106 #define GPR_GETPID_IN_PROCESS_H 1
107 #define GPR_WINDOWS_TMPFILE
108 #define GPR_WINDOWS_LOG
109 #define GPR_WINDOWS_CRASH_HANDLER 1
110 #define GPR_WINDOWS_STAT
111 #define GPR_WINDOWS_STRING
112 #define GPR_WINDOWS_TIME
113 #endif
114 #ifdef __GNUC__
115 #define GPR_GCC_ATOMIC 1
116 #else
117 #define GPR_WINDOWS_ATOMIC 1
118 #endif
119 #elif defined(ANDROID) || defined(__ANDROID__)
120 #define GPR_PLATFORM_STRING "android"
121 #define GPR_ANDROID 1
122 #ifndef __ANDROID_API__
123 #error "__ANDROID_API__ must be defined for Android builds."
124 #endif
125 #if __ANDROID_API__ < 21
126 #error "Requires Android API v21 and above"
127 #endif
128 #define GPR_SUPPORT_BINDER_TRANSPORT 1
129 // TODO(apolcyn): re-evaluate support for c-ares
130 // on android after upgrading our c-ares dependency.
131 // See https://github.com/grpc/grpc/issues/18038.
132 #define GRPC_ARES 0
133 #ifdef _LP64
134 #define GPR_ARCH_64 1
135 #else /* _LP64 */
136 #define GPR_ARCH_32 1
137 #endif /* _LP64 */
138 #define GPR_CPU_POSIX 1
139 #define GPR_GCC_SYNC 1
140 #define GPR_POSIX_ENV 1
141 #define GPR_POSIX_TMPFILE 1
142 #define GPR_POSIX_STAT 1
143 #define GPR_ANDROID_LOG 1
144 #define GPR_POSIX_STRING 1
145 #define GPR_POSIX_SUBPROCESS 1
146 #define GPR_POSIX_SYNC 1
147 #define GPR_POSIX_TIME 1
148 #define GPR_HAS_PTHREAD_H 1
149 #define GPR_GETPID_IN_UNISTD_H 1
150 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
151 #elif defined(__linux__)
152 #define GPR_PLATFORM_STRING "linux"
153 #ifndef _BSD_SOURCE
154 #define _BSD_SOURCE
155 #endif
156 #ifndef _DEFAULT_SOURCE
157 #define _DEFAULT_SOURCE
158 #endif
159 #ifndef _GNU_SOURCE
160 #define _GNU_SOURCE
161 #endif
162 #include <features.h>
163 #define GPR_CPU_LINUX 1
164 #define GPR_GCC_ATOMIC 1
165 #define GPR_LINUX 1
166 #define GPR_LINUX_LOG
167 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
168 #define GPR_LINUX_ENV 1
169 #define GPR_POSIX_TMPFILE 1
170 #define GPR_POSIX_STAT 1
171 #define GPR_POSIX_STRING 1
172 #define GPR_POSIX_SUBPROCESS 1
173 #define GPR_POSIX_SYNC 1
174 #define GPR_POSIX_TIME 1
175 #define GPR_HAS_PTHREAD_H 1
176 #define GPR_GETPID_IN_UNISTD_H 1
177 #ifdef _LP64
178 #define GPR_ARCH_64 1
179 #else /* _LP64 */
180 #define GPR_ARCH_32 1
181 #endif /* _LP64 */
182 #ifdef __GLIBC__
183 #define GPR_POSIX_CRASH_HANDLER 1
184 #ifdef __GLIBC_PREREQ
185 #if __GLIBC_PREREQ(2, 12)
186 #define GPR_LINUX_PTHREAD_NAME 1
187 #endif
188 #else
189 // musl libc & others
190 #define GPR_LINUX_PTHREAD_NAME 1
191 #endif
192 #include <linux/version.h>
193 #else /* musl libc */
194 #define GPR_MUSL_LIBC_COMPAT 1
195 #endif
196 #elif defined(__ASYLO__)
197 #define GPR_ARCH_64 1
198 #define GPR_CPU_POSIX 1
199 #define GPR_PLATFORM_STRING "asylo"
200 #define GPR_GCC_SYNC 1
201 #define GPR_POSIX_STAT 1
202 #define GPR_POSIX_SYNC 1
203 #define GPR_POSIX_STRING 1
204 #define GPR_POSIX_LOG 1
205 #define GPR_POSIX_TIME 1
206 #define GPR_POSIX_ENV 1
207 #define GPR_ASYLO 1
208 #define GRPC_POSIX_SOCKET 1
209 #define GRPC_POSIX_SOCKETADDR
210 #define GRPC_POSIX_SOCKETUTILS 1
211 #define GRPC_TIMER_USE_GENERIC 1
212 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1
213 #define GRPC_POSIX_WAKEUP_FD 1
214 #define GRPC_HAVE_MSG_NOSIGNAL 1
215 #define GRPC_HAVE_UNIX_SOCKET 1
216 #define GRPC_ARES 0
217 #define GPR_NO_AUTODETECT_PLATFORM 1
218 #elif defined(__APPLE__)
219 #include <Availability.h>
220 #include <TargetConditionals.h>
221 #ifndef _BSD_SOURCE
222 #define _BSD_SOURCE
223 #endif
224 #if TARGET_OS_IPHONE
225 #define GPR_PLATFORM_STRING "ios"
226 #define GPR_CPU_IPHONE 1
227 #define GRPC_CFSTREAM 1
228 /* the c-ares resolver isn't safe to enable on iOS */
229 #define GRPC_ARES 0
230 #else /* TARGET_OS_IPHONE */
231 #define GPR_PLATFORM_STRING "osx"
232 #define GPR_CPU_POSIX 1
233 #define GPR_POSIX_CRASH_HANDLER 1
234 #endif
235 #define GPR_APPLE 1
236 #define GPR_GCC_ATOMIC 1
237 #define GPR_POSIX_LOG 1
238 #define GPR_POSIX_ENV 1
239 #define GPR_POSIX_TMPFILE 1
240 #define GPR_POSIX_STAT 1
241 #define GPR_POSIX_STRING 1
242 #define GPR_POSIX_SUBPROCESS 1
243 #define GPR_POSIX_SYNC 1
244 #define GPR_POSIX_TIME 1
245 #define GPR_HAS_PTHREAD_H 1
246 #define GPR_GETPID_IN_UNISTD_H 1
247 #ifndef GRPC_CFSTREAM
248 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
249 #endif
250 #ifdef _LP64
251 #define GPR_ARCH_64 1
252 #else /* _LP64 */
253 #define GPR_ARCH_32 1
254 #endif /* _LP64 */
255 #elif defined(__FreeBSD__)
256 #define GPR_PLATFORM_STRING "freebsd"
257 #ifndef _BSD_SOURCE
258 #define _BSD_SOURCE
259 #endif
260 #define GPR_FREEBSD 1
261 #define GPR_CPU_POSIX 1
262 #define GPR_GCC_ATOMIC 1
263 #define GPR_POSIX_LOG 1
264 #define GPR_POSIX_ENV 1
265 #define GPR_POSIX_TMPFILE 1
266 #define GPR_POSIX_STAT 1
267 #define GPR_POSIX_STRING 1
268 #define GPR_POSIX_SUBPROCESS 1
269 #define GPR_POSIX_SYNC 1
270 #define GPR_POSIX_TIME 1
271 #define GPR_HAS_PTHREAD_H 1
272 #define GPR_GETPID_IN_UNISTD_H 1
273 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
274 #ifdef _LP64
275 #define GPR_ARCH_64 1
276 #else /* _LP64 */
277 #define GPR_ARCH_32 1
278 #endif /* _LP64 */
279 #elif defined(__OpenBSD__)
280 #define GPR_PLATFORM_STRING "openbsd"
281 #ifndef _BSD_SOURCE
282 #define _BSD_SOURCE
283 #endif
284 #define GPR_OPENBSD 1
285 #define GPR_CPU_POSIX 1
286 #define GPR_GCC_ATOMIC 1
287 #define GPR_POSIX_LOG 1
288 #define GPR_POSIX_ENV 1
289 #define GPR_POSIX_TMPFILE 1
290 #define GPR_POSIX_STAT 1
291 #define GPR_POSIX_STRING 1
292 #define GPR_POSIX_SUBPROCESS 1
293 #define GPR_POSIX_SYNC 1
294 #define GPR_POSIX_TIME 1
295 #define GPR_HAS_PTHREAD_H 1
296 #define GPR_GETPID_IN_UNISTD_H 1
297 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
298 #ifdef _LP64
299 #define GPR_ARCH_64 1
300 #else /* _LP64 */
301 #define GPR_ARCH_32 1
302 #endif /* _LP64 */
303 #elif defined(__sun) && defined(__SVR4)
304 #define GPR_PLATFORM_STRING "solaris"
305 #define GPR_SOLARIS 1
306 #define GPR_CPU_POSIX 1
307 #define GPR_GCC_ATOMIC 1
308 #define GPR_POSIX_LOG 1
309 #define GPR_POSIX_ENV 1
310 #define GPR_POSIX_TMPFILE 1
311 #define GPR_POSIX_STAT 1
312 #define GPR_POSIX_STRING 1
313 #define GPR_POSIX_SUBPROCESS 1
314 #define GPR_POSIX_SYNC 1
315 #define GPR_POSIX_TIME 1
316 #define GPR_HAS_PTHREAD_H 1
317 #define GPR_GETPID_IN_UNISTD_H 1
318 #ifdef _LP64
319 #define GPR_ARCH_64 1
320 #else /* _LP64 */
321 #define GPR_ARCH_32 1
322 #endif /* _LP64 */
323 #elif defined(_AIX)
324 #define GPR_PLATFORM_STRING "aix"
325 #ifndef _ALL_SOURCE
326 #define _ALL_SOURCE
327 #endif
328 #define GPR_AIX 1
329 #define GPR_CPU_POSIX 1
330 #define GPR_GCC_ATOMIC 1
331 #define GPR_POSIX_LOG 1
332 #define GPR_POSIX_ENV 1
333 #define GPR_POSIX_TMPFILE 1
334 #define GPR_POSIX_STAT 1
335 #define GPR_POSIX_STRING 1
336 #define GPR_POSIX_SUBPROCESS 1
337 #define GPR_POSIX_SYNC 1
338 #define GPR_POSIX_TIME 1
339 #define GPR_HAS_PTHREAD_H 1
340 #define GPR_GETPID_IN_UNISTD_H 1
341 #ifdef _LP64
342 #define GPR_ARCH_64 1
343 #else /* _LP64 */
344 #define GPR_ARCH_32 1
345 #endif /* _LP64 */
346 #elif defined(__NetBSD__)
347 // NetBSD is a community-supported platform.
348 // Please contact Thomas Klausner <wiz@NetBSD.org> for support.
349 #define GPR_PLATFORM_STRING "netbsd"
350 #ifndef _BSD_SOURCE
351 #define _BSD_SOURCE
352 #endif
353 #define GPR_NETBSD 1
354 #define GPR_CPU_POSIX 1
355 #define GPR_GCC_ATOMIC 1
356 #define GPR_GCC_TLS 1
357 #define GPR_POSIX_LOG 1
358 #define GPR_POSIX_ENV 1
359 #define GPR_POSIX_TMPFILE 1
360 #define GPR_POSIX_STAT 1
361 #define GPR_POSIX_STRING 1
362 #define GPR_POSIX_SUBPROCESS 1
363 #define GPR_POSIX_SYNC 1
364 #define GPR_POSIX_TIME 1
365 #define GPR_GETPID_IN_UNISTD_H 1
366 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
367 #ifdef _LP64
368 #define GPR_ARCH_64 1
369 #else /* _LP64 */
370 #define GPR_ARCH_32 1
371 #endif /* _LP64 */
372 #elif defined(__native_client__)
373 #define GPR_PLATFORM_STRING "nacl"
374 #ifndef _BSD_SOURCE
375 #define _BSD_SOURCE
376 #endif
377 #ifndef _DEFAULT_SOURCE
378 #define _DEFAULT_SOURCE
379 #endif
380 #ifndef _GNU_SOURCE
381 #define _GNU_SOURCE
382 #endif
383 #define GPR_NACL 1
384 #define GPR_CPU_POSIX 1
385 #define GPR_GCC_ATOMIC 1
386 #define GPR_POSIX_LOG 1
387 #define GPR_POSIX_ENV 1
388 #define GPR_POSIX_TMPFILE 1
389 #define GPR_POSIX_STAT 1
390 #define GPR_POSIX_STRING 1
391 #define GPR_POSIX_SUBPROCESS 1
392 #define GPR_POSIX_SYNC 1
393 #define GPR_POSIX_TIME 1
394 #define GPR_HAS_PTHREAD_H 1
395 #define GPR_GETPID_IN_UNISTD_H 1
396 #ifdef _LP64
397 #define GPR_ARCH_64 1
398 #else /* _LP64 */
399 #define GPR_ARCH_32 1
400 #endif /* _LP64 */
401 #elif defined(__Fuchsia__)
402 #define GRPC_ARES 0
403 #define GPR_FUCHSIA 1
404 #define GPR_ARCH_64 1
405 #define GPR_PLATFORM_STRING "fuchsia"
406 #include <features.h>
407 // Specifying musl libc affects wrap_memcpy.c. It causes memmove() to be
408 // invoked.
409 #define GPR_MUSL_LIBC_COMPAT 1
410 #define GPR_CPU_POSIX 1
411 #define GPR_GCC_ATOMIC 1
412 #define GPR_POSIX_LOG 1
413 #define GPR_POSIX_SYNC 1
414 #define GPR_POSIX_ENV 1
415 #define GPR_POSIX_TMPFILE 1
416 #define GPR_POSIX_STAT 1
417 #define GPR_POSIX_SUBPROCESS 1
418 #define GPR_POSIX_SYNC 1
419 #define GPR_POSIX_STRING 1
420 #define GPR_POSIX_TIME 1
421 #define GPR_HAS_PTHREAD_H 1
422 #define GPR_GETPID_IN_UNISTD_H 1
423 #define GRPC_ROOT_PEM_PATH "/config/ssl/cert.pem"
424 #elif defined(__HAIKU__)
425 #define GPR_PLATFORM_STRING "haiku"
426 // Haiku is a community-supported platform.
427 // Please contact Jerome Duval <jerome.duval@gmail.com> for support.
428 #ifndef _BSD_SOURCE
429 #define _BSD_SOURCE
430 #endif
431 #define GPR_HAIKU 1
432 #define GPR_CPU_POSIX 1
433 #define GPR_GCC_ATOMIC 1
434 #define GPR_POSIX_LOG 1
435 #define GPR_POSIX_ENV 1
436 #define GPR_POSIX_TMPFILE 1
437 #define GPR_POSIX_STAT 1
438 #define GPR_POSIX_STRING 1
439 #define GPR_POSIX_SUBPROCESS 1
440 #define GPR_POSIX_SYNC 1
441 #define GPR_POSIX_TIME 1
442 #define GPR_HAS_PTHREAD_H 1
443 #define GPR_GETPID_IN_UNISTD_H 1
444 #define GPR_SUPPORT_CHANNELS_FROM_FD 1
445 #ifdef _LP64
446 #define GPR_ARCH_64 1
447 #else /* _LP64 */
448 #define GPR_ARCH_32 1
449 #endif /* _LP64 */
450 #else
451 #error "Could not auto-detect platform"
452 #endif
453 #endif /* GPR_NO_AUTODETECT_PLATFORM */
454 
455 #if defined(GPR_BACKWARDS_COMPATIBILITY_MODE)
456 /*
457  * For backward compatibility mode, reset _FORTIFY_SOURCE to prevent
458  * a library from having non-standard symbols such as __asprintf_chk.
459  * This helps non-glibc systems such as alpine using musl to find symbols.
460  */
461 #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0
462 #undef _FORTIFY_SOURCE
463 #define _FORTIFY_SOURCE 0
464 #endif
465 #endif
466 
467 #if defined(__has_include)
468 #if __has_include(<atomic>)
469 #define GRPC_HAS_CXX11_ATOMIC
470 #endif /* __has_include(<atomic>) */
471 #endif /* defined(__has_include) */
472 
473 #ifndef GPR_PLATFORM_STRING
474 #warning "GPR_PLATFORM_STRING not auto-detected"
475 #define GPR_PLATFORM_STRING "unknown"
476 #endif
477 
478 #ifdef GPR_GCOV
479 #undef GPR_FORBID_UNREACHABLE_CODE
480 #define GPR_FORBID_UNREACHABLE_CODE 1
481 #endif
482 
483 #ifdef _MSC_VER
484 #if _MSC_VER < 1700
485 typedef __int8 int8_t;
486 typedef __int16 int16_t;
487 typedef __int32 int32_t;
488 typedef __int64 int64_t;
489 typedef unsigned __int8 uint8_t;
490 typedef unsigned __int16 uint16_t;
491 typedef unsigned __int32 uint32_t;
492 typedef unsigned __int64 uint64_t;
493 #else
494 #include <stdint.h>
495 #endif /* _MSC_VER < 1700 */
496 #else
497 #include <stdint.h>
498 #endif /* _MSC_VER */
499 
500 /* Type of cycle clock implementation */
501 #ifdef GPR_LINUX
502 /* Disable cycle clock by default.
503  TODO(soheil): enable when we support fallback for unstable cycle clocks.
504 #if defined(__i386__)
505 #define GPR_CYCLE_COUNTER_RDTSC_32 1
506 #elif defined(__x86_64__) || defined(__amd64__)
507 #define GPR_CYCLE_COUNTER_RDTSC_64 1
508 #else
509 #define GPR_CYCLE_COUNTER_FALLBACK 1
510 #endif
511 */
512 #define GPR_CYCLE_COUNTER_FALLBACK 1
513 #else
514 #define GPR_CYCLE_COUNTER_FALLBACK 1
515 #endif /* GPR_LINUX */
516 
517 /* Cache line alignment */
518 #ifndef GPR_CACHELINE_SIZE_LOG
519 #if defined(__i386__) || defined(__x86_64__)
520 #define GPR_CACHELINE_SIZE_LOG 6
521 #endif
522 #ifndef GPR_CACHELINE_SIZE_LOG
523 /* A reasonable default guess. Note that overestimates tend to waste more
524  space, while underestimates tend to waste more time. */
525 #define GPR_CACHELINE_SIZE_LOG 6
526 #endif /* GPR_CACHELINE_SIZE_LOG */
527 #endif /* GPR_CACHELINE_SIZE_LOG */
528 
529 #define GPR_CACHELINE_SIZE (1 << GPR_CACHELINE_SIZE_LOG)
530 
531 /* scrub GCC_ATOMIC if it's not available on this compiler */
532 #if defined(GPR_GCC_ATOMIC) && !defined(__ATOMIC_RELAXED)
533 #undef GPR_GCC_ATOMIC
534 #define GPR_GCC_SYNC 1
535 #endif
536 
537 /* Validate platform combinations */
538 #if defined(GPR_GCC_ATOMIC) + defined(GPR_GCC_SYNC) + \
539  defined(GPR_WINDOWS_ATOMIC) != \
540  1
541 #error Must define exactly one of GPR_GCC_ATOMIC, GPR_GCC_SYNC, GPR_WINDOWS_ATOMIC
542 #endif
543 
544 #if defined(GPR_ARCH_32) + defined(GPR_ARCH_64) != 1
545 #error Must define exactly one of GPR_ARCH_32, GPR_ARCH_64
546 #endif
547 
548 #if defined(GPR_CPU_LINUX) + defined(GPR_CPU_POSIX) + defined(GPR_WINDOWS) + \
549  defined(GPR_CPU_IPHONE) + defined(GPR_CPU_CUSTOM) != \
550  1
551 #error Must define exactly one of GPR_CPU_LINUX, GPR_CPU_POSIX, GPR_WINDOWS, GPR_CPU_IPHONE, GPR_CPU_CUSTOM
552 #endif
553 
554 /* maximum alignment needed for any type on this platform, rounded up to a
555  power of two */
556 #define GPR_MAX_ALIGNMENT 16
557 
558 #ifndef GRPC_ARES
559 #define GRPC_ARES 1
560 #endif
561 
562 #ifndef GRPC_IF_NAMETOINDEX
563 #define GRPC_IF_NAMETOINDEX 1
564 #endif
565 
566 #ifndef GRPC_MUST_USE_RESULT
567 #if defined(__GNUC__) && !defined(__MINGW32__)
568 #define GRPC_MUST_USE_RESULT __attribute__((warn_unused_result))
569 #define GPR_ALIGN_STRUCT(n) __attribute__((aligned(n)))
570 #else
571 #define GRPC_MUST_USE_RESULT
572 #define GPR_ALIGN_STRUCT(n)
573 #endif
574 #ifdef USE_STRICT_WARNING
575 /* When building with USE_STRICT_WARNING (which -Werror), types with this
576  attribute will be treated as annotated with warn_unused_result, enforcing
577  returned values of this type should be used.
578  This is added in grpc::Status in mind to address the issue where it always
579  has this annotation internally but OSS doesn't, sometimes causing internal
580  build failure. To prevent this, this is added while not introducing
581  a breaking change to existing user code which may not use returned values
582  of grpc::Status. */
583 #define GRPC_MUST_USE_RESULT_WHEN_USE_STRICT_WARNING GRPC_MUST_USE_RESULT
584 #else
585 #define GRPC_MUST_USE_RESULT_WHEN_USE_STRICT_WARNING
586 #endif
587 #endif
588 
589 #ifndef GRPC_UNUSED
590 #if defined(__GNUC__) && !defined(__MINGW32__)
591 #define GRPC_UNUSED __attribute__((unused))
592 #else
593 #define GRPC_UNUSED
594 #endif
595 #endif
596 
597 #ifndef GPR_PRINT_FORMAT_CHECK
598 #ifdef __GNUC__
599 #define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS) \
600  __attribute__((format(printf, FORMAT_STR, ARGS)))
601 #else
602 #define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS)
603 #endif
604 #endif /* GPR_PRINT_FORMAT_CHECK */
605 
606 #ifndef GPR_HAS_CPP_ATTRIBUTE
607 #ifdef __has_cpp_attribute
608 #define GPR_HAS_CPP_ATTRIBUTE(a) __has_cpp_attribute(a)
609 #else
610 #define GPR_HAS_CPP_ATTRIBUTE(a) 0
611 #endif
612 #endif /* GPR_HAS_CPP_ATTRIBUTE */
613 
614 #ifndef GPR_HAS_ATTRIBUTE
615 #ifdef __has_attribute
616 #define GPR_HAS_ATTRIBUTE(a) __has_attribute(a)
617 #else
618 #define GPR_HAS_ATTRIBUTE(a) 0
619 #endif
620 #endif /* GPR_HAS_ATTRIBUTE */
621 
622 #if GPR_HAS_ATTRIBUTE(noreturn)
623 #define GPR_ATTRIBUTE_NORETURN __attribute__((noreturn))
624 #else
625 #define GPR_ATTRIBUTE_NORETURN
626 #endif
627 
628 #if defined(GPR_FORBID_UNREACHABLE_CODE) && GPR_FORBID_UNREACHABLE_CODE
629 #define GPR_UNREACHABLE_CODE(STATEMENT)
630 #else
631 #ifdef __cplusplus
632 extern "C" {
633 #endif
634 extern void gpr_unreachable_code(const char* reason, const char* file,
636 #ifdef __cplusplus
637 }
638 #endif
639 #define GPR_UNREACHABLE_CODE(STATEMENT) \
640  do { \
641  gpr_unreachable_code(#STATEMENT, __FILE__, __LINE__); \
642  STATEMENT; \
643  } while (0)
644 #endif /* GPR_FORBID_UNREACHABLE_CODE */
645 
646 #ifndef GPRAPI
647 #define GPRAPI
648 #endif
649 
650 #ifndef GRPCAPI
651 #define GRPCAPI GPRAPI
652 #endif
653 
654 #ifndef CENSUSAPI
655 #define CENSUSAPI GRPCAPI
656 #endif
657 
658 #ifndef GPR_HAS_FEATURE
659 #ifdef __has_feature
660 #define GPR_HAS_FEATURE(a) __has_feature(a)
661 #else
662 #define GPR_HAS_FEATURE(a) 0
663 #endif
664 #endif /* GPR_HAS_FEATURE */
665 
666 #ifndef GPR_ATTRIBUTE_NOINLINE
667 #if GPR_HAS_ATTRIBUTE(noinline) || (defined(__GNUC__) && !defined(__clang__))
668 #define GPR_ATTRIBUTE_NOINLINE __attribute__((noinline))
669 #define GPR_HAS_ATTRIBUTE_NOINLINE 1
670 #else
671 #define GPR_ATTRIBUTE_NOINLINE
672 #endif
673 #endif /* GPR_ATTRIBUTE_NOINLINE */
674 
675 #ifndef GPR_NO_UNIQUE_ADDRESS
676 #if GPR_HAS_CPP_ATTRIBUTE(no_unique_address)
677 #define GPR_NO_UNIQUE_ADDRESS [[no_unique_address]]
678 #else
679 #define GPR_NO_UNIQUE_ADDRESS
680 #endif
681 #endif /* GPR_NO_UNIQUE_ADDRESS */
682 
683 #ifndef GRPC_DEPRECATED
684 #if GPR_HAS_CPP_ATTRIBUTE(deprecated)
685 #define GRPC_DEPRECATED(reason) [[deprecated(reason)]]
686 #else
687 #define GRPC_DEPRECATED(reason)
688 #endif
689 #endif /* GRPC_DEPRECATED */
690 
691 #ifndef GPR_ATTRIBUTE_WEAK
692 /* Attribute weak is broken on LLVM/windows:
693  * https://bugs.llvm.org/show_bug.cgi?id=37598 */
694 #if (GPR_HAS_ATTRIBUTE(weak) || (defined(__GNUC__) && !defined(__clang__))) && \
695  !(defined(__llvm__) && defined(_WIN32))
696 #define GPR_ATTRIBUTE_WEAK __attribute__((weak))
697 #define GPR_HAS_ATTRIBUTE_WEAK 1
698 #else
699 #define GPR_ATTRIBUTE_WEAK
700 #endif
701 #endif /* GPR_ATTRIBUTE_WEAK */
702 
703 #ifndef GPR_ATTRIBUTE_NO_TSAN /* (1) */
704 #if GPR_HAS_FEATURE(thread_sanitizer)
705 #define GPR_ATTRIBUTE_NO_TSAN __attribute__((no_sanitize("thread")))
706 #endif /* GPR_HAS_FEATURE */
707 #ifndef GPR_ATTRIBUTE_NO_TSAN /* (2) */
708 #define GPR_ATTRIBUTE_NO_TSAN
709 #endif /* GPR_ATTRIBUTE_NO_TSAN (2) */
710 #endif /* GPR_ATTRIBUTE_NO_TSAN (1) */
711 
712 /* GRPC_TSAN_ENABLED will be defined, when compiled with thread sanitizer. */
713 #ifndef GRPC_TSAN_SUPPRESSED
714 #if defined(__SANITIZE_THREAD__)
715 #define GRPC_TSAN_ENABLED
716 #elif GPR_HAS_FEATURE(thread_sanitizer)
717 #define GRPC_TSAN_ENABLED
718 #endif
719 #endif
720 
721 /* GRPC_ASAN_ENABLED will be defined, when compiled with address sanitizer. */
722 #ifndef GRPC_ASAN_SUPPRESSED
723 #if defined(__SANITIZE_ADDRESS__)
724 #define GRPC_ASAN_ENABLED
725 #elif GPR_HAS_FEATURE(address_sanitizer)
726 #define GRPC_ASAN_ENABLED
727 #endif
728 #endif
729 
730 /* GRPC_ALLOW_EXCEPTIONS should be 0 or 1 if exceptions are allowed or not */
731 #ifndef GRPC_ALLOW_EXCEPTIONS
732 #ifdef GPR_WINDOWS
733 #if defined(_MSC_VER) && defined(_CPPUNWIND)
734 #define GRPC_ALLOW_EXCEPTIONS 1
735 #elif defined(__EXCEPTIONS)
736 #define GRPC_ALLOW_EXCEPTIONS 1
737 #else
738 #define GRPC_ALLOW_EXCEPTIONS 0
739 #endif
740 #else /* GPR_WINDOWS */
741 #ifdef __EXCEPTIONS
742 #define GRPC_ALLOW_EXCEPTIONS 1
743 #else /* __EXCEPTIONS */
744 #define GRPC_ALLOW_EXCEPTIONS 0
745 #endif /* __EXCEPTIONS */
746 #endif /* __GPR_WINDOWS */
747 #endif /* GRPC_ALLOW_EXCEPTIONS */
748 
749 /* Use GPR_LIKELY only in cases where you are sure that a certain outcome is the
750  * most likely. Ideally, also collect performance numbers to justify the claim.
751  */
752 #ifdef __GNUC__
753 #define GPR_LIKELY(x) __builtin_expect((x), 1)
754 #define GPR_UNLIKELY(x) __builtin_expect((x), 0)
755 #else /* __GNUC__ */
756 #define GPR_LIKELY(x) (x)
757 #define GPR_UNLIKELY(x) (x)
758 #endif /* __GNUC__ */
759 
760 #ifndef __STDC_FORMAT_MACROS
761 #define __STDC_FORMAT_MACROS
762 #endif
763 
764 /* MSVC doesn't do the empty base class optimization in debug builds by default,
765  * and because of ABI likely won't.
766  * This enables it for specific types, use as:
767  * class GPR_MSVC_EMPTY_BASE_CLASS_WORKAROUND Foo : public A, public B, public C
768  * {}; */
769 #ifndef GPR_MSVC_EMPTY_BASE_CLASS_WORKAROUND
770 #ifdef GPR_WINDOWS
771 #define GPR_MSVC_EMPTY_BASE_CLASS_WORKAROUND __declspec(empty_bases)
772 #else
773 #define GPR_MSVC_EMPTY_BASE_CLASS_WORKAROUND
774 #endif
775 #endif
776 
777 #define GRPC_CALLBACK_API_NONEXPERIMENTAL
778 
779 /* clang 12 and lower with msan miscompiles destruction of [[no_unique_address]]
780  * members of zero size - for a repro see:
781  * test/core/compiler_bugs/miscompile_with_no_unique_address_test.cc
782  */
783 #ifdef __clang__
784 #if __clang__ && __clang_major__ <= 12 && __has_feature(memory_sanitizer)
785 #undef GPR_NO_UNIQUE_ADDRESS
786 #define GPR_NO_UNIQUE_ADDRESS
787 #endif
788 #endif
789 
790 #endif /* GRPC_SUPPORT_PORT_PLATFORM_H */
GPR_ATTRIBUTE_NORETURN
#define GPR_ATTRIBUTE_NORETURN
Definition: port_platform.h:625
gpr_log_func_args::file
const char * file
Definition: log.h:76
gpr_unreachable_code
void gpr_unreachable_code(const char *reason, const char *file, int line)
gpr_log_func_args::line
int line
Definition: log.h:77