Index: util/file/file_writer.cc |
diff --git a/util/file/file_writer.cc b/util/file/file_writer.cc |
index 4794c7f074ee47a1c648349f55829a5cef047b28..1b6ba0d4a1079ad87d3c5e89fca22a97404eb604 100644 |
--- a/util/file/file_writer.cc |
+++ b/util/file/file_writer.cc |
@@ -37,31 +37,18 @@ static_assert(offsetof(WritableIoVec, iov_len) == offsetof(iovec, iov_len), |
"WritableIoVec len offset"); |
#endif // OS_POSIX |
-FileWriter::FileWriter() : file_() { |
+WeakFileHandleFileWriter::WeakFileHandleFileWriter(FileHandle file_handle) |
+ : file_handle_(file_handle) { |
} |
-FileWriter::~FileWriter() { |
+WeakFileHandleFileWriter::~WeakFileHandleFileWriter() { |
} |
-bool FileWriter::Open(const base::FilePath& path, |
- FileWriteMode write_mode, |
- FilePermissions permissions) { |
- CHECK(!file_.is_valid()); |
- file_.reset(LoggingOpenFileForWrite(path, write_mode, permissions)); |
- return file_.is_valid(); |
-} |
- |
-void FileWriter::Close() { |
- CHECK(file_.is_valid()); |
- |
- file_.reset(); |
-} |
- |
-bool FileWriter::Write(const void* data, size_t size) { |
- DCHECK(file_.is_valid()); |
+bool WeakFileHandleFileWriter::Write(const void* data, size_t size) { |
+ DCHECK_NE(file_handle_, kInvalidFileHandle); |
// TODO(mark): Write no more than SSIZE_MAX bytes in a single call. |
- ssize_t written = WriteFile(file_.get(), data, size); |
+ ssize_t written = WriteFile(file_handle_, data, size); |
if (written < 0) { |
PLOG(ERROR) << "write"; |
return false; |
@@ -73,8 +60,8 @@ bool FileWriter::Write(const void* data, size_t size) { |
return true; |
} |
-bool FileWriter::WriteIoVec(std::vector<WritableIoVec>* iovecs) { |
- DCHECK(file_.is_valid()); |
+bool WeakFileHandleFileWriter::WriteIoVec(std::vector<WritableIoVec>* iovecs) { |
+ DCHECK_NE(file_handle_, kInvalidFileHandle); |
#if defined(OS_POSIX) |
@@ -97,7 +84,7 @@ bool FileWriter::WriteIoVec(std::vector<WritableIoVec>* iovecs) { |
size_t writev_iovec_count = |
std::min(remaining_iovecs, implicit_cast<size_t>(IOV_MAX)); |
ssize_t written = |
- HANDLE_EINTR(writev(file_.get(), iov, writev_iovec_count)); |
+ HANDLE_EINTR(writev(file_handle_, iov, writev_iovec_count)); |
if (written < 0) { |
PLOG(ERROR) << "writev"; |
return false; |
@@ -149,9 +136,52 @@ bool FileWriter::WriteIoVec(std::vector<WritableIoVec>* iovecs) { |
return true; |
} |
+FileOffset WeakFileHandleFileWriter::Seek(FileOffset offset, int whence) { |
+ DCHECK_NE(file_handle_, kInvalidFileHandle); |
+ return LoggingSeekFile(file_handle_, offset, whence); |
+} |
+ |
+FileWriter::FileWriter() |
+ : file_(), |
+ weak_file_handle_file_writer_(kInvalidFileHandle) { |
+} |
+ |
+FileWriter::~FileWriter() { |
+} |
+ |
+bool FileWriter::Open(const base::FilePath& path, |
+ FileWriteMode write_mode, |
+ FilePermissions permissions) { |
+ CHECK(!file_.is_valid()); |
+ file_.reset(LoggingOpenFileForWrite(path, write_mode, permissions)); |
+ if (!file_.is_valid()) { |
+ return false; |
+ } |
+ |
+ weak_file_handle_file_writer_.set_file_handle(file_.get()); |
+ return true; |
+} |
+ |
+void FileWriter::Close() { |
+ CHECK(file_.is_valid()); |
+ |
+ weak_file_handle_file_writer_.set_file_handle(kInvalidFileHandle); |
+ file_.reset(); |
+} |
+ |
+bool FileWriter::Write(const void* data, size_t size) { |
+ DCHECK(file_.is_valid()); |
+ return weak_file_handle_file_writer_.Write(data, size); |
+} |
+ |
+bool FileWriter::WriteIoVec(std::vector<WritableIoVec>* iovecs) { |
+ DCHECK(file_.is_valid()); |
+ return weak_file_handle_file_writer_.WriteIoVec(iovecs); |
+} |
+ |
FileOffset FileWriter::Seek(FileOffset offset, int whence) { |
DCHECK(file_.is_valid()); |
- return LoggingSeekFile(file_.get(), offset, whence); |
+ return weak_file_handle_file_writer_.Seek(offset, whence); |
} |
} // namespace crashpad |