| Index: third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.cc
|
| diff --git a/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.cc b/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.cc
|
| index 7332cd014911936ddb3171f1a94aca684f3c071a..6520f0f402896fada0d404ca44527d9b51630706 100644
|
| --- a/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.cc
|
| +++ b/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.cc
|
| @@ -14,13 +14,67 @@
|
|
|
| #include "minidump/minidump_user_stream_writer.h"
|
|
|
| +#include "base/memory/ptr_util.h"
|
| #include "util/file/file_writer.h"
|
|
|
| namespace crashpad {
|
|
|
| -MinidumpUserStreamWriter::MinidumpUserStreamWriter()
|
| - : stream_type_(0), reader_() {
|
| -}
|
| +class MinidumpUserStreamWriter::ContentsWriter {
|
| + public:
|
| + virtual ~ContentsWriter() {}
|
| + virtual bool WriteContents(FileWriterInterface* writer) = 0;
|
| + virtual size_t GetSize() const = 0;
|
| +};
|
| +
|
| +class MinidumpUserStreamWriter::SnapshotContentsWriter final
|
| + : public MinidumpUserStreamWriter::ContentsWriter,
|
| + public MemorySnapshot::Delegate {
|
| + public:
|
| + explicit SnapshotContentsWriter(const MemorySnapshot* snapshot)
|
| + : snapshot_(snapshot), writer_(nullptr) {}
|
| +
|
| + bool WriteContents(FileWriterInterface* writer) override {
|
| + DCHECK(!writer_);
|
| +
|
| + writer_ = writer;
|
| + if (!snapshot_)
|
| + return true;
|
| +
|
| + return snapshot_->Read(this);
|
| + }
|
| +
|
| + size_t GetSize() const override { return snapshot_ ? snapshot_->Size() : 0; };
|
| +
|
| + bool MemorySnapshotDelegateRead(void* data, size_t size) override {
|
| + return writer_->Write(data, size);
|
| + }
|
| +
|
| + private:
|
| + const MemorySnapshot* snapshot_;
|
| + FileWriterInterface* writer_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SnapshotContentsWriter);
|
| +};
|
| +
|
| +class MinidumpUserStreamWriter::BufferContentsWriter final
|
| + : public MinidumpUserStreamWriter::ContentsWriter {
|
| + public:
|
| + BufferContentsWriter(const void* buffer, size_t buffer_size)
|
| + : buffer_(buffer), buffer_size_(buffer_size) {}
|
| +
|
| + bool WriteContents(FileWriterInterface* writer) override {
|
| + return writer->Write(buffer_, buffer_size_);
|
| + }
|
| + size_t GetSize() const override { return buffer_size_; }
|
| +
|
| + private:
|
| + const void* buffer_;
|
| + size_t buffer_size_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(BufferContentsWriter);
|
| +};
|
| +
|
| +MinidumpUserStreamWriter::MinidumpUserStreamWriter() : stream_type_() {}
|
|
|
| MinidumpUserStreamWriter::~MinidumpUserStreamWriter() {
|
| }
|
| @@ -28,10 +82,23 @@ MinidumpUserStreamWriter::~MinidumpUserStreamWriter() {
|
| void MinidumpUserStreamWriter::InitializeFromSnapshot(
|
| const UserMinidumpStream* stream) {
|
| DCHECK_EQ(state(), kStateMutable);
|
| + DCHECK(!contents_writer_.get());
|
| +
|
| + stream_type_ = static_cast<MinidumpStreamType>(stream->stream_type());
|
| + contents_writer_ =
|
| + base::WrapUnique(new SnapshotContentsWriter(stream->memory()));
|
| +}
|
| +
|
| +void MinidumpUserStreamWriter::InitializeFromBuffer(
|
| + MinidumpStreamType stream_type,
|
| + const void* buffer,
|
| + size_t buffer_size) {
|
| + DCHECK_EQ(state(), kStateMutable);
|
| + DCHECK(!contents_writer_.get());
|
|
|
| - stream_type_ = stream->stream_type();
|
| - if (stream->memory())
|
| - stream->memory()->Read(&reader_);
|
| + stream_type_ = stream_type;
|
| + contents_writer_ =
|
| + base::WrapUnique(new BufferContentsWriter(buffer, buffer_size));
|
| }
|
|
|
| bool MinidumpUserStreamWriter::Freeze() {
|
| @@ -42,7 +109,8 @@ bool MinidumpUserStreamWriter::Freeze() {
|
|
|
| size_t MinidumpUserStreamWriter::SizeOfObject() {
|
| DCHECK_GE(state(), kStateFrozen);
|
| - return reader_.size();
|
| +
|
| + return contents_writer_->GetSize();
|
| }
|
|
|
| std::vector<internal::MinidumpWritable*>
|
| @@ -53,21 +121,12 @@ MinidumpUserStreamWriter::Children() {
|
|
|
| bool MinidumpUserStreamWriter::WriteObject(FileWriterInterface* file_writer) {
|
| DCHECK_EQ(state(), kStateWritable);
|
| - return file_writer->Write(reader_.data(), reader_.size());
|
| +
|
| + return contents_writer_->WriteContents(file_writer);
|
| }
|
|
|
| MinidumpStreamType MinidumpUserStreamWriter::StreamType() const {
|
| return static_cast<MinidumpStreamType>(stream_type_);
|
| }
|
|
|
| -MinidumpUserStreamWriter::MemoryReader::~MemoryReader() {}
|
| -
|
| -bool MinidumpUserStreamWriter::MemoryReader::MemorySnapshotDelegateRead(
|
| - void* data,
|
| - size_t size) {
|
| - data_.resize(size);
|
| - memcpy(&data_[0], data, size);
|
| - return true;
|
| -}
|
| -
|
| } // namespace crashpad
|
|
|