lru_renderer_cache.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef CHROMECAST_BROWSER_LRU_RENDERER_CACHE_H_
  5. #define CHROMECAST_BROWSER_LRU_RENDERER_CACHE_H_
  6. #include <list>
  7. #include <memory>
  8. #include "base/memory/memory_pressure_listener.h"
  9. #include "base/memory/ref_counted.h"
  10. #include "base/memory/weak_ptr.h"
  11. #include "url/gurl.h"
  12. namespace content {
  13. class BrowserContext;
  14. }
  15. namespace chromecast {
  16. class RendererPrelauncher;
  17. // Factory class for testing.
  18. class RendererPrelauncherFactory {
  19. public:
  20. virtual std::unique_ptr<RendererPrelauncher> Create(
  21. content::BrowserContext* browser_context,
  22. const GURL& page_url) = 0;
  23. virtual ~RendererPrelauncherFactory() = default;
  24. };
  25. // This class maintains a pool of prelaunched (initialized) renderers.
  26. class LRURendererCache {
  27. public:
  28. LRURendererCache(content::BrowserContext* browser_context,
  29. size_t max_renderers);
  30. LRURendererCache(const LRURendererCache&) = delete;
  31. LRURendererCache& operator=(const LRURendererCache&) = delete;
  32. virtual ~LRURendererCache();
  33. // Returns a pre-launched renderer. Returns nullptr if a cached renderer isn't
  34. // available (clients should create their own in this case).
  35. std::unique_ptr<RendererPrelauncher> TakeRendererPrelauncher(
  36. const GURL& page_url);
  37. // Indicate that the renderer for |page_url| is no longer in use. If the total
  38. // number of in-use renderers is less than |max_renderers_|, then we will
  39. // immediately pre-load the renderer for |page_url| since it was recently
  40. // used. This operation may evict a prelaunched renderer to keep the total
  41. // pool size below |max_renderers_|
  42. void ReleaseRendererPrelauncher(const GURL& page_url);
  43. private:
  44. friend class LRURendererCacheTest;
  45. void SetFactoryForTesting(RendererPrelauncherFactory* factory);
  46. void StartNextPrelauncher(const GURL& page_url);
  47. void OnMemoryPressure(
  48. base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level);
  49. // Evict pre-launched renderers so that the total number of in-use and cached
  50. // renderers doesn't exceed |max_renderers_|.
  51. void EvictCache();
  52. content::BrowserContext* const browser_context_;
  53. const size_t max_renderers_;
  54. size_t in_use_count_;
  55. std::list<std::unique_ptr<RendererPrelauncher>> cache_;
  56. std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_;
  57. RendererPrelauncherFactory* factory_for_testing_ = nullptr;
  58. base::WeakPtrFactory<LRURendererCache> weak_factory_;
  59. };
  60. } // namespace chromecast
  61. #endif // CHROMECAST_BROWSER_LRU_RENDERER_CACHE_H_