Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: minidump/minidump_writable.cc

Issue 983103004: win: fixes for Windows x64 (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: mac Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « minidump/minidump_writable.h ('k') | minidump/minidump_writable_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 25 matching lines...) Expand all
36 36
37 bool MinidumpWritable::WriteEverything(FileWriterInterface* file_writer) { 37 bool MinidumpWritable::WriteEverything(FileWriterInterface* file_writer) {
38 DCHECK_EQ(state_, kStateMutable); 38 DCHECK_EQ(state_, kStateMutable);
39 39
40 if (!Freeze()) { 40 if (!Freeze()) {
41 return false; 41 return false;
42 } 42 }
43 43
44 DCHECK_EQ(state_, kStateFrozen); 44 DCHECK_EQ(state_, kStateFrozen);
45 45
46 off_t offset = 0; 46 FileOffset offset = 0;
47 std::vector<MinidumpWritable*> write_sequence; 47 std::vector<MinidumpWritable*> write_sequence;
48 size_t size = WillWriteAtOffset(kPhaseEarly, &offset, &write_sequence); 48 size_t size = WillWriteAtOffset(kPhaseEarly, &offset, &write_sequence);
49 if (size == kInvalidSize) { 49 if (size == kInvalidSize) {
50 return false; 50 return false;
51 } 51 }
52 52
53 offset += size; 53 offset += size;
54 if (WillWriteAtOffset(kPhaseLate, &offset, &write_sequence) == kInvalidSize) { 54 if (WillWriteAtOffset(kPhaseLate, &offset, &write_sequence) == kInvalidSize) {
55 return false; 55 return false;
56 } 56 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 117
118 return std::vector<MinidumpWritable*>(); 118 return std::vector<MinidumpWritable*>();
119 } 119 }
120 120
121 MinidumpWritable::Phase MinidumpWritable::WritePhase() { 121 MinidumpWritable::Phase MinidumpWritable::WritePhase() {
122 return kPhaseEarly; 122 return kPhaseEarly;
123 } 123 }
124 124
125 size_t MinidumpWritable::WillWriteAtOffset( 125 size_t MinidumpWritable::WillWriteAtOffset(
126 Phase phase, 126 Phase phase,
127 off_t* offset, 127 FileOffset* offset,
128 std::vector<MinidumpWritable*>* write_sequence) { 128 std::vector<MinidumpWritable*>* write_sequence) {
129 off_t local_offset = *offset; 129 FileOffset local_offset = *offset;
130 CHECK_GE(local_offset, 0); 130 CHECK_GE(local_offset, 0);
131 131
132 size_t leading_pad_bytes_this_phase; 132 size_t leading_pad_bytes_this_phase;
133 size_t size; 133 size_t size;
134 if (phase == WritePhase()) { 134 if (phase == WritePhase()) {
135 DCHECK_EQ(state_, kStateFrozen); 135 DCHECK_EQ(state_, kStateFrozen);
136 136
137 // Add this object to the sequence of MinidumpWritable objects to be 137 // Add this object to the sequence of MinidumpWritable objects to be
138 // written. 138 // written.
139 write_sequence->push_back(this); 139 write_sequence->push_back(this);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 size = 0; 211 size = 0;
212 leading_pad_bytes_this_phase = 0; 212 leading_pad_bytes_this_phase = 0;
213 } 213 }
214 214
215 // Loop over children regardless of whether this object itself will write 215 // Loop over children regardless of whether this object itself will write
216 // during this phase. An object’s children are not required to be written 216 // during this phase. An object’s children are not required to be written
217 // during the same phase as their parent. 217 // during the same phase as their parent.
218 std::vector<MinidumpWritable*> children = Children(); 218 std::vector<MinidumpWritable*> children = Children();
219 for (MinidumpWritable* child : children) { 219 for (MinidumpWritable* child : children) {
220 // Use “auto” here because it’s impossible to know whether size_t (size) or 220 // Use “auto” here because it’s impossible to know whether size_t (size) or
221 // off_t (local_offset) is the wider type, and thus what type the result of 221 // FileOffset (local_offset) is the wider type, and thus what type the
222 // adding these two variables will have. 222 // result of adding these two variables will have.
223 auto unaligned_child_offset = local_offset + size; 223 auto unaligned_child_offset = local_offset + size;
224 off_t child_offset; 224 FileOffset child_offset;
225 if (!AssignIfInRange(&child_offset, unaligned_child_offset)) { 225 if (!AssignIfInRange(&child_offset, unaligned_child_offset)) {
226 LOG(ERROR) << "offset " << unaligned_child_offset << " out of range"; 226 LOG(ERROR) << "offset " << unaligned_child_offset << " out of range";
227 return kInvalidSize; 227 return kInvalidSize;
228 } 228 }
229 229
230 size_t child_size = 230 size_t child_size =
231 child->WillWriteAtOffset(phase, &child_offset, write_sequence); 231 child->WillWriteAtOffset(phase, &child_offset, write_sequence);
232 if (child_size == kInvalidSize) { 232 if (child_size == kInvalidSize) {
233 return kInvalidSize; 233 return kInvalidSize;
234 } 234 }
235 235
236 size += child_size; 236 size += child_size;
237 } 237 }
238 238
239 return leading_pad_bytes_this_phase + size; 239 return leading_pad_bytes_this_phase + size;
240 } 240 }
241 241
242 bool MinidumpWritable::WillWriteAtOffsetImpl(off_t offset) { 242 bool MinidumpWritable::WillWriteAtOffsetImpl(FileOffset offset) {
243 return true; 243 return true;
244 } 244 }
245 245
246 bool MinidumpWritable::WritePaddingAndObject(FileWriterInterface* file_writer) { 246 bool MinidumpWritable::WritePaddingAndObject(FileWriterInterface* file_writer) {
247 DCHECK_EQ(state_, kStateWritable); 247 DCHECK_EQ(state_, kStateWritable);
248 248
249 // The number of elements in kZeroes must be at least one less than the 249 // The number of elements in kZeroes must be at least one less than the
250 // maximum Alignment() ever encountered. 250 // maximum Alignment() ever encountered.
251 const uint8_t kZeroes[kMaximumAlignment - 1] = {}; 251 const uint8_t kZeroes[kMaximumAlignment - 1] = {};
252 DCHECK_LE(leading_pad_bytes_, arraysize(kZeroes)); 252 DCHECK_LE(leading_pad_bytes_, arraysize(kZeroes));
253 253
254 if (leading_pad_bytes_) { 254 if (leading_pad_bytes_) {
255 if (!file_writer->Write(&kZeroes, leading_pad_bytes_)) { 255 if (!file_writer->Write(&kZeroes, leading_pad_bytes_)) {
256 return false; 256 return false;
257 } 257 }
258 } 258 }
259 259
260 if (!WriteObject(file_writer)) { 260 if (!WriteObject(file_writer)) {
261 return false; 261 return false;
262 } 262 }
263 263
264 state_ = kStateWritten; 264 state_ = kStateWritten;
265 return true; 265 return true;
266 } 266 }
267 267
268 } // namespace internal 268 } // namespace internal
269 } // namespace crashpad 269 } // namespace crashpad
OLDNEW
« no previous file with comments | « minidump/minidump_writable.h ('k') | minidump/minidump_writable_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698