diff options
Diffstat (limited to 'chromium/base/profiler/suspendable_thread_delegate_win.h')
-rw-r--r-- | chromium/base/profiler/suspendable_thread_delegate_win.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/chromium/base/profiler/suspendable_thread_delegate_win.h b/chromium/base/profiler/suspendable_thread_delegate_win.h new file mode 100644 index 00000000000..2452dbe47db --- /dev/null +++ b/chromium/base/profiler/suspendable_thread_delegate_win.h @@ -0,0 +1,60 @@ +// 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. + +#ifndef BASE_PROFILER_SUSPENDABLE_THREAD_DELEGATE_WIN_H_ +#define BASE_PROFILER_SUSPENDABLE_THREAD_DELEGATE_WIN_H_ + +#include <windows.h> + +#include "base/base_export.h" +#include "base/profiler/suspendable_thread_delegate.h" +#include "base/threading/platform_thread.h" +#include "base/win/scoped_handle.h" + +namespace base { + +// Platform- and thread-specific implementation in support of stack sampling on +// Windows. +class BASE_EXPORT SuspendableThreadDelegateWin + : public SuspendableThreadDelegate { + public: + class ScopedSuspendThread + : public SuspendableThreadDelegate::ScopedSuspendThread { + public: + explicit ScopedSuspendThread(HANDLE thread_handle); + ~ScopedSuspendThread() override; + + bool WasSuccessful() const override; + + private: + HANDLE thread_handle_; + bool was_successful_; + + DISALLOW_COPY_AND_ASSIGN(ScopedSuspendThread); + }; + + explicit SuspendableThreadDelegateWin(PlatformThreadId thread_id); + ~SuspendableThreadDelegateWin() override; + + SuspendableThreadDelegateWin(const SuspendableThreadDelegateWin&) = delete; + SuspendableThreadDelegateWin& operator=(const SuspendableThreadDelegateWin&) = + delete; + + // SuspendableThreadDelegate + std::unique_ptr<SuspendableThreadDelegate::ScopedSuspendThread> + CreateScopedSuspendThread() override; + bool GetThreadContext(CONTEXT* thread_context) override; + uintptr_t GetStackBaseAddress() const override; + bool CanCopyStack(uintptr_t stack_pointer) override; + std::vector<uintptr_t*> GetRegistersToRewrite( + CONTEXT* thread_context) override; + + private: + win::ScopedHandle thread_handle_; + const uintptr_t thread_stack_base_address_; +}; + +} // namespace base + +#endif // BASE_PROFILER_SUSPENDABLE_THREAD_DELEGATE_WIN_H_ |