Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/nacl_host/pnacl_host.h" | 5 #include "chrome/browser/nacl_host/pnacl_host.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 261 LOG(ERROR) << "OnTempFileReturn: id not found"; | 261 LOG(ERROR) << "OnTempFileReturn: id not found"; |
| 262 BrowserThread::PostBlockingPoolTask( | 262 BrowserThread::PostBlockingPoolTask( |
| 263 FROM_HERE, base::Bind(base::IgnoreResult(base::ClosePlatformFile), fd)); | 263 FROM_HERE, base::Bind(base::IgnoreResult(base::ClosePlatformFile), fd)); |
| 264 return; | 264 return; |
| 265 } | 265 } |
| 266 if (fd == base::kInvalidPlatformFileValue) { | 266 if (fd == base::kInvalidPlatformFileValue) { |
| 267 // This translation will fail, but we need to retry any translation | 267 // This translation will fail, but we need to retry any translation |
| 268 // waiting for its result. | 268 // waiting for its result. |
| 269 LOG(ERROR) << "OnTempFileReturn: temp file creation failed"; | 269 LOG(ERROR) << "OnTempFileReturn: temp file creation failed"; |
| 270 std::string key(entry->second.cache_key); | 270 std::string key(entry->second.cache_key); |
| 271 bool is_incognito = entry->second.is_incognito; | 271 bool may_have_waiting_translations = !entry->second.is_incognito && |
| 272 !entry->second.cache_info.has_no_store_header; | |
|
jvoung (off chromium)
2013/08/30 22:19:09
Would it be useful to put these checks in a helper
Derek Schuff
2013/09/03 22:14:52
Done.
| |
| 272 entry->second.callback.Run(fd, false); | 273 entry->second.callback.Run(fd, false); |
| 273 pending_translations_.erase(entry); | 274 pending_translations_.erase(entry); |
| 274 // No translations will be waiting for an incongnito translation | 275 // No translations will be waiting for an incongnito translation |
| 275 if (!is_incognito) | 276 if (may_have_waiting_translations) |
| 276 RequeryMatchingTranslations(key); | 277 RequeryMatchingTranslations(key); |
| 277 return; | 278 return; |
| 278 } | 279 } |
| 279 PendingTranslation* pt = &entry->second; | 280 PendingTranslation* pt = &entry->second; |
| 280 pt->got_nexe_fd = true; | 281 pt->got_nexe_fd = true; |
| 281 pt->nexe_fd = fd; | 282 pt->nexe_fd = fd; |
| 282 CheckCacheQueryReady(entry); | 283 CheckCacheQueryReady(entry); |
| 283 } | 284 } |
| 284 | 285 |
| 285 // Check whether both the cache query and the temp file have returned, and check | 286 // Check whether both the cache query and the temp file have returned, and check |
| 286 // whether we actually got a hit or not. | 287 // whether we actually got a hit or not. |
| 287 void PnaclHost::CheckCacheQueryReady( | 288 void PnaclHost::CheckCacheQueryReady( |
| 288 const PendingTranslationMap::iterator& entry) { | 289 const PendingTranslationMap::iterator& entry) { |
| 289 PendingTranslation* pt = &entry->second; | 290 PendingTranslation* pt = &entry->second; |
| 290 if (!(pt->got_cache_reply && pt->got_nexe_fd)) | 291 if (!(pt->got_cache_reply && pt->got_nexe_fd)) |
| 291 return; | 292 return; |
| 292 if (!pt->got_cache_hit) { | 293 if (!pt->got_cache_hit) { |
| 293 // Check if there is already a pending translation for this file. If there | 294 // Check if there is already a pending translation for this file. If there |
| 294 // is, we will wait for it to come back, to avoid redundant translations. | 295 // is, we will wait for it to come back, to avoid redundant translations. |
| 295 for (PendingTranslationMap::iterator it = pending_translations_.begin(); | 296 for (PendingTranslationMap::iterator it = pending_translations_.begin(); |
| 296 it != pending_translations_.end(); | 297 it != pending_translations_.end(); |
| 297 ++it) { | 298 ++it) { |
| 298 // Another translation matches if it's a request for the same file, | 299 // Another translation matches if it's a request for the same file, |
| 299 if (it->second.cache_key == entry->second.cache_key && | 300 if (it->second.cache_key == entry->second.cache_key && |
| 300 // and it's not this translation, | 301 // and it's not this translation, |
| 301 it->first != entry->first && | 302 it->first != entry->first && |
| 302 // and it's not incognito, | 303 // and it's not incognito, |
| 303 !it->second.is_incognito && | 304 !it->second.is_incognito && |
| 305 // and it doesn't have the no-store header | |
| 306 !it->second.cache_info.has_no_store_header && | |
| 304 // and if it's already gotten past this check and returned the miss. | 307 // and if it's already gotten past this check and returned the miss. |
| 305 it->second.got_cache_reply && | 308 it->second.got_cache_reply && |
| 306 it->second.got_nexe_fd) { | 309 it->second.got_nexe_fd) { |
| 307 return; | 310 return; |
| 308 } | 311 } |
| 309 } | 312 } |
| 310 ReturnMiss(entry); | 313 ReturnMiss(entry); |
| 311 return; | 314 return; |
| 312 } | 315 } |
| 313 | 316 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 377 << "," << pp_instance << " not found."; | 380 << "," << pp_instance << " not found."; |
| 378 return; | 381 return; |
| 379 } | 382 } |
| 380 bool store_nexe = true; | 383 bool store_nexe = true; |
| 381 // If this is a premature response (i.e. we haven't returned a temp file | 384 // If this is a premature response (i.e. we haven't returned a temp file |
| 382 // yet) or if it's an unsuccessful translation, or if we are incognito, | 385 // yet) or if it's an unsuccessful translation, or if we are incognito, |
| 383 // don't store in the cache. | 386 // don't store in the cache. |
| 384 // TODO(dschuff): use a separate in-memory cache for incognito | 387 // TODO(dschuff): use a separate in-memory cache for incognito |
| 385 // translations. | 388 // translations. |
| 386 if (!entry->second.got_nexe_fd || !entry->second.got_cache_reply || | 389 if (!entry->second.got_nexe_fd || !entry->second.got_cache_reply || |
| 387 !success || entry->second.is_incognito) { | 390 !success || entry->second.is_incognito || |
| 391 entry->second.cache_info.has_no_store_header) { | |
| 388 store_nexe = false; | 392 store_nexe = false; |
| 389 } else if (!base::PostTaskAndReplyWithResult( | 393 } else if (!base::PostTaskAndReplyWithResult( |
| 390 BrowserThread::GetBlockingPool(), | 394 BrowserThread::GetBlockingPool(), |
| 391 FROM_HERE, | 395 FROM_HERE, |
| 392 base::Bind(&PnaclHost::CopyFileToBuffer, | 396 base::Bind(&PnaclHost::CopyFileToBuffer, |
| 393 entry->second.nexe_fd), | 397 entry->second.nexe_fd), |
| 394 base::Bind(&PnaclHost::StoreTranslatedNexe, | 398 base::Bind(&PnaclHost::StoreTranslatedNexe, |
| 395 weak_factory_.GetWeakPtr(), | 399 weak_factory_.GetWeakPtr(), |
| 396 id))) { | 400 id))) { |
| 397 store_nexe = false; | 401 store_nexe = false; |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 518 for (PendingTranslationMap::iterator it = pending_translations_.begin(); | 522 for (PendingTranslationMap::iterator it = pending_translations_.begin(); |
| 519 it != pending_translations_.end();) { | 523 it != pending_translations_.end();) { |
| 520 PendingTranslationMap::iterator to_erase(it++); | 524 PendingTranslationMap::iterator to_erase(it++); |
| 521 if (to_erase->first.first == render_process_id) { | 525 if (to_erase->first.first == render_process_id) { |
| 522 // Clean up the open files. | 526 // Clean up the open files. |
| 523 BrowserThread::PostBlockingPoolTask( | 527 BrowserThread::PostBlockingPoolTask( |
| 524 FROM_HERE, | 528 FROM_HERE, |
| 525 base::Bind(base::IgnoreResult(base::ClosePlatformFile), | 529 base::Bind(base::IgnoreResult(base::ClosePlatformFile), |
| 526 to_erase->second.nexe_fd)); | 530 to_erase->second.nexe_fd)); |
| 527 std::string key(to_erase->second.cache_key); | 531 std::string key(to_erase->second.cache_key); |
| 528 bool is_incognito = to_erase->second.is_incognito; | 532 bool may_have_waiting_translations = !to_erase->second.is_incognito && |
| 533 !to_erase->second.cache_info.has_no_store_header; | |
| 529 pending_translations_.erase(to_erase); | 534 pending_translations_.erase(to_erase); |
| 530 // No translations will be blocked waiting for an incongnito translation | 535 // No translations will be blocked waiting for an incongnito translation |
| 531 if (!is_incognito) | 536 if (may_have_waiting_translations) |
| 532 RequeryMatchingTranslations(key); | 537 RequeryMatchingTranslations(key); |
| 533 } | 538 } |
| 534 } | 539 } |
| 535 if (pending_translations_.empty()) { | 540 if (pending_translations_.empty()) { |
| 536 cache_state_ = CacheUninitialized; | 541 cache_state_ = CacheUninitialized; |
| 537 // Freeing the backend causes it to flush to disk, so do it when the | 542 // Freeing the backend causes it to flush to disk, so do it when the |
| 538 // last renderer closes rather than on destruction. | 543 // last renderer closes rather than on destruction. |
| 539 disk_cache_.reset(); | 544 disk_cache_.reset(); |
| 540 } | 545 } |
| 541 } | 546 } |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 568 end_time, | 573 end_time, |
| 569 base::Bind(&PnaclHost::OnEntriesDoomed, callback)); | 574 base::Bind(&PnaclHost::OnEntriesDoomed, callback)); |
| 570 if (rv != net::ERR_IO_PENDING) | 575 if (rv != net::ERR_IO_PENDING) |
| 571 OnEntriesDoomed(callback, rv); | 576 OnEntriesDoomed(callback, rv); |
| 572 } | 577 } |
| 573 | 578 |
| 574 // static | 579 // static |
| 575 void PnaclHost::OnEntriesDoomed(const base::Closure& callback, int net_error) { | 580 void PnaclHost::OnEntriesDoomed(const base::Closure& callback, int net_error) { |
| 576 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback); | 581 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback); |
| 577 } | 582 } |
| OLD | NEW |