| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "content/browser/gpu/shader_disk_cache.h" | 5 #include "content/browser/gpu/shader_disk_cache.h" |
| 6 | 6 |
| 7 #include "base/profiler/scoped_tracker.h" | 7 #include "base/profiler/scoped_tracker.h" |
| 8 #include "base/threading/thread_checker.h" | 8 #include "base/threading/thread_checker.h" |
| 9 #include "content/browser/gpu/gpu_process_host.h" | 9 #include "content/browser/gpu/gpu_process_host.h" |
| 10 #include "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
| (...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 const base::Closure& callback) | 392 const base::Closure& callback) |
| 393 : cache_(cache), | 393 : cache_(cache), |
| 394 op_type_(VERIFY_CACHE_SETUP), | 394 op_type_(VERIFY_CACHE_SETUP), |
| 395 path_(path), | 395 path_(path), |
| 396 delete_begin_(delete_begin), | 396 delete_begin_(delete_begin), |
| 397 delete_end_(delete_end), | 397 delete_end_(delete_end), |
| 398 callback_(callback) { | 398 callback_(callback) { |
| 399 } | 399 } |
| 400 | 400 |
| 401 ShaderClearHelper::~ShaderClearHelper() { | 401 ShaderClearHelper::~ShaderClearHelper() { |
| 402 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 402 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 403 } | 403 } |
| 404 | 404 |
| 405 void ShaderClearHelper::Clear() { | 405 void ShaderClearHelper::Clear() { |
| 406 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 406 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 407 DoClearShaderCache(net::OK); | 407 DoClearShaderCache(net::OK); |
| 408 } | 408 } |
| 409 | 409 |
| 410 void ShaderClearHelper::DoClearShaderCache(int rv) { | 410 void ShaderClearHelper::DoClearShaderCache(int rv) { |
| 411 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 411 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 412 | 412 |
| 413 // Hold a ref to ourselves so when we do the CacheCleared call we don't get | 413 // Hold a ref to ourselves so when we do the CacheCleared call we don't get |
| 414 // auto-deleted when our ref count drops to zero. | 414 // auto-deleted when our ref count drops to zero. |
| 415 scoped_refptr<ShaderClearHelper> helper = this; | 415 scoped_refptr<ShaderClearHelper> helper = this; |
| 416 | 416 |
| 417 while (rv != net::ERR_IO_PENDING) { | 417 while (rv != net::ERR_IO_PENDING) { |
| 418 switch (op_type_) { | 418 switch (op_type_) { |
| 419 case VERIFY_CACHE_SETUP: | 419 case VERIFY_CACHE_SETUP: |
| 420 rv = cache_->SetAvailableCallback( | 420 rv = cache_->SetAvailableCallback( |
| 421 base::Bind(&ShaderClearHelper::DoClearShaderCache, AsWeakPtr())); | 421 base::Bind(&ShaderClearHelper::DoClearShaderCache, AsWeakPtr())); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 } | 486 } |
| 487 | 487 |
| 488 void ShaderCacheFactory::RemoveFromCache(const base::FilePath& key) { | 488 void ShaderCacheFactory::RemoveFromCache(const base::FilePath& key) { |
| 489 shader_cache_map_.erase(key); | 489 shader_cache_map_.erase(key); |
| 490 } | 490 } |
| 491 | 491 |
| 492 void ShaderCacheFactory::ClearByPath(const base::FilePath& path, | 492 void ShaderCacheFactory::ClearByPath(const base::FilePath& path, |
| 493 const base::Time& delete_begin, | 493 const base::Time& delete_begin, |
| 494 const base::Time& delete_end, | 494 const base::Time& delete_end, |
| 495 const base::Closure& callback) { | 495 const base::Closure& callback) { |
| 496 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 496 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 497 DCHECK(!callback.is_null()); | 497 DCHECK(!callback.is_null()); |
| 498 | 498 |
| 499 scoped_refptr<ShaderClearHelper> helper = new ShaderClearHelper( | 499 scoped_refptr<ShaderClearHelper> helper = new ShaderClearHelper( |
| 500 GetByPath(path), path, delete_begin, delete_end, callback); | 500 GetByPath(path), path, delete_begin, delete_end, callback); |
| 501 | 501 |
| 502 // We could receive requests to clear the same path with different | 502 // We could receive requests to clear the same path with different |
| 503 // begin/end times. So, we keep a list of requests. If we haven't seen this | 503 // begin/end times. So, we keep a list of requests. If we haven't seen this |
| 504 // path before we kick off the clear and add it to the list. If we have see it | 504 // path before we kick off the clear and add it to the list. If we have see it |
| 505 // already, then we already have a clear running. We add this clear to the | 505 // already, then we already have a clear running. We add this clear to the |
| 506 // list and wait for any previous clears to finish. | 506 // list and wait for any previous clears to finish. |
| 507 ShaderClearMap::iterator iter = shader_clear_map_.find(path); | 507 ShaderClearMap::iterator iter = shader_clear_map_.find(path); |
| 508 if (iter != shader_clear_map_.end()) { | 508 if (iter != shader_clear_map_.end()) { |
| 509 iter->second.push(helper); | 509 iter->second.push(helper); |
| 510 return; | 510 return; |
| 511 } | 511 } |
| 512 | 512 |
| 513 shader_clear_map_.insert( | 513 shader_clear_map_.insert( |
| 514 std::pair<base::FilePath, ShaderClearQueue>(path, ShaderClearQueue())); | 514 std::pair<base::FilePath, ShaderClearQueue>(path, ShaderClearQueue())); |
| 515 shader_clear_map_[path].push(helper); | 515 shader_clear_map_[path].push(helper); |
| 516 helper->Clear(); | 516 helper->Clear(); |
| 517 } | 517 } |
| 518 | 518 |
| 519 void ShaderCacheFactory::CacheCleared(const base::FilePath& path) { | 519 void ShaderCacheFactory::CacheCleared(const base::FilePath& path) { |
| 520 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 520 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 521 | 521 |
| 522 ShaderClearMap::iterator iter = shader_clear_map_.find(path); | 522 ShaderClearMap::iterator iter = shader_clear_map_.find(path); |
| 523 if (iter == shader_clear_map_.end()) { | 523 if (iter == shader_clear_map_.end()) { |
| 524 LOG(ERROR) << "Completed clear but missing clear helper."; | 524 LOG(ERROR) << "Completed clear but missing clear helper."; |
| 525 return; | 525 return; |
| 526 } | 526 } |
| 527 | 527 |
| 528 iter->second.pop(); | 528 iter->second.pop(); |
| 529 | 529 |
| 530 // If there are remaining items in the list we trigger the Clear on the | 530 // If there are remaining items in the list we trigger the Clear on the |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 const net::CompletionCallback& callback) { | 642 const net::CompletionCallback& callback) { |
| 643 if (entry_map_.empty()) { | 643 if (entry_map_.empty()) { |
| 644 return net::OK; | 644 return net::OK; |
| 645 } | 645 } |
| 646 cache_complete_callback_ = callback; | 646 cache_complete_callback_ = callback; |
| 647 return net::ERR_IO_PENDING; | 647 return net::ERR_IO_PENDING; |
| 648 } | 648 } |
| 649 | 649 |
| 650 } // namespace content | 650 } // namespace content |
| 651 | 651 |
| OLD | NEW |