Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Unified Diff: content/child/threaded_data_provider.cc

Issue 689713004: Threaded data provider: Support main thread data notifications (Chrome side) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« content/child/resource_dispatcher.cc ('K') | « content/child/threaded_data_provider.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698