| Index: net/disk_cache/sparse_control.cc
 | 
| ===================================================================
 | 
| --- net/disk_cache/sparse_control.cc	(revision 78400)
 | 
| +++ net/disk_cache/sparse_control.cc	(working copy)
 | 
| @@ -15,6 +15,7 @@
 | 
|  #include "net/disk_cache/backend_impl.h"
 | 
|  #include "net/disk_cache/entry_impl.h"
 | 
|  #include "net/disk_cache/file.h"
 | 
| +#include "net/disk_cache/net_log_parameters.h"
 | 
|  
 | 
|  using base::Time;
 | 
|  
 | 
| @@ -35,7 +36,7 @@
 | 
|  // The size of each data block (tracked by the child allocation bitmap).
 | 
|  const int kBlockSize = 1024;
 | 
|  
 | 
| -// Returns the name of of a child entry given the base_name and signature of the
 | 
| +// Returns the name of a child entry given the base_name and signature of the
 | 
|  // parent and the child_id.
 | 
|  // If the entry is called entry_name, child entries will be named something
 | 
|  // like Range_entry_name:XXX:YYY where XXX is the entry signature and YYY is the
 | 
| @@ -138,22 +139,38 @@
 | 
|        this, &ChildrenDeleter::DeleteChildren));
 | 
|  }
 | 
|  
 | 
| -// Logs the end event for |operation|, if all events are being logged.
 | 
| -void LogOperationEnd(const net::BoundNetLog& net_log,
 | 
| -                     disk_cache::SparseControl::SparseOperation operation,
 | 
| -                     int result) {
 | 
| +// Returns the NetLog event type corresponding to a SparseOperation.
 | 
| +net::NetLog::EventType GetSparseEventType(
 | 
| +    disk_cache::SparseControl::SparseOperation operation) {
 | 
| +  switch (operation) {
 | 
| +    case disk_cache::SparseControl::kReadOperation:
 | 
| +      return net::NetLog::TYPE_SPARSE_READ;
 | 
| +    case disk_cache::SparseControl::kWriteOperation:
 | 
| +      return net::NetLog::TYPE_SPARSE_WRITE;
 | 
| +    case disk_cache::SparseControl::kGetRangeOperation:
 | 
| +      return net::NetLog::TYPE_SPARSE_GET_RANGE;
 | 
| +    default:
 | 
| +      NOTREACHED();
 | 
| +      return net::NetLog::TYPE_CANCELLED;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +// Logs the end event for |operation| on a child entry.  Range operations log
 | 
| +// no events for each child they search through.
 | 
| +void LogChildOperationEnd(const net::BoundNetLog& net_log,
 | 
| +                          disk_cache::SparseControl::SparseOperation operation,
 | 
| +                          int result) {
 | 
|    if (net_log.IsLoggingAllEvents()) {
 | 
|      net::NetLog::EventType event_type;
 | 
|      switch (operation) {
 | 
|        case disk_cache::SparseControl::kReadOperation:
 | 
| -        event_type = net::NetLog::TYPE_SPARSE_CONTROL_READ;
 | 
| +        event_type = net::NetLog::TYPE_SPARSE_READ_CHILD_DATA;
 | 
|          break;
 | 
|        case disk_cache::SparseControl::kWriteOperation:
 | 
| -        event_type = net::NetLog::TYPE_SPARSE_CONTROL_WRITE;
 | 
| +        event_type = net::NetLog::TYPE_SPARSE_WRITE_CHILD_DATA;
 | 
|          break;
 | 
|        case disk_cache::SparseControl::kGetRangeOperation:
 | 
| -        event_type = net::NetLog::TYPE_SPARSE_CONTROL_GET_RANGE;
 | 
| -        break;
 | 
| +        return;
 | 
|        default:
 | 
|          NOTREACHED();
 | 
|          return;
 | 
| @@ -247,7 +264,11 @@
 | 
|    finished_ = false;
 | 
|    abort_ = false;
 | 
|  
 | 
| -  entry_->net_log().BeginEvent(net::NetLog::TYPE_SPARSE_CONTROL, NULL);
 | 
| +  if (entry_->net_log().IsLoggingAllEvents()) {
 | 
| +    entry_->net_log().BeginEvent(
 | 
| +        GetSparseEventType(operation_),
 | 
| +        make_scoped_refptr(new SparseOperationParameters(offset_, buf_len_)));
 | 
| +  }
 | 
|    DoChildrenIO();
 | 
|  
 | 
|    if (!pending_) {
 | 
| @@ -317,6 +338,8 @@
 | 
|    if (!buffer && !address.is_initialized())
 | 
|      return;
 | 
|  
 | 
| +  entry->net_log().AddEvent(net::NetLog::TYPE_SPARSE_DELETE_CHILDREN, NULL);
 | 
| +
 | 
|    ChildrenDeleter* deleter = new ChildrenDeleter(entry->backend_,
 | 
|                                                   entry->GetKey());
 | 
|    // The object will self destruct when finished.
 | 
| @@ -635,8 +658,20 @@
 | 
|  void SparseControl::DoChildrenIO() {
 | 
|    while (DoChildIO()) continue;
 | 
|  
 | 
| +  // Range operations are finished synchronously, often without setting
 | 
| +  // |finished_| to true.
 | 
| +  if (kGetRangeOperation == operation_ &&
 | 
| +      entry_->net_log().IsLoggingAllEvents()) {
 | 
| +    entry_->net_log().EndEvent(
 | 
| +        net::NetLog::TYPE_SPARSE_GET_RANGE,
 | 
| +        make_scoped_refptr(
 | 
| +            new GetAvailableRangeResultParameters(offset_, result_)));
 | 
| +  }
 | 
|    if (finished_) {
 | 
| -    entry_->net_log().EndEvent(net::NetLog::TYPE_SPARSE_CONTROL, NULL);
 | 
| +    if (kGetRangeOperation != operation_ &&
 | 
| +        entry_->net_log().IsLoggingAllEvents()) {
 | 
| +      entry_->net_log().EndEvent(GetSparseEventType(operation_), NULL);
 | 
| +    }
 | 
|      if (pending_)
 | 
|        DoUserCallback();
 | 
|    }
 | 
| @@ -662,10 +697,10 @@
 | 
|      case kReadOperation:
 | 
|        if (entry_->net_log().IsLoggingAllEvents()) {
 | 
|          entry_->net_log().BeginEvent(
 | 
| -            net::NetLog::TYPE_SPARSE_CONTROL_READ,
 | 
| -            make_scoped_refptr(new net::NetLogSourceParameter(
 | 
| -                "source_dependency",
 | 
| -                child_->net_log().source())));
 | 
| +            net::NetLog::TYPE_SPARSE_READ_CHILD_DATA,
 | 
| +            make_scoped_refptr(new SparseReadWriteParameters(
 | 
| +                child_->net_log().source(),
 | 
| +                child_len_)));
 | 
|        }
 | 
|        rv = child_->ReadDataImpl(kSparseData, child_offset_, user_buf_,
 | 
|                                  child_len_, callback);
 | 
| @@ -673,19 +708,15 @@
 | 
|      case kWriteOperation:
 | 
|        if (entry_->net_log().IsLoggingAllEvents()) {
 | 
|          entry_->net_log().BeginEvent(
 | 
| -            net::NetLog::TYPE_SPARSE_CONTROL_WRITE,
 | 
| -            make_scoped_refptr(new net::NetLogSourceParameter(
 | 
| -                "source_dependency",
 | 
| -                child_->net_log().source())));
 | 
| +            net::NetLog::TYPE_SPARSE_WRITE_CHILD_DATA,
 | 
| +            make_scoped_refptr(new SparseReadWriteParameters(
 | 
| +                child_->net_log().source(),
 | 
| +                child_len_)));
 | 
|        }
 | 
|        rv = child_->WriteDataImpl(kSparseData, child_offset_, user_buf_,
 | 
|                                   child_len_, callback, false);
 | 
|        break;
 | 
|      case kGetRangeOperation:
 | 
| -      if (entry_->net_log().IsLoggingAllEvents()) {
 | 
| -        entry_->net_log().BeginEvent(net::NetLog::TYPE_SPARSE_CONTROL_GET_RANGE,
 | 
| -                                     NULL);
 | 
| -      }
 | 
|        rv = DoGetAvailableRange();
 | 
|        break;
 | 
|      default:
 | 
| @@ -758,7 +789,7 @@
 | 
|  }
 | 
|  
 | 
|  void SparseControl::DoChildIOCompleted(int result) {
 | 
| -  LogOperationEnd(entry_->net_log(), operation_, result);
 | 
| +  LogChildOperationEnd(entry_->net_log(), operation_, result);
 | 
|    if (result < 0) {
 | 
|      // We fail the whole operation if we encounter an error.
 | 
|      result_ = result;
 | 
| @@ -784,8 +815,10 @@
 | 
|      // We'll return the current result of the operation, which may be less than
 | 
|      // the bytes to read or write, but the user cancelled the operation.
 | 
|      abort_ = false;
 | 
| -    entry_->net_log().AddEvent(net::NetLog::TYPE_CANCELLED, NULL);
 | 
| -    entry_->net_log().EndEvent(net::NetLog::TYPE_SPARSE_CONTROL, NULL);
 | 
| +    if (entry_->net_log().IsLoggingAllEvents()) {
 | 
| +      entry_->net_log().AddEvent(net::NetLog::TYPE_CANCELLED, NULL);
 | 
| +      entry_->net_log().EndEvent(GetSparseEventType(operation_), NULL);
 | 
| +    }
 | 
|      DoUserCallback();
 | 
|      return DoAbortCallbacks();
 | 
|    }
 | 
| 
 |