diff options
author | Christopher Ferris <cferris@google.com> | 2013-10-29 20:21:58 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-10-29 20:21:58 +0000 |
commit | 98f87d92d89079f274374409efcf57ca52b13c1f (patch) | |
tree | c7fd6c88609e76db97c797aee16c34e3269062a7 /libbacktrace/BacktraceThread.h | |
parent | 87af04a42ec2d959cced0f1c01888f9cf3b2b9c5 (diff) | |
parent | 17e91d44edf5e6476a477a200bcd89d4327358a3 (diff) | |
download | system_core-98f87d92d89079f274374409efcf57ca52b13c1f.zip system_core-98f87d92d89079f274374409efcf57ca52b13c1f.tar.gz system_core-98f87d92d89079f274374409efcf57ca52b13c1f.tar.bz2 |
Merge "Rewrite libbacktrace using C++."
Diffstat (limited to 'libbacktrace/BacktraceThread.h')
-rw-r--r-- | libbacktrace/BacktraceThread.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/libbacktrace/BacktraceThread.h b/libbacktrace/BacktraceThread.h new file mode 100644 index 0000000..afea771 --- /dev/null +++ b/libbacktrace/BacktraceThread.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBBACKTRACE_BACKTRACE_THREAD_H +#define _LIBBACKTRACE_BACKTRACE_THREAD_H + +#include <inttypes.h> +#include <pthread.h> +#include <sys/types.h> + +#include "Backtrace.h" + +typedef enum { + STATE_WAITING = 0, + STATE_DUMPING, + STATE_DONE, + STATE_CANCEL, +} state_e; + +class BacktraceThreadInterface; + +class ThreadEntry { +public: + ThreadEntry( + BacktraceThreadInterface* impl, pid_t pid, pid_t tid, + size_t num_ignore_frames); + ~ThreadEntry(); + + bool Match(pid_t pid, pid_t tid) { return (pid == pid_ && tid == tid_); } + + static ThreadEntry* AddThreadToUnwind( + BacktraceThreadInterface* thread_intf, pid_t pid, pid_t tid, + size_t num_ignored_frames); + + BacktraceThreadInterface* thread_intf_; + pid_t pid_; + pid_t tid_; + ThreadEntry* next_; + ThreadEntry* prev_; + int32_t state_; + int num_ignore_frames_; +}; + +// Interface class that does not contain any local storage, only defines +// virtual functions to be defined by subclasses. +class BacktraceThreadInterface { +public: + virtual ~BacktraceThreadInterface() { } + + virtual bool Init() = 0; + + virtual void ThreadUnwind( + siginfo_t* siginfo, void* sigcontext, size_t num_ignore_frames) = 0; +}; + +class BacktraceThread : public BacktraceCurrent { +public: + // impl and thread_intf should point to the same object, this allows + // the compiler to catch if an implementation does not properly + // subclass both. + BacktraceThread( + BacktraceImpl* impl, BacktraceThreadInterface* thread_intf, pid_t tid); + virtual ~BacktraceThread(); + + virtual bool Unwind(size_t num_ignore_frames); + + virtual void ThreadUnwind( + siginfo_t* siginfo, void* sigcontext, size_t num_ignore_frames) { + thread_intf_->ThreadUnwind(siginfo, sigcontext, num_ignore_frames); + } + +private: + virtual bool TriggerUnwindOnThread(ThreadEntry* entry); + + virtual void FinishUnwind(); + + BacktraceThreadInterface* thread_intf_; +}; + +#endif // _LIBBACKTRACE_BACKTRACE_THREAD_H |