Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5315)

Unified Diff: chrome/browser/safe_browsing/safe_browsing_database.h

Issue 814993003: Finalize thread-safety design for SafeBrowsingDatabase. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@a5_threadSafeStoreManager
Patch Set: fix compile post-merge Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/safe_browsing/safe_browsing_database.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/safe_browsing/safe_browsing_database.h
diff --git a/chrome/browser/safe_browsing/safe_browsing_database.h b/chrome/browser/safe_browsing/safe_browsing_database.h
index efcdd738926bf7061b96602ad007ee6e05d01b9c..8575a0baecf18f7fc394c4260bccd147c8d490ac 100644
--- a/chrome/browser/safe_browsing/safe_browsing_database.h
+++ b/chrome/browser/safe_browsing/safe_browsing_database.h
@@ -455,6 +455,77 @@ class SafeBrowsingDatabaseNew : public SafeBrowsingDatabase {
using ReadTransaction = ThreadSafeStateManager::ReadTransaction;
using WriteTransaction = ThreadSafeStateManager::WriteTransaction;
+ // Manages the non-thread safe (i.e. only to be accessed to the database's
+ // main thread) state of this class.
+ class DatabaseStateManager {
+ public:
+ explicit DatabaseStateManager(const base::ThreadChecker& thread_checker)
+ : thread_checker_(thread_checker),
+ corruption_detected_(false),
+ change_detected_(false) {}
+
+ void init_filename_base(const base::FilePath& filename_base) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(filename_base_.empty()) << "filename already initialized";
+ filename_base_ = filename_base;
+ }
+
+ const base::FilePath& filename_base() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return filename_base_;
+ }
+
+ void set_corruption_detected() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ corruption_detected_ = true;
+ }
+
+ void reset_corruption_detected() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ corruption_detected_ = false;
+ }
+
+ bool corruption_detected() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return corruption_detected_;
+ }
+
+ void set_change_detected() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ change_detected_ = true;
+ }
+
+ void reset_change_detected() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ change_detected_ = false;
+ }
+
+ bool change_detected() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return change_detected_;
+ }
+
+ private:
+ // The SafeBrowsingDatabase's ThreadChecker, used to verify that this class'
+ // state is only ever accessed from the database's main thread.
+ const base::ThreadChecker& thread_checker_;
+
+ // The base filename passed to Init(), used to generate the store and prefix
+ // set filenames used to store data on disk.
+ base::FilePath filename_base_;
+
+ // Set if corruption is detected during the course of an update.
+ // Causes the update functions to fail with no side effects, until
+ // the next call to |UpdateStarted()|.
+ bool corruption_detected_;
+
+ // Set to true if any chunks are added or deleted during an update.
+ // Used to optimize away database update.
+ bool change_detected_;
+
+ DISALLOW_COPY_AND_ASSIGN(DatabaseStateManager);
+ };
+
bool PrefixSetContainsUrl(const GURL& url,
PrefixSetId prefix_set_id,
std::vector<SBPrefix>* prefix_hits,
@@ -568,51 +639,44 @@ class SafeBrowsingDatabaseNew : public SafeBrowsingDatabase {
ThreadSafeStateManager state_manager_;
- // The base filename passed to Init(), used to generate the store and prefix
- // set filenames used to store data on disk.
- base::FilePath filename_base_;
-
- // Underlying persistent store for chunk data.
- // For browsing related (phishing and malware URLs) chunks and prefixes.
- scoped_ptr<SafeBrowsingStore> browse_store_;
-
- // For download related (download URL and binary hash) chunks and prefixes.
- scoped_ptr<SafeBrowsingStore> download_store_;
-
- // For the client-side phishing detection whitelist chunks and full-length
- // hashes. This list only contains 256 bit hashes.
- scoped_ptr<SafeBrowsingStore> csd_whitelist_store_;
-
- // For the download whitelist chunks and full-length hashes. This list only
- // contains 256 bit hashes.
- scoped_ptr<SafeBrowsingStore> download_whitelist_store_;
-
- // For the off-domain inclusion whitelist chunks and full-length hashes. This
- // list only contains 256 bit hashes.
- scoped_ptr<SafeBrowsingStore> inclusion_whitelist_store_;
-
- // For extension IDs.
- scoped_ptr<SafeBrowsingStore> extension_blacklist_store_;
-
- // For side-effect free whitelist.
- scoped_ptr<SafeBrowsingStore> side_effect_free_whitelist_store_;
-
- // For IP blacklist.
- scoped_ptr<SafeBrowsingStore> ip_blacklist_store_;
-
- // For unwanted software list.
- scoped_ptr<SafeBrowsingStore> unwanted_software_store_;
-
- // Set if corruption is detected during the course of an update.
- // Causes the update functions to fail with no side effects, until
- // the next call to |UpdateStarted()|.
- bool corruption_detected_;
-
- // Set to true if any chunks are added or deleted during an update.
- // Used to optimize away database update.
- bool change_detected_;
-
- // Used to schedule resetting the database because of corruption.
+ DatabaseStateManager db_state_manager_;
+
+ // Underlying persistent stores for chunk data:
+ // - |browse_store_|: For browsing related (phishing and malware URLs)
+ // chunks and prefixes.
+ // - |download_store_|: For download related (download URL and binary hash)
+ // chunks and prefixes.
+ // - |csd_whitelist_store_|: For the client-side phishing detection
+ // whitelist chunks and full-length hashes. This list only contains 256
+ // bit hashes.
+ // - |download_whitelist_store_|: For the download whitelist chunks and
+ // full-length hashes. This list only contains 256 bit hashes.
+ // - |inclusion_whitelist_store_|: For the inclusion whitelist. Same format
+ // as |download_whitelist_store_|.
+ // - |extension_blacklist_store_|: For extension IDs.
+ // - |side_effect_free_whitelist_store_|: For side-effect free whitelist.
+ // - |ip_blacklist_store_|: For IP blacklist.
+ // - |unwanted_software_store_|: For unwanted software list (format
+ // identical to browsing lists).
+ //
+ // The stores themselves will be modified throughout the existence of this
+ // database, but shouldn't ever be swapped out (hence the const scoped_ptr --
+ // which could be swapped for C++11's std::optional when that's available).
+ // They are NonThreadSafe and should thus only be accessed on the database's
+ // main thread as enforced by SafeBrowsingStoreFile's implementation.
+ const scoped_ptr<SafeBrowsingStore> browse_store_;
+ const scoped_ptr<SafeBrowsingStore> download_store_;
+ const scoped_ptr<SafeBrowsingStore> csd_whitelist_store_;
+ const scoped_ptr<SafeBrowsingStore> download_whitelist_store_;
+ const scoped_ptr<SafeBrowsingStore> inclusion_whitelist_store_;
+ const scoped_ptr<SafeBrowsingStore> extension_blacklist_store_;
+ const scoped_ptr<SafeBrowsingStore> side_effect_free_whitelist_store_;
+ const scoped_ptr<SafeBrowsingStore> ip_blacklist_store_;
+ const scoped_ptr<SafeBrowsingStore> unwanted_software_store_;
+
+ // Used to schedule resetting the database because of corruption. This factory
+ // and the WeakPtrs it issues should only be used on the database's main
+ // thread.
base::WeakPtrFactory<SafeBrowsingDatabaseNew> reset_factory_;
};
« no previous file with comments | « no previous file | chrome/browser/safe_browsing/safe_browsing_database.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698