Index: content/browser/indexed_db/leveldb/leveldb_iterator_impl.h |
diff --git a/content/browser/indexed_db/leveldb/leveldb_iterator_impl.h b/content/browser/indexed_db/leveldb/leveldb_iterator_impl.h |
index 22ca5d145cc8863ef1aa4faa9710ed05e278bddb..5ebfdd3166318be1530607c178f72f30606636a0 100644 |
--- a/content/browser/indexed_db/leveldb/leveldb_iterator_impl.h |
+++ b/content/browser/indexed_db/leveldb/leveldb_iterator_impl.h |
@@ -6,13 +6,19 @@ |
#define CONTENT_BROWSER_INDEXED_DB_LEVELDB_LEVELDB_ITERATOR_IMPL_H_ |
#include <memory> |
+#include <string> |
#include "base/macros.h" |
#include "content/browser/indexed_db/leveldb/leveldb_iterator.h" |
#include "content/common/content_export.h" |
#include "third_party/leveldatabase/src/include/leveldb/iterator.h" |
+namespace leveldb { |
+class Snapshot; |
+} |
+ |
namespace content { |
+class LevelDBDatabase; |
class CONTENT_EXPORT LevelDBIteratorImpl : public content::LevelDBIterator { |
public: |
@@ -24,18 +30,33 @@ class CONTENT_EXPORT LevelDBIteratorImpl : public content::LevelDBIterator { |
leveldb::Status Prev() override; |
base::StringPiece Key() const override; |
base::StringPiece Value() const override; |
+ void Detach() override; |
+ bool IsDetached() const override; |
protected: |
- explicit LevelDBIteratorImpl(std::unique_ptr<leveldb::Iterator> iterator); |
+ explicit LevelDBIteratorImpl(std::unique_ptr<leveldb::Iterator> iterator, |
+ LevelDBDatabase* db, |
+ const leveldb::Snapshot* snapshot); |
private: |
- void CheckStatus(); |
+ enum class IteratorState { ACTIVE, EVICTED_AND_VALID, EVICTED_AND_INVALID }; |
+ |
+ leveldb::Status CheckStatus(); |
+ |
+ // Notifies the database of iterator usage and recreates iterator if needed. |
+ void WillUseDBIterator(); |
friend class IndexedDBClassFactory; |
friend class MockBrowserTestIndexedDBClassFactory; |
std::unique_ptr<leveldb::Iterator> iterator_; |
+ // State used to facilitate memory purging. |
+ LevelDBDatabase* db_; |
+ IteratorState iterator_state_ = IteratorState::ACTIVE; |
+ std::string key_before_eviction_; |
+ const leveldb::Snapshot* snapshot_; |
+ |
DISALLOW_COPY_AND_ASSIGN(LevelDBIteratorImpl); |
}; |