summaryrefslogtreecommitdiffstats
path: root/android_webview/browser/global_tile_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'android_webview/browser/global_tile_manager.h')
-rw-r--r--android_webview/browser/global_tile_manager.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/android_webview/browser/global_tile_manager.h b/android_webview/browser/global_tile_manager.h
new file mode 100644
index 0000000..5cf2fc4
--- /dev/null
+++ b/android_webview/browser/global_tile_manager.h
@@ -0,0 +1,74 @@
+// 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"
+
+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();
+
+ // Requests the |num_of_tiles| from the available global pool. Calls
+ // GlobalTileManagerClient.SetNumTiles after the manager determines how many
+ // tiles are available for the client. The tile policy on the clients are not
+ // immediately enforced, unless |effective_immediately| is true. If the
+ // number of tiles left are not enough to satisfy the request, the manager
+ // will evict tiles allocated to other clients.
+ void RequestTiles(size_t new_num_of_tiles, 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 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_