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 <[email protected]> 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 <[email protected]> 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, 635 int line) GPR_ATTRIBUTE_NORETURN; 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 */ 791