diff options
Diffstat (limited to 'source/Plugins/Process/Linux/SingleStepCheck.h')
-rw-r--r-- | source/Plugins/Process/Linux/SingleStepCheck.h | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/source/Plugins/Process/Linux/SingleStepCheck.h b/source/Plugins/Process/Linux/SingleStepCheck.h index 6e3310da840b..afeda7310349 100644 --- a/source/Plugins/Process/Linux/SingleStepCheck.h +++ b/source/Plugins/Process/Linux/SingleStepCheck.h @@ -10,30 +10,47 @@ #ifndef liblldb_SingleStepCheck_H_ #define liblldb_SingleStepCheck_H_ +#include <memory> +#include <sched.h> +#include <sys/types.h> + namespace lldb_private { namespace process_linux { -namespace impl { -extern bool SingleStepWorkaroundNeeded(); -} - // arm64 linux had a bug which prevented single-stepping and watchpoints from -// working on non-boot -// cpus, due to them being incorrectly initialized after coming out of suspend. -// This issue is -// particularly affecting android M, which uses suspend ("doze mode") quite -// aggressively. This -// code detects that situation and makes single-stepping work by doing all the -// step operations on +// working on non-boot cpus, due to them being incorrectly initialized after +// coming out of suspend. This issue is particularly affecting android M, which +// uses suspend ("doze mode") quite aggressively. This code detects that +// situation and makes single-stepping work by doing all the step operations on // the boot cpu. // // The underlying issue has been fixed in android N and linux 4.4. This code can -// be removed once -// these systems become obsolete. -inline bool SingleStepWorkaroundNeeded() { - static bool value = impl::SingleStepWorkaroundNeeded(); - return value; -} +// be removed once these systems become obsolete. + +#if defined(__arm64__) || defined(__aarch64__) +class SingleStepWorkaround { + ::pid_t m_tid; + cpu_set_t m_original_set; + + SingleStepWorkaround(const SingleStepWorkaround &) = delete; + void operator=(const SingleStepWorkaround &) = delete; + +public: + SingleStepWorkaround(::pid_t tid, cpu_set_t original_set) + : m_tid(tid), m_original_set(original_set) {} + ~SingleStepWorkaround(); + + static std::unique_ptr<SingleStepWorkaround> Get(::pid_t tid); +}; +#else +class SingleStepWorkaround { +public: + static std::unique_ptr<SingleStepWorkaround> Get(::pid_t tid) { + return nullptr; + } +}; +#endif + } // end namespace process_linux } // end namespace lldb_private |