| Index: minidump/minidump_thread_writer.cc
|
| diff --git a/minidump/minidump_thread_writer.cc b/minidump/minidump_thread_writer.cc
|
| index efca1bda3e49512b36f7b772784b59de8ae3ac5b..814473d086a66fc18a2a4ed196947c290a386103 100644
|
| --- a/minidump/minidump_thread_writer.cc
|
| +++ b/minidump/minidump_thread_writer.cc
|
| @@ -19,6 +19,8 @@
|
| #include "base/logging.h"
|
| #include "minidump/minidump_context_writer.h"
|
| #include "minidump/minidump_memory_writer.h"
|
| +#include "snapshot/memory_snapshot.h"
|
| +#include "snapshot/thread_snapshot.h"
|
| #include "util/file/file_writer.h"
|
| #include "util/numeric/safe_assignment.h"
|
|
|
| @@ -31,6 +33,33 @@ MinidumpThreadWriter::MinidumpThreadWriter()
|
| MinidumpThreadWriter::~MinidumpThreadWriter() {
|
| }
|
|
|
| +void MinidumpThreadWriter::InitializeFromSnapshot(
|
| + const ThreadSnapshot* thread_snapshot,
|
| + const MinidumpThreadIDMap* thread_id_map) {
|
| + DCHECK_EQ(state(), kStateMutable);
|
| + DCHECK(!stack_);
|
| + DCHECK(!context_);
|
| +
|
| + auto thread_id_it = thread_id_map->find(thread_snapshot->ThreadID());
|
| + DCHECK(thread_id_it != thread_id_map->end());
|
| + SetThreadID(thread_id_it->second);
|
| +
|
| + SetSuspendCount(thread_snapshot->SuspendCount());
|
| + SetPriority(thread_snapshot->Priority());
|
| + SetTEB(thread_snapshot->ThreadSpecificDataAddress());
|
| +
|
| + const MemorySnapshot* stack_snapshot = thread_snapshot->Stack();
|
| + if (stack_snapshot && stack_snapshot->Size() > 0) {
|
| + scoped_ptr<MinidumpMemoryWriter> stack =
|
| + MinidumpMemoryWriter::CreateFromSnapshot(stack_snapshot);
|
| + SetStack(stack.Pass());
|
| + }
|
| +
|
| + scoped_ptr<MinidumpContextWriter> context =
|
| + MinidumpContextWriter::CreateFromSnapshot(thread_snapshot->Context());
|
| + SetContext(context.Pass());
|
| +}
|
| +
|
| const MINIDUMP_THREAD* MinidumpThreadWriter::MinidumpThread() const {
|
| DCHECK_EQ(state(), kStateWritable);
|
|
|
| @@ -108,6 +137,21 @@ MinidumpThreadListWriter::MinidumpThreadListWriter()
|
| MinidumpThreadListWriter::~MinidumpThreadListWriter() {
|
| }
|
|
|
| +void MinidumpThreadListWriter::InitializeFromSnapshot(
|
| + const std::vector<const ThreadSnapshot*>& thread_snapshots,
|
| + MinidumpThreadIDMap* thread_id_map) {
|
| + DCHECK_EQ(state(), kStateMutable);
|
| + DCHECK(threads_.empty());
|
| +
|
| + BuildMinidumpThreadIDMap(thread_snapshots, thread_id_map);
|
| +
|
| + for (const ThreadSnapshot* thread_snapshot : thread_snapshots) {
|
| + auto thread = make_scoped_ptr(new MinidumpThreadWriter());
|
| + thread->InitializeFromSnapshot(thread_snapshot, thread_id_map);
|
| + AddThread(thread.Pass());
|
| + }
|
| +}
|
| +
|
| void MinidumpThreadListWriter::SetMemoryListWriter(
|
| MinidumpMemoryListWriter* memory_list_writer) {
|
| DCHECK_EQ(state(), kStateMutable);
|
|
|