OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 } | 98 } |
99 | 99 |
100 bool MinidumpModuleCrashpadInfoWriter::WriteObject( | 100 bool MinidumpModuleCrashpadInfoWriter::WriteObject( |
101 FileWriterInterface* file_writer) { | 101 FileWriterInterface* file_writer) { |
102 DCHECK_EQ(state(), kStateWritable); | 102 DCHECK_EQ(state(), kStateWritable); |
103 | 103 |
104 return file_writer->Write(&module_, sizeof(module_)); | 104 return file_writer->Write(&module_, sizeof(module_)); |
105 } | 105 } |
106 | 106 |
107 MinidumpModuleCrashpadInfoListWriter::MinidumpModuleCrashpadInfoListWriter() | 107 MinidumpModuleCrashpadInfoListWriter::MinidumpModuleCrashpadInfoListWriter() |
108 : MinidumpWritable(), | 108 : MinidumpLocationDescriptorListWriter() { |
109 module_list_base_(), | |
110 modules_(), | |
111 module_location_descriptors_() { | |
112 } | 109 } |
113 | 110 |
114 MinidumpModuleCrashpadInfoListWriter::~MinidumpModuleCrashpadInfoListWriter() { | 111 MinidumpModuleCrashpadInfoListWriter::~MinidumpModuleCrashpadInfoListWriter() { |
115 } | 112 } |
116 | 113 |
117 void MinidumpModuleCrashpadInfoListWriter::InitializeFromSnapshot( | 114 void MinidumpModuleCrashpadInfoListWriter::InitializeFromSnapshot( |
118 const std::vector<const ModuleSnapshot*>& module_snapshots) { | 115 const std::vector<const ModuleSnapshot*>& module_snapshots) { |
119 DCHECK_EQ(state(), kStateMutable); | 116 DCHECK_EQ(state(), kStateMutable); |
120 DCHECK(modules_.empty()); | 117 DCHECK(children().empty()); |
121 DCHECK(module_location_descriptors_.empty()); | 118 DCHECK(child_location_descriptors().empty()); |
122 | 119 |
123 size_t count = module_snapshots.size(); | 120 size_t count = module_snapshots.size(); |
124 for (size_t index = 0; index < count; ++index) { | 121 for (size_t index = 0; index < count; ++index) { |
125 const ModuleSnapshot* module_snapshot = module_snapshots[index]; | 122 const ModuleSnapshot* module_snapshot = module_snapshots[index]; |
126 | 123 |
127 auto module = make_scoped_ptr(new MinidumpModuleCrashpadInfoWriter()); | 124 auto module = make_scoped_ptr(new MinidumpModuleCrashpadInfoWriter()); |
128 module->InitializeFromSnapshot(module_snapshot, index); | 125 module->InitializeFromSnapshot(module_snapshot, index); |
129 if (module->IsUseful()) { | 126 if (module->IsUseful()) { |
130 AddModule(module.Pass()); | 127 AddModule(module.Pass()); |
131 } | 128 } |
132 } | 129 } |
133 } | 130 } |
134 | 131 |
135 void MinidumpModuleCrashpadInfoListWriter::AddModule( | 132 void MinidumpModuleCrashpadInfoListWriter::AddModule( |
136 scoped_ptr<MinidumpModuleCrashpadInfoWriter> module) { | 133 scoped_ptr<MinidumpModuleCrashpadInfoWriter> module) { |
137 DCHECK_EQ(state(), kStateMutable); | 134 DCHECK_EQ(state(), kStateMutable); |
138 | 135 |
139 modules_.push_back(module.release()); | 136 AddChild(module.Pass()); |
140 } | |
141 | |
142 bool MinidumpModuleCrashpadInfoListWriter::Freeze() { | |
143 DCHECK_EQ(state(), kStateMutable); | |
144 DCHECK(module_location_descriptors_.empty()); | |
145 | |
146 if (!MinidumpWritable::Freeze()) { | |
147 return false; | |
148 } | |
149 | |
150 size_t module_count = modules_.size(); | |
151 if (!AssignIfInRange(&module_list_base_.count, module_count)) { | |
152 LOG(ERROR) << "module_count " << module_count << " out of range"; | |
153 return false; | |
154 } | |
155 | |
156 module_location_descriptors_.resize(module_count); | |
157 for (size_t index = 0; index < module_count; ++index) { | |
158 modules_[index]->RegisterLocationDescriptor( | |
159 &module_location_descriptors_[index]); | |
160 } | |
161 | |
162 return true; | |
163 } | |
164 | |
165 size_t MinidumpModuleCrashpadInfoListWriter::SizeOfObject() { | |
166 DCHECK_GE(state(), kStateFrozen); | |
167 | |
168 return sizeof(module_list_base_) + | |
169 modules_.size() * sizeof(MINIDUMP_LOCATION_DESCRIPTOR); | |
170 } | |
171 | |
172 std::vector<internal::MinidumpWritable*> | |
173 MinidumpModuleCrashpadInfoListWriter::Children() { | |
174 DCHECK_GE(state(), kStateFrozen); | |
175 | |
176 std::vector<MinidumpWritable*> children; | |
177 for (MinidumpModuleCrashpadInfoWriter* module : modules_) { | |
178 children.push_back(module); | |
179 } | |
180 | |
181 return children; | |
182 } | |
183 | |
184 bool MinidumpModuleCrashpadInfoListWriter::WriteObject( | |
185 FileWriterInterface* file_writer) { | |
186 DCHECK_EQ(state(), kStateWritable); | |
187 DCHECK_EQ(modules_.size(), module_location_descriptors_.size()); | |
188 | |
189 WritableIoVec iov; | |
190 iov.iov_base = &module_list_base_; | |
191 iov.iov_len = sizeof(module_list_base_); | |
192 std::vector<WritableIoVec> iovecs(1, iov); | |
193 | |
194 if (!module_location_descriptors_.empty()) { | |
195 iov.iov_base = &module_location_descriptors_[0]; | |
196 iov.iov_len = module_location_descriptors_.size() * | |
197 sizeof(MINIDUMP_LOCATION_DESCRIPTOR); | |
198 iovecs.push_back(iov); | |
199 } | |
200 | |
201 return file_writer->WriteIoVec(&iovecs); | |
202 } | 137 } |
203 | 138 |
204 } // namespace crashpad | 139 } // namespace crashpad |
OLD | NEW |