Chromium Code Reviews| Index: content/child/threaded_data_provider.cc |
| diff --git a/content/child/threaded_data_provider.cc b/content/child/threaded_data_provider.cc |
| index ccfe8918cc4037161e020bd3f7fc1b1a1e03d3cd..8ce6d5c49200ef47a66937546d31a35f4cbdb2fc 100644 |
| --- a/content/child/threaded_data_provider.cc |
| +++ b/content/child/threaded_data_provider.cc |
| @@ -206,6 +206,33 @@ void ThreadedDataProvider::StopOnBackgroundThread() { |
| base::Bind(&DestructOnMainThread, this)); |
| } |
| +void ThreadedDataProvider::OnRequestCompleteForegroundThread( |
| + base::WeakPtr<ResourceDispatcher> resource_dispatcher, |
| + const ResourceMsg_RequestCompleteData& request_complete_data, |
| + const base::TimeTicks& renderer_completion_time) { |
| + DCHECK(ChildThread::current()); |
| + |
| + background_thread_.message_loop()->PostTask(FROM_HERE, |
| + base::Bind(&ThreadedDataProvider::OnRequestCompleteBackgroundThread, |
| + base::Unretained(this), resource_dispatcher, |
| + request_complete_data, renderer_completion_time)); |
| +} |
| + |
| +void ThreadedDataProvider::OnRequestCompleteBackgroundThread( |
| + base::WeakPtr<ResourceDispatcher> resource_dispatcher, |
| + const ResourceMsg_RequestCompleteData& request_complete_data, |
| + const base::TimeTicks& renderer_completion_time) { |
| + DCHECK(background_thread_.isCurrentThread()); |
| + |
| + main_thread_task_runner_->PostTask(FROM_HERE, |
| + base::Bind( |
| + &ResourceDispatcher::CompletedRequestAfterBackgroundThreadFlush, |
| + resource_dispatcher, |
| + request_id_, |
| + request_complete_data, |
| + renderer_completion_time)); |
| +} |
| + |
| void ThreadedDataProvider::OnResourceMessageFilterAddedMainThread() { |
| DCHECK(ChildThread::current()); |
| DCHECK(background_thread_weak_factory_); |
| @@ -229,7 +256,7 @@ void ThreadedDataProvider::OnResourceMessageFilterAddedBackgroundThread() { |
| if (!queued_data_.empty()) { |
| std::vector<QueuedSharedMemoryData>::iterator iter = queued_data_.begin(); |
| for (; iter != queued_data_.end(); ++iter) { |
| - ForwardAndACKData(iter->data, iter->length); |
| + ForwardAndACKData(iter->data, iter->length, iter->encoded_length); |
| } |
| queued_data_.clear(); |
| @@ -247,7 +274,7 @@ void ThreadedDataProvider::OnReceivedDataOnBackgroundThread( |
| CHECK(data_ptr + data_offset); |
| if (resource_filter_active_) { |
| - ForwardAndACKData(data_ptr + data_offset, data_length); |
| + ForwardAndACKData(data_ptr + data_offset, data_length, encoded_data_length); |
| } else { |
| // There's a brief interval between the point where we know the filter |
| // has been installed on the I/O thread, and when we know for sure there's |
| @@ -258,6 +285,7 @@ void ThreadedDataProvider::OnReceivedDataOnBackgroundThread( |
| QueuedSharedMemoryData queued_data; |
| queued_data.data = data_ptr + data_offset; |
| queued_data.length = data_length; |
| + queued_data.encoded_length = encoded_data_length; |
| queued_data_.push_back(queued_data); |
| } |
| } |
| @@ -269,11 +297,12 @@ void ThreadedDataProvider::OnReceivedDataOnForegroundThread( |
| background_thread_.message_loop()->PostTask(FROM_HERE, |
| base::Bind(&ThreadedDataProvider::ForwardAndACKData, |
| base::Unretained(this), |
| - data, data_length)); |
| + data, data_length, encoded_data_length)); |
| } |
| void ThreadedDataProvider::ForwardAndACKData(const char* data, |
| - int data_length) { |
| + int data_length, |
| + int encoded_data_length) { |
| DCHECK(background_thread_.isCurrentThread()); |
| // TODO(oysteine): SiteIsolationPolicy needs to be be checked |
| @@ -281,7 +310,31 @@ void ThreadedDataProvider::ForwardAndACKData(const char* data, |
| // (or earlier on the I/O thread), otherwise once SiteIsolationPolicy does |
| // actual blocking as opposed to just UMA logging this will bypass it. |
| threaded_data_receiver_->acceptData(data, data_length); |
| + |
| + scoped_ptr<std::vector<char> > data_copy; |
| + if (threaded_data_receiver_->needsMainthreadDataCopy()) { |
|
davidben
2015/01/23 19:46:43
Can needsMainthreadDataCopy be called on both thre
oystein (OOO til 10th of July)
2015/01/23 21:23:47
Yep, it's threadsafe.
|
| + data_copy.reset(new std::vector<char>(data_length)); |
| + memcpy(data_copy->data(), data, data_length); |
| + } |
| + |
| + main_thread_task_runner_->PostTask(FROM_HERE, |
| + base::Bind(&ThreadedDataProvider::DataNotifyForegroundThread, |
| + base::Unretained(this), |
| + base::Passed(&data_copy), |
| + data_length, |
| + encoded_data_length)); |
| + |
| ipc_channel_->Send(new ResourceHostMsg_DataReceived_ACK(request_id_)); |
| } |
| +void ThreadedDataProvider::DataNotifyForegroundThread( |
| + scoped_ptr<std::vector<char> > data_copy, |
| + int data_length, |
| + int encoded_data_length) { |
| + DCHECK(!data_copy || threaded_data_receiver_->needsMainthreadDataCopy()); |
|
davidben
2015/01/23 19:46:43
Nit: I'd maybe also DCHECK something like
if (data
oystein (OOO til 10th of July)
2015/01/23 21:23:47
Done.
|
| + |
| + threaded_data_receiver_->acceptMainthreadDataNotification( |
| + data_copy ? data_copy->data() : NULL, data_length, encoded_data_length); |
|
davidben
2015/01/23 19:46:43
std::vector::data is a C++11-ism. I don't think al
oystein (OOO til 10th of July)
2015/01/23 21:23:47
Done.
|
| +} |
| + |
| } // namespace content |