Index: minidump/minidump_module_crashpad_info_writer.cc |
diff --git a/minidump/minidump_module_crashpad_info_writer.cc b/minidump/minidump_module_crashpad_info_writer.cc |
index 08f1ed7c356c8dadfd82c7b5569c197d7479b546..8868badbd8a1e889ad240543f914fa5a101e943a 100644 |
--- a/minidump/minidump_module_crashpad_info_writer.cc |
+++ b/minidump/minidump_module_crashpad_info_writer.cc |
@@ -36,18 +36,11 @@ MinidumpModuleCrashpadInfoWriter::~MinidumpModuleCrashpadInfoWriter() { |
} |
void MinidumpModuleCrashpadInfoWriter::InitializeFromSnapshot( |
- const ModuleSnapshot* module_snapshot, size_t module_list_index) { |
+ const ModuleSnapshot* module_snapshot) { |
DCHECK_EQ(state(), kStateMutable); |
DCHECK(!list_annotations_); |
DCHECK(!simple_annotations_); |
- uint32_t module_list_index_u32; |
- if (!AssignIfInRange(&module_list_index_u32, module_list_index)) { |
- LOG(ERROR) << "module_list_index " << module_list_index << " out of range"; |
- return; |
- } |
- SetMinidumpModuleListIndex(module_list_index_u32); |
- |
auto list_annotations = make_scoped_ptr(new MinidumpUTF8StringListWriter()); |
list_annotations->InitializeFromVector(module_snapshot->AnnotationsVector()); |
if (list_annotations->IsUseful()) { |
@@ -129,7 +122,10 @@ bool MinidumpModuleCrashpadInfoWriter::WriteObject( |
} |
MinidumpModuleCrashpadInfoListWriter::MinidumpModuleCrashpadInfoListWriter() |
- : MinidumpLocationDescriptorListWriter() { |
+ : MinidumpWritable(), |
+ module_crashpad_infos_(), |
+ module_crashpad_info_links_(), |
+ module_crashpad_info_list_base_() { |
} |
MinidumpModuleCrashpadInfoListWriter::~MinidumpModuleCrashpadInfoListWriter() { |
@@ -138,30 +134,106 @@ MinidumpModuleCrashpadInfoListWriter::~MinidumpModuleCrashpadInfoListWriter() { |
void MinidumpModuleCrashpadInfoListWriter::InitializeFromSnapshot( |
const std::vector<const ModuleSnapshot*>& module_snapshots) { |
DCHECK_EQ(state(), kStateMutable); |
- DCHECK(IsEmpty()); |
- DCHECK(child_location_descriptors().empty()); |
+ DCHECK(module_crashpad_infos_.empty()); |
+ DCHECK(module_crashpad_info_links_.empty()); |
size_t count = module_snapshots.size(); |
for (size_t index = 0; index < count; ++index) { |
const ModuleSnapshot* module_snapshot = module_snapshots[index]; |
auto module = make_scoped_ptr(new MinidumpModuleCrashpadInfoWriter()); |
- module->InitializeFromSnapshot(module_snapshot, index); |
+ module->InitializeFromSnapshot(module_snapshot); |
if (module->IsUseful()) { |
- AddModule(module.Pass()); |
+ AddModule(module.Pass(), index); |
} |
} |
} |
void MinidumpModuleCrashpadInfoListWriter::AddModule( |
- scoped_ptr<MinidumpModuleCrashpadInfoWriter> module) { |
+ scoped_ptr<MinidumpModuleCrashpadInfoWriter> module_crashpad_info, |
+ size_t minidump_module_list_index) { |
DCHECK_EQ(state(), kStateMutable); |
+ DCHECK_EQ(module_crashpad_infos_.size(), module_crashpad_info_links_.size()); |
+ |
+ MinidumpModuleCrashpadInfoLink module_crashpad_info_link = {}; |
+ if (!AssignIfInRange(&module_crashpad_info_link.minidump_module_list_index, |
+ minidump_module_list_index)) { |
+ LOG(ERROR) << "minidump_module_list_index " << minidump_module_list_index |
+ << " out of range"; |
+ return; |
+ } |
- AddChild(module.Pass()); |
+ module_crashpad_info_links_.push_back(module_crashpad_info_link); |
+ module_crashpad_infos_.push_back(module_crashpad_info.release()); |
} |
bool MinidumpModuleCrashpadInfoListWriter::IsUseful() const { |
- return !IsEmpty(); |
+ DCHECK_EQ(module_crashpad_infos_.size(), module_crashpad_info_links_.size()); |
+ return !module_crashpad_infos_.empty(); |
+} |
+ |
+bool MinidumpModuleCrashpadInfoListWriter::Freeze() { |
+ DCHECK_EQ(state(), kStateMutable); |
+ CHECK_EQ(module_crashpad_infos_.size(), module_crashpad_info_links_.size()); |
+ |
+ if (!MinidumpWritable::Freeze()) { |
+ return false; |
+ } |
+ |
+ size_t module_count = module_crashpad_infos_.size(); |
+ if (!AssignIfInRange(&module_crashpad_info_list_base_.count, module_count)) { |
+ LOG(ERROR) << "module_count " << module_count << " out of range"; |
+ return false; |
+ } |
+ |
+ for (size_t index = 0; index < module_count; ++index) { |
+ module_crashpad_infos_[index]->RegisterLocationDescriptor( |
+ &module_crashpad_info_links_[index].location); |
+ } |
+ |
+ return true; |
+} |
+ |
+size_t MinidumpModuleCrashpadInfoListWriter::SizeOfObject() { |
+ DCHECK_GE(state(), kStateFrozen); |
+ DCHECK_EQ(module_crashpad_infos_.size(), module_crashpad_info_links_.size()); |
+ |
+ return sizeof(module_crashpad_info_list_base_) + |
+ module_crashpad_info_links_.size() * |
+ sizeof(module_crashpad_info_links_[0]); |
+} |
+ |
+std::vector<internal::MinidumpWritable*> |
+MinidumpModuleCrashpadInfoListWriter::Children() { |
+ DCHECK_GE(state(), kStateFrozen); |
+ DCHECK_EQ(module_crashpad_infos_.size(), module_crashpad_info_links_.size()); |
+ |
+ std::vector<MinidumpWritable*> children; |
+ for (MinidumpModuleCrashpadInfoWriter* module : module_crashpad_infos_) { |
+ children.push_back(module); |
+ } |
+ |
+ return children; |
+} |
+ |
+bool MinidumpModuleCrashpadInfoListWriter::WriteObject( |
+ FileWriterInterface* file_writer) { |
+ DCHECK_EQ(state(), kStateWritable); |
+ DCHECK_EQ(module_crashpad_infos_.size(), module_crashpad_info_links_.size()); |
+ |
+ WritableIoVec iov; |
+ iov.iov_base = &module_crashpad_info_list_base_; |
+ iov.iov_len = sizeof(module_crashpad_info_list_base_); |
+ std::vector<WritableIoVec> iovecs(1, iov); |
+ |
+ if (!module_crashpad_info_links_.empty()) { |
+ iov.iov_base = &module_crashpad_info_links_[0]; |
+ iov.iov_len = module_crashpad_info_links_.size() * |
+ sizeof(module_crashpad_info_links_[0]); |
+ iovecs.push_back(iov); |
+ } |
+ |
+ return file_writer->WriteIoVec(&iovecs); |
} |
} // namespace crashpad |