diff options
Diffstat (limited to 'third_party/abseil-cpp/absl/base/internal/sysinfo.cc')
-rw-r--r-- | third_party/abseil-cpp/absl/base/internal/sysinfo.cc | 102 |
1 files changed, 5 insertions, 97 deletions
diff --git a/third_party/abseil-cpp/absl/base/internal/sysinfo.cc b/third_party/abseil-cpp/absl/base/internal/sysinfo.cc index a7cfb461f3..a0930e9781 100644 --- a/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +++ b/third_party/abseil-cpp/absl/base/internal/sysinfo.cc @@ -39,7 +39,6 @@ #endif #include <string.h> - #include <cassert> #include <cstdint> #include <cstdio> @@ -51,88 +50,17 @@ #include <vector> #include "absl/base/call_once.h" -#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/internal/spinlock.h" #include "absl/base/internal/unscaledcycleclock.h" -#include "absl/base/thread_annotations.h" namespace absl { ABSL_NAMESPACE_BEGIN namespace base_internal { -namespace { - -#if defined(_WIN32) - -// Returns number of bits set in `bitMask` -DWORD Win32CountSetBits(ULONG_PTR bitMask) { - for (DWORD bitSetCount = 0; ; ++bitSetCount) { - if (bitMask == 0) return bitSetCount; - bitMask &= bitMask - 1; - } -} - -// Returns the number of logical CPUs using GetLogicalProcessorInformation(), or -// 0 if the number of processors is not available or can not be computed. -// https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getlogicalprocessorinformation -int Win32NumCPUs() { -#pragma comment(lib, "kernel32.lib") - using Info = SYSTEM_LOGICAL_PROCESSOR_INFORMATION; - - DWORD info_size = sizeof(Info); - Info* info(static_cast<Info*>(malloc(info_size))); - if (info == nullptr) return 0; - - bool success = GetLogicalProcessorInformation(info, &info_size); - if (!success && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { - free(info); - info = static_cast<Info*>(malloc(info_size)); - if (info == nullptr) return 0; - success = GetLogicalProcessorInformation(info, &info_size); - } - - DWORD logicalProcessorCount = 0; - if (success) { - Info* ptr = info; - DWORD byteOffset = 0; - while (byteOffset + sizeof(Info) <= info_size) { - switch (ptr->Relationship) { - case RelationProcessorCore: - logicalProcessorCount += Win32CountSetBits(ptr->ProcessorMask); - break; - - case RelationNumaNode: - case RelationCache: - case RelationProcessorPackage: - // Ignore other entries - break; - - default: - // Ignore unknown entries - break; - } - byteOffset += sizeof(Info); - ptr++; - } - } - free(info); - return logicalProcessorCount; -} - -#endif - -} // namespace - - static int GetNumCPUs() { #if defined(__myriad2__) return 1; -#elif defined(_WIN32) - const unsigned hardware_concurrency = Win32NumCPUs(); - return hardware_concurrency ? hardware_concurrency : 1; -#elif defined(_AIX) - return sysconf(_SC_NPROCESSORS_ONLN); #else // Other possibilities: // - Read /sys/devices/system/cpu/online and use cpumask_parse() @@ -144,12 +72,6 @@ static int GetNumCPUs() { #if defined(_WIN32) static double GetNominalCPUFrequency() { -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && \ - !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - // UWP apps don't have access to the registry and currently don't provide an - // API informing about CPU nominal frequency. - return 1.0; -#else #pragma comment(lib, "advapi32.lib") // For Reg* functions. HKEY key; // Use the Reg* functions rather than the SH functions because shlwapi.dll @@ -169,7 +91,6 @@ static double GetNominalCPUFrequency() { } } return 1.0; -#endif // WINAPI_PARTITION_APP && !WINAPI_PARTITION_DESKTOP } #elif defined(CTL_HW) && defined(HW_CPU_FREQ) @@ -415,16 +336,15 @@ pid_t GetTID() { #else // Fallback implementation of GetTID using pthread_getspecific. -ABSL_CONST_INIT static once_flag tid_once; -ABSL_CONST_INIT static pthread_key_t tid_key; -ABSL_CONST_INIT static absl::base_internal::SpinLock tid_lock( - absl::kConstInit, base_internal::SCHEDULE_KERNEL_ONLY); +static once_flag tid_once; +static pthread_key_t tid_key; +static absl::base_internal::SpinLock tid_lock( + absl::base_internal::kLinkerInitialized); // We set a bit per thread in this array to indicate that an ID is in // use. ID 0 is unused because it is the default value returned by // pthread_getspecific(). -ABSL_CONST_INIT static std::vector<uint32_t> *tid_array - ABSL_GUARDED_BY(tid_lock) = nullptr; +static std::vector<uint32_t>* tid_array GUARDED_BY(tid_lock) = nullptr; static constexpr int kBitsPerWord = 32; // tid_array is uint32_t. // Returns the TID to tid_array. @@ -491,18 +411,6 @@ pid_t GetTID() { #endif -// GetCachedTID() caches the thread ID in thread-local storage (which is a -// userspace construct) to avoid unnecessary system calls. Without this caching, -// it can take roughly 98ns, while it takes roughly 1ns with this caching. -pid_t GetCachedTID() { -#ifdef ABSL_HAVE_THREAD_LOCAL - static thread_local pid_t thread_id = GetTID(); - return thread_id; -#else - return GetTID(); -#endif // ABSL_HAVE_THREAD_LOCAL -} - } // namespace base_internal ABSL_NAMESPACE_END } // namespace absl |