1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ANDROID_WEBVIEW_BROWSER_GLOBAL_TILE_MANAGER_H_ 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ANDROID_WEBVIEW_BROWSER_GLOBAL_TILE_MANAGER_H_ 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <list> 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/basictypes.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/lazy_instance.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/sequence_checker.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/synchronization/lock.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/android/synchronous_compositor.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace android_webview { 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class GlobalTileManagerClient; 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// A global tile manager that keeps track of the number of tile resources. Each 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// tile needs file descriptors (typically 2) and there is a soft limit of 1024 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// file descriptors per Android process. The GlobalTileManager does not keep 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// track of how many tiles each individual view is actually using. The purpose 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// of GlobalTileManager is to behave gracefully (as in not crashing) when the 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// embedder of webview creates a lot of webviews and draw them at the same time. 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class GlobalTileManager { 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typedef std::list<GlobalTileManagerClient*> ListType; 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typedef ListType::iterator Key; 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static GlobalTileManager* GetInstance(); 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void SetTileLimit(size_t num_tiles_limit); 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Requests the |new_num_of_tiles| from the available global pool. Calls 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // GlobalTileManagerClient.SetNumTiles after the manager determines how many 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // tiles are available for the client. If the number of tiles left is not 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // enough to satisfy the request, the manager will evict tiles allocated to 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // other clients. 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RequestTiles(content::SynchronousCompositorMemoryPolicy new_policy, 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Key key); 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Key PushBack(GlobalTileManagerClient* client); 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // |key| must be already in manager. Move the tile manager client 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // corresponding to |key| to most recent. This function should be called after 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // RequestTiles. 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void DidUse(Key key); 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void Remove(Key key); 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) friend struct base::DefaultLazyInstanceTraits<GlobalTileManager>; 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GlobalTileManager(); 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ~GlobalTileManager(); 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Continues evicting the inactive views until freeing up at least amount of 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // tiles specified by |desired_num_tiles| to draw a view specified by |key|, 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // or until all inactive views have been evicted. Returns the amount of 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // memory that was actually evicted. This function is called when a 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // request cannot be satisfied. 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t Evict(size_t desired_num_tiles, Key key); 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check that the sum of all client's tiles is equal to 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // total_allocated_tiles_. 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool IsConsistent() const; 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t num_tiles_limit_; 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t total_allocated_tiles_; 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ListType mru_list_; 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::SequenceChecker sequence_checker_; 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GlobalTileManager); 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace android_webview 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif // ANDROID_WEBVIEW_BROWSER_GLOBAL_TILE_MANAGER_H_ 80