// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "partition_alloc/partition_alloc_base/threading/platform_thread.h" #include <pthread.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <cerrno> #include <cstddef> #include <cstdint> #include "partition_alloc/build_config.h" #include "partition_alloc/buildflags.h" #include "partition_alloc/partition_alloc_base/logging.h" #include "partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h" #if PA_BUILDFLAG(IS_LINUX) || PA_BUILDFLAG(IS_CHROMEOS) #include <sys/syscall.h> #include <atomic> #endif #if PA_BUILDFLAG(IS_FUCHSIA) #include <zircon/process.h> #endif namespace partition_alloc::internal::base { #if PA_BUILDFLAG(IS_LINUX) || PA_BUILDFLAG(IS_CHROMEOS) namespace { // Store the thread ids in local storage since calling the SWI can be // expensive and PlatformThread::CurrentId is used liberally. thread_local pid_t g_thread_id = …; // A boolean value that indicates that the value stored in |g_thread_id| on the // main thread is invalid, because it hasn't been updated since the process // forked. // // This used to work by setting |g_thread_id| to -1 in a pthread_atfork handler. // However, when a multithreaded process forks, it is only allowed to call // async-signal-safe functions until it calls an exec() syscall. However, // accessing TLS may allocate (see crbug.com/1275748), which is not // async-signal-safe and therefore causes deadlocks, corruption, and crashes. // // It's Atomic to placate TSAN. std::atomic<bool> g_main_thread_tid_cache_valid = …; // Tracks whether the current thread is the main thread, and therefore whether // |g_main_thread_tid_cache_valid| is relevant for the current thread. This is // also updated by PlatformThread::CurrentId(). thread_local bool g_is_main_thread = …; class InitAtFork { … }; } // namespace namespace internal { void InvalidateTidCache() { … } } // namespace internal #endif // PA_BUILDFLAG(IS_LINUX) || PA_BUILDFLAG(IS_CHROMEOS) // static PlatformThreadId PlatformThread::CurrentId() { … } // static PlatformThreadRef PlatformThread::CurrentRef() { … } // static void PlatformThread::Sleep(TimeDelta duration) { … } } // namespace partition_alloc::internal::base