diff options
Diffstat (limited to 'android_webview')
-rw-r--r-- | android_webview/android_webview.gyp | 3 | ||||
-rw-r--r-- | android_webview/android_webview_tests.gypi | 1 | ||||
-rw-r--r-- | android_webview/browser/browser_view_renderer.cc | 96 | ||||
-rw-r--r-- | android_webview/browser/browser_view_renderer.h | 26 | ||||
-rw-r--r-- | android_webview/browser/global_tile_manager.cc | 152 | ||||
-rw-r--r-- | android_webview/browser/global_tile_manager.h | 79 | ||||
-rw-r--r-- | android_webview/browser/global_tile_manager_client.h | 30 | ||||
-rw-r--r-- | android_webview/browser/global_tile_manager_unittest.cc | 165 |
8 files changed, 17 insertions, 535 deletions
diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp index 87cd122..0c020af2 100644 --- a/android_webview/android_webview.gyp +++ b/android_webview/android_webview.gyp @@ -134,9 +134,6 @@ 'browser/deferred_gpu_command_service.h', 'browser/find_helper.cc', 'browser/find_helper.h', - 'browser/global_tile_manager.cc', - 'browser/global_tile_manager.h', - 'browser/global_tile_manager_client.h', 'browser/hardware_renderer.cc', 'browser/hardware_renderer.h', 'browser/icon_helper.cc', diff --git a/android_webview/android_webview_tests.gypi b/android_webview/android_webview_tests.gypi index 7feab4f..d775cc9 100644 --- a/android_webview/android_webview_tests.gypi +++ b/android_webview/android_webview_tests.gypi @@ -110,7 +110,6 @@ 'sources': [ 'browser/aw_static_cookie_policy_unittest.cc', 'browser/aw_form_database_service_unittest.cc', - 'browser/global_tile_manager_unittest.cc', 'browser/net/android_stream_reader_url_request_job_unittest.cc', 'browser/net/input_stream_reader_unittest.cc', 'lib/main/webview_tests.cc', diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc index f897b0c..5bf8168 100644 --- a/android_webview/browser/browser_view_renderer.cc +++ b/android_webview/browser/browser_view_renderer.cc @@ -23,8 +23,6 @@ #include "third_party/skia/include/core/SkPictureRecorder.h" #include "ui/gfx/geometry/vector2d_conversions.h" -using content::SynchronousCompositorMemoryPolicy; - namespace android_webview { namespace { @@ -37,13 +35,6 @@ const size_t kBytesPerPixel = 4; const size_t kMemoryAllocationStep = 5 * 1024 * 1024; uint64 g_memory_override_in_bytes = 0u; -// Used to calculate tile allocation. Determined experimentally. -const size_t kTileMultiplier = 12; -const size_t kTileAllocationStep = 20; -// Use chrome's default tile size, which varies from 256 to 512. -// Be conservative here and use the smallest tile size possible. -const size_t kTileArea = 256 * 256; - } // namespace // static @@ -60,10 +51,6 @@ void BrowserViewRenderer::CalculateTileMemoryPolicy() { &g_memory_override_in_bytes); g_memory_override_in_bytes *= 1024 * 1024; } - - // There is no need to limit number of tiles, so use an effectively unlimited - // value as the limit. - GlobalTileManager::GetInstance()->SetTileLimit(10 * 1000 * 1000); } BrowserViewRenderer::BrowserViewRenderer( @@ -131,68 +118,29 @@ void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { if (level < TRIM_MEMORY_BACKGROUND && visible) return; - // Just set the memory limit to 0 and drop all tiles. This will be reset to - // normal levels in the next DrawGL call. - SynchronousCompositorMemoryPolicy zero_policy; - if (memory_policy_ == zero_policy) + // Nothing to drop. + if (!compositor_ || !hardware_enabled_) return; TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory"); - DCHECK(hardware_enabled_); - DCHECK(compositor_); - RequestMemoryPolicy(zero_policy); - EnforceMemoryPolicyImmediately(zero_policy); + // Just set the memory limit to 0 and drop all tiles. This will be reset to + // normal levels in the next DrawGL call. + compositor_->SetMemoryPolicy(0u); + ForceFakeCompositeSW(); } -SynchronousCompositorMemoryPolicy -BrowserViewRenderer::CalculateDesiredMemoryPolicy() { - SynchronousCompositorMemoryPolicy policy; +size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() { + if (g_memory_override_in_bytes) + return static_cast<size_t>(g_memory_override_in_bytes); + size_t width = last_on_draw_global_visible_rect_.width(); size_t height = last_on_draw_global_visible_rect_.height(); - policy.bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; + size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; // Round up to a multiple of kMemoryAllocationStep. - policy.bytes_limit = - (policy.bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep; - - if (g_memory_override_in_bytes) - policy.bytes_limit = static_cast<size_t>(g_memory_override_in_bytes); - - size_t tiles = width * height * kTileMultiplier / kTileArea; - // Round up to a multiple of kTileAllocationStep. The minimum number of tiles - // is also kTileAllocationStep. - tiles = (tiles / kTileAllocationStep + 1) * kTileAllocationStep; - policy.num_resources_limit = tiles; - return policy; -} - -// This function updates the cached memory policy in shared renderer state, as -// well as the tile resource allocation in GlobalTileManager. -void BrowserViewRenderer::RequestMemoryPolicy( - SynchronousCompositorMemoryPolicy& new_policy) { - DCHECK(compositor_); - GlobalTileManager* manager = GlobalTileManager::GetInstance(); - - // The following line will call BrowserViewRenderer::SetMemoryPolicy(). - manager->RequestTiles(new_policy, tile_manager_key_); -} - -void BrowserViewRenderer::SetMemoryPolicy( - SynchronousCompositorMemoryPolicy new_policy, - bool effective_immediately) { - memory_policy_ = new_policy; - if (effective_immediately) - EnforceMemoryPolicyImmediately(memory_policy_); -} - -void BrowserViewRenderer::EnforceMemoryPolicyImmediately( - SynchronousCompositorMemoryPolicy new_policy) { - compositor_->SetMemoryPolicy(new_policy); - ForceFakeCompositeSW(); -} - -SynchronousCompositorMemoryPolicy BrowserViewRenderer::GetMemoryPolicy() const { - return memory_policy_; + bytes_limit = + (bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep; + return bytes_limit; } bool BrowserViewRenderer::OnDraw(jobject java_canvas, @@ -223,9 +171,6 @@ bool BrowserViewRenderer::OnDrawHardware() { if (!hardware_enabled_) { hardware_enabled_ = compositor_->InitializeHwDraw(); - if (hardware_enabled_) { - tile_manager_key_ = GlobalTileManager::GetInstance()->PushBack(this); - } } if (!hardware_enabled_) return false; @@ -253,14 +198,11 @@ bool BrowserViewRenderer::OnDrawHardware() { return false; shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), false); - GlobalTileManager::GetInstance()->DidUse(tile_manager_key_); return true; } scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() { - SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy(); - RequestMemoryPolicy(new_policy); - compositor_->SetMemoryPolicy(memory_policy_); + compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy()); parent_draw_constraints_ = shared_renderer_state_.GetParentDrawConstraintsOnUI(); @@ -461,12 +403,9 @@ void BrowserViewRenderer::ReleaseHardware() { if (compositor_) { compositor_->ReleaseHwDraw(); - SynchronousCompositorMemoryPolicy zero_policy; - RequestMemoryPolicy(zero_policy); } hardware_enabled_ = false; - GlobalTileManager::GetInstance()->Remove(tile_manager_key_); } bool BrowserViewRenderer::IsVisible() const { @@ -491,11 +430,6 @@ void BrowserViewRenderer::DidDestroyCompositor( content::SynchronousCompositor* compositor) { TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor"); DCHECK(compositor_); - SynchronousCompositorMemoryPolicy zero_policy; - if (hardware_enabled_) { - RequestMemoryPolicy(zero_policy); - } - DCHECK(memory_policy_ == zero_policy); compositor_ = NULL; } diff --git a/android_webview/browser/browser_view_renderer.h b/android_webview/browser/browser_view_renderer.h index b0852fd..c2d44f1 100644 --- a/android_webview/browser/browser_view_renderer.h +++ b/android_webview/browser/browser_view_renderer.h @@ -5,8 +5,6 @@ #ifndef ANDROID_WEBVIEW_BROWSER_BROWSER_VIEW_RENDERER_H_ #define ANDROID_WEBVIEW_BROWSER_BROWSER_VIEW_RENDERER_H_ -#include "android_webview/browser/global_tile_manager.h" -#include "android_webview/browser/global_tile_manager_client.h" #include "android_webview/browser/parent_compositor_draw_constraints.h" #include "android_webview/browser/shared_renderer_state.h" #include "base/android/scoped_java_ref.h" @@ -23,7 +21,6 @@ class SkCanvas; class SkPicture; namespace content { -struct SynchronousCompositorMemoryPolicy; class WebContents; } @@ -54,8 +51,7 @@ class BrowserViewRendererJavaHelper { // Interface for all the WebView-specific content rendering operations. // Provides software and hardware rendering and the Capture Picture API. -class BrowserViewRenderer : public content::SynchronousCompositorClient, - public GlobalTileManagerClient { +class BrowserViewRenderer : public content::SynchronousCompositorClient { public: static void CalculateTileMemoryPolicy(); @@ -108,11 +104,6 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient, bool hardware_enabled() const { return hardware_enabled_; } void ReleaseHardware(); - // Set the memory policy in shared renderer state and request the tiles from - // GlobalTileManager. The actually amount of memory allowed by - // GlobalTileManager may not be equal to what's requested in |policy|. - void RequestMemoryPolicy(content::SynchronousCompositorMemoryPolicy& policy); - void TrimMemory(const int level, const bool visible); // SynchronousCompositorClient overrides. @@ -135,13 +126,6 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient, gfx::Vector2dF latest_overscroll_delta, gfx::Vector2dF current_fling_velocity) override; - // GlobalTileManagerClient overrides. - virtual content::SynchronousCompositorMemoryPolicy GetMemoryPolicy() - const override; - virtual void SetMemoryPolicy( - content::SynchronousCompositorMemoryPolicy new_policy, - bool effective_immediately) override; - void UpdateParentDrawConstraints(); void DidSkipCommitFrame(); @@ -179,12 +163,9 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient, // compositor that are not directly exposed here. void ForceFakeCompositeSW(); - void EnforceMemoryPolicyImmediately( - content::SynchronousCompositorMemoryPolicy policy); - gfx::Vector2d max_scroll_offset() const; - content::SynchronousCompositorMemoryPolicy CalculateDesiredMemoryPolicy(); + size_t CalculateDesiredMemoryPolicy(); // For debug tracing or logging. Return the string representation of this // view renderer's state. std::string ToString() const; @@ -242,9 +223,6 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient, // spot over a period of time). gfx::Vector2dF overscroll_rounding_error_; - GlobalTileManager::Key tile_manager_key_; - content::SynchronousCompositorMemoryPolicy memory_policy_; - DISALLOW_COPY_AND_ASSIGN(BrowserViewRenderer); }; diff --git a/android_webview/browser/global_tile_manager.cc b/android_webview/browser/global_tile_manager.cc deleted file mode 100644 index 200a7ea..0000000 --- a/android_webview/browser/global_tile_manager.cc +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "android_webview/browser/global_tile_manager.h" -#include "android_webview/browser/global_tile_manager_client.h" -#include "base/lazy_instance.h" - -using content::SynchronousCompositorMemoryPolicy; - -namespace android_webview { - -namespace { - -base::LazyInstance<GlobalTileManager>::Leaky g_tile_manager = - LAZY_INSTANCE_INITIALIZER; - -// The soft limit of the number of file descriptors per process is 1024 on -// Android and gralloc buffers may not be the only thing that uses file -// descriptors. For each tile, there is a gralloc buffer backing it, which -// uses 2 FDs. -const size_t kNumTilesLimit = 450; - -} // namespace - -// static -GlobalTileManager* GlobalTileManager::GetInstance() { - return g_tile_manager.Pointer(); -} - -void GlobalTileManager::Remove(Key key) { - DCHECK(sequence_checker_.CalledOnValidSequencedThread()); - DCHECK(mru_list_.end() != key); - - total_allocated_tiles_ -= (*key)->GetMemoryPolicy().num_resources_limit; - mru_list_.erase(key); - DCHECK(IsConsistent()); -} - -size_t GlobalTileManager::Evict(size_t desired_num_tiles, Key key) { - DCHECK(sequence_checker_.CalledOnValidSequencedThread()); - size_t total_evicted_tiles = 0; - - // Evicts from the least recent drawn view, until the disired number of tiles - // can be reclaimed, or until we've evicted all inactive views. - ListType::reverse_iterator it; - for (it = mru_list_.rbegin(); it != mru_list_.rend(); it++) { - // key represents the view that requested the eviction, so we don't need to - // evict the requester itself. And we only evict the inactive views, - // which are all the views after the requester. - if (*it == *key) - break; - - size_t evicted_tiles = (*it)->GetMemoryPolicy().num_resources_limit; - SynchronousCompositorMemoryPolicy zero_policy; - (*it)->SetMemoryPolicy(zero_policy, true); - - total_evicted_tiles += evicted_tiles; - if (total_evicted_tiles >= desired_num_tiles) - break; - } - - return total_evicted_tiles; -} - -void GlobalTileManager::SetTileLimit(size_t num_tiles_limit) { - num_tiles_limit_ = num_tiles_limit; -} - -void GlobalTileManager::RequestTiles( - SynchronousCompositorMemoryPolicy new_policy, - Key key) { - DCHECK(IsConsistent()); - DCHECK(sequence_checker_.CalledOnValidSequencedThread()); - size_t new_num_of_tiles = new_policy.num_resources_limit; - size_t old_num_of_tiles = (*key)->GetMemoryPolicy().num_resources_limit; - size_t num_of_active_views = std::distance(mru_list_.begin(), key) + 1; - size_t tiles_per_view_limit; - if (num_of_active_views == 0) - tiles_per_view_limit = num_tiles_limit_; - else - tiles_per_view_limit = num_tiles_limit_ / num_of_active_views; - new_num_of_tiles = std::min(new_num_of_tiles, tiles_per_view_limit); - size_t new_total_allocated_tiles = - total_allocated_tiles_ - old_num_of_tiles + new_num_of_tiles; - // Has enough tiles to satisfy the request. - if (new_total_allocated_tiles <= num_tiles_limit_) { - total_allocated_tiles_ = new_total_allocated_tiles; - new_policy.num_resources_limit = new_num_of_tiles; - (*key)->SetMemoryPolicy(new_policy, false); - return; - } - - // Does not have enough tiles. Now evict other clients' tiles. - size_t tiles_left = num_tiles_limit_ - total_allocated_tiles_; - - size_t evicted_tiles = - Evict(new_total_allocated_tiles - num_tiles_limit_, key); - if (evicted_tiles >= new_total_allocated_tiles - num_tiles_limit_) { - new_total_allocated_tiles -= evicted_tiles; - total_allocated_tiles_ = new_total_allocated_tiles; - new_policy.num_resources_limit = new_num_of_tiles; - (*key)->SetMemoryPolicy(new_policy, false); - return; - } else { - total_allocated_tiles_ = num_tiles_limit_; - new_policy.num_resources_limit = - tiles_left + old_num_of_tiles + evicted_tiles; - (*key)->SetMemoryPolicy(new_policy, false); - return; - } -} - -GlobalTileManager::Key GlobalTileManager::PushBack( - GlobalTileManagerClient* client) { - DCHECK(sequence_checker_.CalledOnValidSequencedThread()); - DCHECK(mru_list_.end() == - std::find(mru_list_.begin(), mru_list_.end(), client)); - mru_list_.push_back(client); - Key back = mru_list_.end(); - back--; - return back; -} - -void GlobalTileManager::DidUse(Key key) { - DCHECK(sequence_checker_.CalledOnValidSequencedThread()); - DCHECK(mru_list_.end() != key); - - mru_list_.splice(mru_list_.begin(), mru_list_, key); -} - -GlobalTileManager::GlobalTileManager() - : num_tiles_limit_(kNumTilesLimit), total_allocated_tiles_(0) { -} - -GlobalTileManager::~GlobalTileManager() { -} - -bool GlobalTileManager::IsConsistent() const { - size_t total_tiles = 0; - ListType::const_iterator it; - for (it = mru_list_.begin(); it != mru_list_.end(); it++) { - total_tiles += (*it)->GetMemoryPolicy().num_resources_limit; - } - - bool is_consistent = (total_tiles <= num_tiles_limit_ && - total_tiles == total_allocated_tiles_); - - return is_consistent; -} - -} // namespace webview diff --git a/android_webview/browser/global_tile_manager.h b/android_webview/browser/global_tile_manager.h deleted file mode 100644 index bf83e9e..0000000 --- a/android_webview/browser/global_tile_manager.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ANDROID_WEBVIEW_BROWSER_GLOBAL_TILE_MANAGER_H_ -#define ANDROID_WEBVIEW_BROWSER_GLOBAL_TILE_MANAGER_H_ - -#include <list> -#include "base/basictypes.h" -#include "base/lazy_instance.h" -#include "base/sequence_checker.h" -#include "base/synchronization/lock.h" -#include "content/public/browser/android/synchronous_compositor.h" - -namespace android_webview { - -class GlobalTileManagerClient; - -// A global tile manager that keeps track of the number of tile resources. Each -// tile needs file descriptors (typically 2) and there is a soft limit of 1024 -// file descriptors per Android process. The GlobalTileManager does not keep -// track of how many tiles each individual view is actually using. The purpose -// of GlobalTileManager is to behave gracefully (as in not crashing) when the -// embedder of webview creates a lot of webviews and draw them at the same time. -class GlobalTileManager { - private: - typedef std::list<GlobalTileManagerClient*> ListType; - - public: - typedef ListType::iterator Key; - static GlobalTileManager* GetInstance(); - - void SetTileLimit(size_t num_tiles_limit); - - // Requests the |new_num_of_tiles| from the available global pool. Calls - // GlobalTileManagerClient.SetNumTiles after the manager determines how many - // tiles are available for the client. If the number of tiles left is not - // enough to satisfy the request, the manager will evict tiles allocated to - // other clients. - void RequestTiles(content::SynchronousCompositorMemoryPolicy new_policy, - Key key); - - Key PushBack(GlobalTileManagerClient* client); - - // |key| must be already in manager. Move the tile manager client - // corresponding to |key| to most recent. This function should be called after - // RequestTiles. - void DidUse(Key key); - - void Remove(Key key); - - private: - friend struct base::DefaultLazyInstanceTraits<GlobalTileManager>; - GlobalTileManager(); - ~GlobalTileManager(); - - // Continues evicting the inactive views until freeing up at least amount of - // tiles specified by |desired_num_tiles| to draw a view specified by |key|, - // or until all inactive views have been evicted. Returns the amount of - // memory that was actually evicted. This function is called when a - // request cannot be satisfied. - size_t Evict(size_t desired_num_tiles, Key key); - - // Check that the sum of all client's tiles is equal to - // total_allocated_tiles_. - bool IsConsistent() const; - - size_t num_tiles_limit_; - - size_t total_allocated_tiles_; - ListType mru_list_; - base::SequenceChecker sequence_checker_; - - DISALLOW_COPY_AND_ASSIGN(GlobalTileManager); -}; - -} // namespace android_webview - -#endif // ANDROID_WEBVIEW_BROWSER_GLOBAL_TILE_MANAGER_H_ diff --git a/android_webview/browser/global_tile_manager_client.h b/android_webview/browser/global_tile_manager_client.h deleted file mode 100644 index b9cc64e..0000000 --- a/android_webview/browser/global_tile_manager_client.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ANDROID_WEBVIEW_BROWSER_GLOBAL_TILE_MANAGER_CLIENT_H_ -#define ANDROID_WEBVIEW_BROWSER_GLOBAL_TILE_MANAGER_CLIENT_H_ - -#include "content/public/browser/android/synchronous_compositor.h" - -namespace android_webview { -// GlobalTileManagerClient requests tile resources from GlobalTileManager. -class GlobalTileManagerClient { - public: - // Get tile memory policy for the client. - virtual content::SynchronousCompositorMemoryPolicy GetMemoryPolicy() - const = 0; - - // Set tile memory policy of the client. When |effective_immediately| is - // true, the client will enforce its tile policy immediately. - virtual void SetMemoryPolicy( - content::SynchronousCompositorMemoryPolicy new_policy, - bool effective_immediately) = 0; - - protected: - virtual ~GlobalTileManagerClient() {} -}; - -} // namespace android_webview - -#endif // ANDROID_WEBVIEW_BROWSER_GLOBAL_TILE_MANAGER_CLIENT_H_ diff --git a/android_webview/browser/global_tile_manager_unittest.cc b/android_webview/browser/global_tile_manager_unittest.cc deleted file mode 100644 index cd7d26e..0000000 --- a/android_webview/browser/global_tile_manager_unittest.cc +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <algorithm> -#include "android_webview/browser/global_tile_manager.h" -#include "android_webview/browser/global_tile_manager_client.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { -// This should be the same as the one defined global_tile_manager.cc -const size_t kNumTilesLimit = 450; -const size_t kDefaultNumTiles = 150; - -} // namespace - -using android_webview::GlobalTileManager; -using android_webview::GlobalTileManagerClient; -using content::SynchronousCompositorMemoryPolicy; -using testing::Test; - -class MockGlobalTileManagerClient : public GlobalTileManagerClient { - public: - virtual SynchronousCompositorMemoryPolicy GetMemoryPolicy() const override { - return memory_policy_; - } - - virtual void SetMemoryPolicy(SynchronousCompositorMemoryPolicy new_policy, - bool effective_immediately) override { - memory_policy_ = new_policy; - } - - MockGlobalTileManagerClient() { - tile_request_.num_resources_limit = kDefaultNumTiles; - key_ = GlobalTileManager::GetInstance()->PushBack(this); - } - - virtual ~MockGlobalTileManagerClient() { - GlobalTileManager::GetInstance()->Remove(key_); - } - - SynchronousCompositorMemoryPolicy GetTileRequest() { return tile_request_; } - GlobalTileManager::Key GetKey() { return key_; } - - private: - SynchronousCompositorMemoryPolicy memory_policy_; - SynchronousCompositorMemoryPolicy tile_request_; - GlobalTileManager::Key key_; -}; - -class GlobalTileManagerTest : public Test { - public: - virtual void SetUp() {} - - GlobalTileManager* manager() { return GlobalTileManager::GetInstance(); } -}; - -TEST_F(GlobalTileManagerTest, RequestTilesUnderLimit) { - MockGlobalTileManagerClient clients[2]; - - for (size_t i = 0; i < 2; i++) { - manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey()); - manager()->DidUse(clients[i].GetKey()); - - // Ensure clients get what they asked for when the manager is under tile - // limit. - EXPECT_EQ(clients[i].GetMemoryPolicy().num_resources_limit, - kDefaultNumTiles); - } -} - -TEST_F(GlobalTileManagerTest, EvictHappensWhenOverLimit) { - MockGlobalTileManagerClient clients[4]; - - for (size_t i = 0; i < 4; i++) { - manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey()); - manager()->DidUse(clients[i].GetKey()); - } - - size_t total_tiles = 0; - for (size_t i = 0; i < 4; i++) { - total_tiles += clients[i].GetMemoryPolicy().num_resources_limit; - } - - // Ensure that eviction happened and kept the total number of tiles within - // kNumTilesLimit. - EXPECT_LE(total_tiles, kNumTilesLimit); -} - -TEST_F(GlobalTileManagerTest, RandomizedStressRequests) { - MockGlobalTileManagerClient clients[100]; - size_t index[100]; - for (size_t i = 0; i < 100; i++) { - index[i] = i; - } - - // Fix the seed so that tests are reproducible. - std::srand(1); - // Simulate a random request order of clients. - std::random_shuffle(&index[0], &index[99]); - - for (size_t i = 0; i < 100; i++) { - size_t j = index[i]; - manager()->RequestTiles(clients[j].GetTileRequest(), clients[j].GetKey()); - manager()->DidUse(clients[j].GetKey()); - } - - size_t total_tiles = 0; - for (size_t i = 0; i < 100; i++) { - total_tiles += clients[i].GetMemoryPolicy().num_resources_limit; - } - - // Ensure that eviction happened and kept the total number of tiles within - // kNumTilesLimit. - EXPECT_LE(total_tiles, kNumTilesLimit); -} - -TEST_F(GlobalTileManagerTest, FixedOrderedRequests) { - MockGlobalTileManagerClient clients[10]; - - // 10 clients requesting resources in a fixed order. Do that for 5 rounds. - for (int round = 0; round < 5; round++) { - for (size_t i = 0; i < 10; i++) { - manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey()); - manager()->DidUse(clients[i].GetKey()); - } - } - - // Ensure that the total tiles are divided evenly among all clients. - for (size_t i = 0; i < 10; i++) { - EXPECT_EQ(clients[i].GetMemoryPolicy().num_resources_limit, - kNumTilesLimit / 10); - } -} - -TEST_F(GlobalTileManagerTest, FixedOrderedRequestsWithInactiveClients) { - MockGlobalTileManagerClient clients[20]; - - // 20 clients request resources. - for (size_t i = 0; i < 20; i++) { - manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey()); - manager()->DidUse(clients[i].GetKey()); - } - - // Now the last 10 clients become inactive. Only the first 10 clients remain - // active resource requesters. - // 10 clients requesting resources in a fixed order. Do that for 5 rounds. - for (int round = 0; round < 5; round++) { - for (size_t i = 0; i < 10; i++) { - manager()->RequestTiles(clients[i].GetTileRequest(), clients[i].GetKey()); - manager()->DidUse(clients[i].GetKey()); - } - } - - // Ensure that the total tiles are divided evenly among all clients. - for (size_t i = 0; i < 10; i++) { - EXPECT_EQ(clients[i].GetMemoryPolicy().num_resources_limit, - kNumTilesLimit / 10); - } - - // Ensure that the inactive tiles are evicted. - for (size_t i = 11; i < 20; i++) { - EXPECT_EQ(clients[i].GetMemoryPolicy().num_resources_limit, 0u); - } -} |