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

Side by Side Diff: chrome/browser/chromeos/drive/file_system/search_operation.cc

Issue 150113002: drive: Also lock SearchOperation when locking ChangeListLoader (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/drive/file_system/search_operation.h" 5 #include "chrome/browser/chromeos/drive/file_system/search_operation.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/callback.h" 12 #include "base/callback.h"
13 #include "base/task_runner_util.h" 13 #include "base/task_runner_util.h"
14 #include "chrome/browser/chromeos/drive/change_list_loader.h"
14 #include "chrome/browser/chromeos/drive/file_system_util.h" 15 #include "chrome/browser/chromeos/drive/file_system_util.h"
15 #include "chrome/browser/chromeos/drive/job_scheduler.h" 16 #include "chrome/browser/chromeos/drive/job_scheduler.h"
16 #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" 17 #include "chrome/browser/chromeos/drive/resource_entry_conversion.h"
17 #include "chrome/browser/chromeos/drive/resource_metadata.h" 18 #include "chrome/browser/chromeos/drive/resource_metadata.h"
18 #include "content/public/browser/browser_thread.h" 19 #include "content/public/browser/browser_thread.h"
19 #include "google_apis/drive/gdata_wapi_parser.h" 20 #include "google_apis/drive/gdata_wapi_parser.h"
20 #include "url/gurl.h" 21 #include "url/gurl.h"
21 22
22 using content::BrowserThread; 23 using content::BrowserThread;
23 24
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 } 73 }
73 74
74 return FILE_ERROR_OK; 75 return FILE_ERROR_OK;
75 } 76 }
76 77
77 } // namespace 78 } // namespace
78 79
79 SearchOperation::SearchOperation( 80 SearchOperation::SearchOperation(
80 base::SequencedTaskRunner* blocking_task_runner, 81 base::SequencedTaskRunner* blocking_task_runner,
81 JobScheduler* scheduler, 82 JobScheduler* scheduler,
82 internal::ResourceMetadata* metadata) 83 internal::ResourceMetadata* metadata,
84 internal::LoaderController* loader_controller)
83 : blocking_task_runner_(blocking_task_runner), 85 : blocking_task_runner_(blocking_task_runner),
84 scheduler_(scheduler), 86 scheduler_(scheduler),
85 metadata_(metadata), 87 metadata_(metadata),
88 loader_controller_(loader_controller),
86 weak_ptr_factory_(this) { 89 weak_ptr_factory_(this) {
87 } 90 }
88 91
89 SearchOperation::~SearchOperation() { 92 SearchOperation::~SearchOperation() {
90 } 93 }
91 94
92 void SearchOperation::Search(const std::string& search_query, 95 void SearchOperation::Search(const std::string& search_query,
93 const GURL& next_link, 96 const GURL& next_link,
94 const SearchCallback& callback) { 97 const SearchCallback& callback) {
95 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 98 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 133
131 scoped_ptr<std::vector<SearchResultInfo> > result( 134 scoped_ptr<std::vector<SearchResultInfo> > result(
132 new std::vector<SearchResultInfo>); 135 new std::vector<SearchResultInfo>);
133 if (resource_list->entries().empty()) { 136 if (resource_list->entries().empty()) {
134 // Short cut. If the resource entry is empty, we don't need to refresh 137 // Short cut. If the resource entry is empty, we don't need to refresh
135 // the resource metadata. 138 // the resource metadata.
136 callback.Run(FILE_ERROR_OK, next_url, result.Pass()); 139 callback.Run(FILE_ERROR_OK, next_url, result.Pass());
137 return; 140 return;
138 } 141 }
139 142
143 // ResolveSearchResultOnBlockingPool() may add entries newly created on the
144 // server to the local metadata.
145 // This may race with sync tasks so we should ask LoaderController here.
140 std::vector<SearchResultInfo>* result_ptr = result.get(); 146 std::vector<SearchResultInfo>* result_ptr = result.get();
141 base::PostTaskAndReplyWithResult( 147 loader_controller_->ScheduleRun(base::Bind(
142 blocking_task_runner_.get(), 148 base::IgnoreResult(
149 &base::PostTaskAndReplyWithResult<FileError, FileError>),
150 blocking_task_runner_,
143 FROM_HERE, 151 FROM_HERE,
144 base::Bind(&ResolveSearchResultOnBlockingPool, 152 base::Bind(&ResolveSearchResultOnBlockingPool,
145 metadata_, 153 metadata_,
146 base::Passed(&resource_list), 154 base::Passed(&resource_list),
147 result_ptr), 155 result_ptr),
148 base::Bind(&SearchOperation::SearchAfterResolveSearchResult, 156 base::Bind(&SearchOperation::SearchAfterResolveSearchResult,
149 weak_ptr_factory_.GetWeakPtr(), 157 weak_ptr_factory_.GetWeakPtr(),
150 callback, 158 callback,
151 next_url, 159 next_url,
152 base::Passed(&result))); 160 base::Passed(&result))));
153 } 161 }
154 162
155 void SearchOperation::SearchAfterResolveSearchResult( 163 void SearchOperation::SearchAfterResolveSearchResult(
156 const SearchCallback& callback, 164 const SearchCallback& callback,
157 const GURL& next_link, 165 const GURL& next_link,
158 scoped_ptr<std::vector<SearchResultInfo> > result, 166 scoped_ptr<std::vector<SearchResultInfo> > result,
159 FileError error) { 167 FileError error) {
160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 168 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
161 DCHECK(!callback.is_null()); 169 DCHECK(!callback.is_null());
162 DCHECK(result); 170 DCHECK(result);
163 171
164 if (error != FILE_ERROR_OK) { 172 if (error != FILE_ERROR_OK) {
165 callback.Run(error, GURL(), scoped_ptr<std::vector<SearchResultInfo> >()); 173 callback.Run(error, GURL(), scoped_ptr<std::vector<SearchResultInfo> >());
166 return; 174 return;
167 } 175 }
168 176
169 callback.Run(error, next_link, result.Pass()); 177 callback.Run(error, next_link, result.Pass());
170 } 178 }
171 179
172 } // namespace file_system 180 } // namespace file_system
173 } // namespace drive 181 } // namespace drive
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698