diff options
Diffstat (limited to 'chromium/base/profiler/thread_delegate_mac.cc')
-rw-r--r-- | chromium/base/profiler/thread_delegate_mac.cc | 104 |
1 files changed, 0 insertions, 104 deletions
diff --git a/chromium/base/profiler/thread_delegate_mac.cc b/chromium/base/profiler/thread_delegate_mac.cc deleted file mode 100644 index 7632c4efed5..00000000000 --- a/chromium/base/profiler/thread_delegate_mac.cc +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/profiler/thread_delegate_mac.h" - -#include <mach/mach.h> -#include <mach/thread_act.h> -#include <pthread.h> - -#include "base/logging.h" -#include "base/mac/mach_logging.h" -#include "base/profiler/profile_builder.h" - -// IMPORTANT NOTE: Some functions within this implementation are invoked while -// the target thread is suspended so it must not do any allocation from the -// heap, including indirectly via use of DCHECK/CHECK or other logging -// statements. Otherwise this code can deadlock on heap locks acquired by the -// target thread before it was suspended. These functions are commented with "NO -// HEAP ALLOCATIONS". - -namespace base { - -namespace { - -// Fills |state| with |target_thread|'s context. NO HEAP ALLOCATIONS. -bool GetThreadState(thread_act_t target_thread, x86_thread_state64_t* state) { - auto count = static_cast<mach_msg_type_number_t>(x86_THREAD_STATE64_COUNT); - return thread_get_state(target_thread, x86_THREAD_STATE64, - reinterpret_cast<thread_state_t>(state), - &count) == KERN_SUCCESS; -} - -} // namespace - -// ScopedSuspendThread -------------------------------------------------------- - -// NO HEAP ALLOCATIONS after thread_suspend. -ThreadDelegateMac::ScopedSuspendThread::ScopedSuspendThread( - mach_port_t thread_port) - : thread_port_(thread_suspend(thread_port) == KERN_SUCCESS - ? thread_port - : MACH_PORT_NULL) {} - -// NO HEAP ALLOCATIONS. The MACH_CHECK is OK because it provides a more noisy -// failure mode than deadlocking. -ThreadDelegateMac::ScopedSuspendThread::~ScopedSuspendThread() { - if (!WasSuccessful()) - return; - - kern_return_t kr = thread_resume(thread_port_); - MACH_CHECK(kr == KERN_SUCCESS, kr) << "thread_resume"; -} - -bool ThreadDelegateMac::ScopedSuspendThread::WasSuccessful() const { - return thread_port_ != MACH_PORT_NULL; -} - -// ThreadDelegateMac ---------------------------------------------------------- - -ThreadDelegateMac::ThreadDelegateMac(mach_port_t thread_port) - : thread_port_(thread_port), - thread_stack_base_address_(reinterpret_cast<uintptr_t>( - pthread_get_stackaddr_np(pthread_from_mach_thread_np(thread_port)))) { - // This class suspends threads, and those threads might be suspended in dyld. - // Therefore, for all the system functions that might be linked in dynamically - // that are used while threads are suspended, make calls to them to make sure - // that they are linked up. - x86_thread_state64_t thread_state; - GetThreadState(thread_port_, &thread_state); -} - -ThreadDelegateMac::~ThreadDelegateMac() = default; - -std::unique_ptr<ThreadDelegate::ScopedSuspendThread> -ThreadDelegateMac::CreateScopedSuspendThread() { - return std::make_unique<ScopedSuspendThread>(thread_port_); -} - -// NO HEAP ALLOCATIONS. -bool ThreadDelegateMac::GetThreadContext(x86_thread_state64_t* thread_context) { - return GetThreadState(thread_port_, thread_context); -} - -// NO HEAP ALLOCATIONS. -uintptr_t ThreadDelegateMac::GetStackBaseAddress() const { - return thread_stack_base_address_; -} - -// NO HEAP ALLOCATIONS. -bool ThreadDelegateMac::CanCopyStack(uintptr_t stack_pointer) { - return true; -} - -std::vector<uintptr_t*> ThreadDelegateMac::GetRegistersToRewrite( - x86_thread_state64_t* thread_context) { - return { - &AsUintPtr(&thread_context->__rbx), &AsUintPtr(&thread_context->__rbp), - &AsUintPtr(&thread_context->__rsp), &AsUintPtr(&thread_context->__r12), - &AsUintPtr(&thread_context->__r13), &AsUintPtr(&thread_context->__r14), - &AsUintPtr(&thread_context->__r15)}; -} - -} // namespace base |