Index: net/base/file_stream_win.cc |
diff --git a/net/base/file_stream_win.cc b/net/base/file_stream_win.cc |
index 07d365f0597b1ef6178f7dd742a92263d8c46d66..11b89bb0945219bba4f7011e3dfbbc6da907499f 100644 |
--- a/net/base/file_stream_win.cc |
+++ b/net/base/file_stream_win.cc |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -12,6 +12,7 @@ |
#include "base/metrics/histogram.h" |
#include "base/threading/thread_restrictions.h" |
#include "net/base/file_stream_metrics.h" |
+#include "net/base/file_stream_net_log_parameters.h" |
#include "net/base/net_errors.h" |
namespace net { |
@@ -36,7 +37,18 @@ static void IncrementOffset(OVERLAPPED* overlapped, DWORD count) { |
namespace { |
-int RecordAndMapError(int error, FileErrorSource source, bool record_uma) { |
+int RecordAndMapError(int error, |
+ FileErrorSource source, |
+ bool record_uma, |
+ const net::BoundNetLog& bound_net_log) { |
+ bound_net_log.AddEvent( |
+ net::NetLog::TYPE_FILE_STREAM_ERROR, |
+ make_scoped_refptr( |
+ new FileStreamErrorParameters( |
+ GetFileErrorSourceName(source), |
+ error, |
+ MapSystemError(error)))); |
+ |
RecordFileError(error, source, record_uma); |
return MapSystemError(error); |
} |
@@ -49,7 +61,8 @@ class FileStream::AsyncContext : public MessageLoopForIO::IOHandler { |
public: |
AsyncContext(FileStream* owner) |
mmenke
2012/01/31 21:20:31
Unless you add a second parameter to the construct
ahendrickson
2012/01/31 22:29:47
Done.
|
: owner_(owner), context_(), is_closing_(false), |
- record_uma_(false), error_source_(FILE_ERROR_SOURCE_COUNT) { |
+ record_uma_(false), |
+ error_source_(FILE_ERROR_SOURCE_COUNT) { |
context_.handler = this; |
} |
~AsyncContext(); |
@@ -60,6 +73,9 @@ class FileStream::AsyncContext : public MessageLoopForIO::IOHandler { |
const CompletionCallback& callback() const { return callback_; } |
void set_error_source(FileErrorSource source) { error_source_ = source; } |
+ void set_bound_net_log(const net::BoundNetLog& bound_net_log) { |
+ bound_net_log_ = bound_net_log; |
+ } |
void EnableErrorStatistics() { |
record_uma_ = true; |
@@ -74,6 +90,7 @@ class FileStream::AsyncContext : public MessageLoopForIO::IOHandler { |
CompletionCallback callback_; |
bool is_closing_; |
bool record_uma_; |
+ net::BoundNetLog bound_net_log_; |
FileErrorSource error_source_; |
}; |
@@ -109,8 +126,10 @@ void FileStream::AsyncContext::OnIOCompleted( |
} |
int result = static_cast<int>(bytes_read); |
- if (error && error != ERROR_HANDLE_EOF) |
- result = RecordAndMapError(error, error_source_, record_uma_); |
+ if (error && error != ERROR_HANDLE_EOF) { |
+ result = RecordAndMapError(error, error_source_, record_uma_, |
+ bound_net_log_); |
+ } |
if (bytes_read) |
IncrementOffset(&context->overlapped, bytes_read); |
@@ -122,18 +141,25 @@ void FileStream::AsyncContext::OnIOCompleted( |
// FileStream ------------------------------------------------------------ |
-FileStream::FileStream() |
- : file_(INVALID_HANDLE_VALUE), |
+FileStream::FileStream(net::NetLog* net_log) |
+ : file_(base::kInvalidPlatformFileValue), |
open_flags_(0), |
auto_closed_(true), |
- record_uma_(false) { |
+ record_uma_(false), |
+ bound_net_log_(net::BoundNetLog::Make(net_log, |
+ net::NetLog::SOURCE_FILESTREAM)) { |
+ bound_net_log_.BeginEvent(net::NetLog::TYPE_FILE_STREAM_ALIVE, NULL); |
} |
-FileStream::FileStream(base::PlatformFile file, int flags) |
+FileStream::FileStream(base::PlatformFile file, int flags, net::NetLog* net_log) |
: file_(file), |
open_flags_(flags), |
auto_closed_(false), |
- record_uma_(false) { |
+ record_uma_(false), |
+ bound_net_log_(net::BoundNetLog::Make(net_log, |
+ net::NetLog::SOURCE_FILESTREAM)) { |
+ bound_net_log_.BeginEvent(net::NetLog::TYPE_FILE_STREAM_ALIVE, NULL); |
+ |
// If the file handle is opened with base::PLATFORM_FILE_ASYNC, we need to |
// make sure we will perform asynchronous File IO to it. |
if (flags & base::PLATFORM_FILE_ASYNC) { |
@@ -146,9 +172,12 @@ FileStream::FileStream(base::PlatformFile file, int flags) |
FileStream::~FileStream() { |
if (auto_closed_) |
Close(); |
+ |
+ bound_net_log_.EndEvent(net::NetLog::TYPE_FILE_STREAM_ALIVE, NULL); |
} |
void FileStream::Close() { |
+ bound_net_log_.AddEvent(net::NetLog::TYPE_FILE_STREAM_CLOSE, NULL); |
if (file_ != INVALID_HANDLE_VALUE) |
CancelIo(file_); |
@@ -156,6 +185,8 @@ void FileStream::Close() { |
if (file_ != INVALID_HANDLE_VALUE) { |
CloseHandle(file_); |
file_ = INVALID_HANDLE_VALUE; |
+ |
+ bound_net_log_.EndEvent(net::NetLog::TYPE_FILE_STREAM_OPEN, NULL); |
} |
} |
@@ -165,12 +196,23 @@ int FileStream::Open(const FilePath& path, int open_flags) { |
return ERR_UNEXPECTED; |
} |
+ bound_net_log_.BeginEvent( |
+ net::NetLog::TYPE_FILE_STREAM_OPEN, |
+ make_scoped_refptr( |
+ new net::NetLogStringParameter("file_name", |
+ path.AsUTF8Unsafe()))); |
+ |
open_flags_ = open_flags; |
file_ = base::CreatePlatformFile(path, open_flags_, NULL, NULL); |
if (file_ == INVALID_HANDLE_VALUE) { |
DWORD error = GetLastError(); |
LOG(WARNING) << "Failed to open file: " << error; |
- return RecordAndMapError(error, FILE_ERROR_SOURCE_OPEN, record_uma_); |
+ int net_error = RecordAndMapError(error, |
+ FILE_ERROR_SOURCE_OPEN, |
+ record_uma_, |
+ bound_net_log_); |
+ bound_net_log_.EndEvent(net::NetLog::TYPE_FILE_STREAM_OPEN, NULL); |
+ return net_error; |
} |
if (open_flags_ & base::PLATFORM_FILE_ASYNC) { |
@@ -200,10 +242,14 @@ int64 FileStream::Seek(Whence whence, int64 offset) { |
if (!SetFilePointerEx(file_, distance, &result, move_method)) { |
DWORD error = GetLastError(); |
LOG(WARNING) << "SetFilePointerEx failed: " << error; |
- return RecordAndMapError(error, FILE_ERROR_SOURCE_SEEK, record_uma_); |
+ return RecordAndMapError(error, |
+ FILE_ERROR_SOURCE_SEEK, |
+ record_uma_, |
+ bound_net_log_); |
} |
if (async_context_.get()) { |
async_context_->set_error_source(FILE_ERROR_SOURCE_SEEK); |
+ async_context_->set_bound_net_log(bound_net_log_); |
SetOffset(async_context_->overlapped(), result); |
} |
return result.QuadPart; |
@@ -223,7 +269,10 @@ int64 FileStream::Available() { |
if (!GetFileSizeEx(file_, &file_size)) { |
DWORD error = GetLastError(); |
LOG(WARNING) << "GetFileSizeEx failed: " << error; |
- return RecordAndMapError(error, FILE_ERROR_SOURCE_GET_SIZE, record_uma_); |
+ return RecordAndMapError(error, |
+ FILE_ERROR_SOURCE_GET_SIZE, |
+ record_uma_, |
+ bound_net_log_); |
} |
return file_size.QuadPart - cur_pos; |
@@ -242,6 +291,7 @@ int FileStream::Read( |
DCHECK(async_context_->callback().is_null()); |
overlapped = async_context_->overlapped(); |
async_context_->set_error_source(FILE_ERROR_SOURCE_READ); |
+ async_context_->set_bound_net_log(bound_net_log_); |
} else { |
DCHECK(callback.is_null()); |
base::ThreadRestrictions::AssertIOAllowed(); |
@@ -259,7 +309,10 @@ int FileStream::Read( |
rv = 0; // Report EOF by returning 0 bytes read. |
} else { |
LOG(WARNING) << "ReadFile failed: " << error; |
- rv = RecordAndMapError(error, FILE_ERROR_SOURCE_READ, record_uma_); |
+ rv = RecordAndMapError(error, |
+ FILE_ERROR_SOURCE_READ, |
+ record_uma_, |
+ bound_net_log_); |
} |
} else if (overlapped) { |
async_context_->IOCompletionIsPending(callback); |
@@ -304,6 +357,7 @@ int FileStream::Write( |
DCHECK(async_context_->callback().is_null()); |
overlapped = async_context_->overlapped(); |
async_context_->set_error_source(FILE_ERROR_SOURCE_WRITE); |
+ async_context_->set_bound_net_log(bound_net_log_); |
} else { |
DCHECK(callback.is_null()); |
base::ThreadRestrictions::AssertIOAllowed(); |
@@ -318,7 +372,10 @@ int FileStream::Write( |
rv = ERR_IO_PENDING; |
} else { |
LOG(WARNING) << "WriteFile failed: " << error; |
- rv = RecordAndMapError(error, FILE_ERROR_SOURCE_WRITE, record_uma_); |
+ rv = RecordAndMapError(error, |
+ FILE_ERROR_SOURCE_WRITE, |
+ record_uma_, |
+ bound_net_log_); |
} |
} else if (overlapped) { |
async_context_->IOCompletionIsPending(callback); |
@@ -342,7 +399,8 @@ int FileStream::Flush() { |
return RecordAndMapError(GetLastError(), |
FILE_ERROR_SOURCE_FLUSH, |
- record_uma_); |
+ record_uma_, |
+ bound_net_log_); |
} |
int64 FileStream::Truncate(int64 bytes) { |
@@ -351,7 +409,7 @@ int64 FileStream::Truncate(int64 bytes) { |
if (!IsOpen()) |
return ERR_UNEXPECTED; |
- // We better be open for reading. |
+ // We'd better be open for writing. |
DCHECK(open_flags_ & base::PLATFORM_FILE_WRITE); |
// Seek to the position to truncate from. |
@@ -364,7 +422,10 @@ int64 FileStream::Truncate(int64 bytes) { |
if (!result) { |
DWORD error = GetLastError(); |
LOG(WARNING) << "SetEndOfFile failed: " << error; |
- return RecordAndMapError(error, FILE_ERROR_SOURCE_SET_EOF, record_uma_); |
+ return RecordAndMapError(error, |
+ FILE_ERROR_SOURCE_SET_EOF, |
+ record_uma_, |
+ bound_net_log_); |
} |
// Success. |
@@ -378,4 +439,25 @@ void FileStream::EnableErrorStatistics() { |
async_context_->EnableErrorStatistics(); |
} |
+void FileStream::SetBoundNetLogSource( |
+ const net::BoundNetLog& owner_bound_net_log) { |
mmenke
2012/01/31 21:20:31
nit: suggest source_bound_net_log, mimicking the
ahendrickson
2012/01/31 22:29:47
Hmm, I'm torn between your suggestion and what I h
|
+ if (owner_bound_net_log.source().id == net::NetLog::Source::kInvalidId) |
+ return; |
+ |
+ if (owner_bound_net_log.source().id == bound_net_log_.source().id) |
+ return; |
+ |
+ bound_net_log_.AddEvent( |
+ net::NetLog::TYPE_FILE_STREAM_BOUND_TO_OWNER, |
+ make_scoped_refptr( |
+ new net::NetLogSourceParameter("source_dependency", |
+ owner_bound_net_log.source()))); |
+ |
+ owner_bound_net_log.AddEvent( |
+ net::NetLog::TYPE_FILE_STREAM_SOURCE, |
+ make_scoped_refptr( |
+ new net::NetLogSourceParameter("source_dependency", |
+ bound_net_log_.source()))); |
+} |
+ |
} // namespace net |