diff options
Diffstat (limited to 'chromium/components/sqlite_proto')
-rw-r--r-- | chromium/components/sqlite_proto/key_value_data.h | 20 | ||||
-rw-r--r-- | chromium/components/sqlite_proto/key_value_table.h | 9 |
2 files changed, 17 insertions, 12 deletions
diff --git a/chromium/components/sqlite_proto/key_value_data.h b/chromium/components/sqlite_proto/key_value_data.h index 126eedaba8c..fcd50e23409 100644 --- a/chromium/components/sqlite_proto/key_value_data.h +++ b/chromium/components/sqlite_proto/key_value_data.h @@ -131,9 +131,10 @@ template <typename T, typename Compare> void KeyValueData<T, Compare>::InitializeOnDBSequence() { DCHECK(manager_->GetTaskRunner()->RunsTasksInCurrentSequence()); auto data_map = std::make_unique<std::map<std::string, T>>(); + manager_->ExecuteDBTaskOnDBSequence( - base::BindOnce(&KeyValueTable<T>::GetAllData, - base::Unretained(backend_table_), data_map.get())); + base::BindOnce(&KeyValueTable<T>::GetAllData, backend_table_->AsWeakPtr(), + data_map.get())); // To ensure invariant that data_cache_.size() <= max_num_entries_. std::vector<std::string> keys_to_delete; @@ -145,7 +146,7 @@ void KeyValueData<T, Compare>::InitializeOnDBSequence() { } if (!keys_to_delete.empty()) { manager_->ExecuteDBTaskOnDBSequence(base::BindOnce( - &KeyValueTable<T>::DeleteData, base::Unretained(backend_table_), + &KeyValueTable<T>::DeleteData, backend_table_->AsWeakPtr(), std::vector<std::string>(keys_to_delete))); } @@ -219,7 +220,7 @@ void KeyValueData<T, Compare>::DeleteAllData() { // by user. manager_->ScheduleDBTask(FROM_HERE, base::BindOnce(&KeyValueTable<T>::DeleteAllData, - base::Unretained(backend_table_))); + backend_table_->AsWeakPtr())); } template <typename T, typename Compare> @@ -236,9 +237,9 @@ void KeyValueData<T, Compare>::FlushDataToDisk() { auto it = data_cache_->find(key); if (it != data_cache_->end()) { manager_->ScheduleDBTask( - FROM_HERE, base::BindOnce(&KeyValueTable<T>::UpdateData, - base::Unretained(backend_table_), key, - it->second)); + FROM_HERE, + base::BindOnce(&KeyValueTable<T>::UpdateData, + backend_table_->AsWeakPtr(), key, it->second)); } break; } @@ -249,9 +250,8 @@ void KeyValueData<T, Compare>::FlushDataToDisk() { if (!keys_to_delete.empty()) { manager_->ScheduleDBTask( - FROM_HERE, - base::BindOnce(&KeyValueTable<T>::DeleteData, - base::Unretained(backend_table_), keys_to_delete)); + FROM_HERE, base::BindOnce(&KeyValueTable<T>::DeleteData, + backend_table_->AsWeakPtr(), keys_to_delete)); } deferred_updates_.clear(); diff --git a/chromium/components/sqlite_proto/key_value_table.h b/chromium/components/sqlite_proto/key_value_table.h index 0f63ce0442d..946386e6876 100644 --- a/chromium/components/sqlite_proto/key_value_table.h +++ b/chromium/components/sqlite_proto/key_value_table.h @@ -45,9 +45,14 @@ std::string GetDeleteAllSql(const std::string& table_name); // manager_->ScheduleDBTask( // FROM_HERE, // base::BindOnce(&KeyValueTable<PrefetchData>::UpdateData, -// base::Unretained(table_), key, data)); +// table_->AsWeakPtr(), key, data)); +// +// TODO(crbug.com/1115398): Supporting weak pointers is a temporary measure +// mitigating a crash caused by complex lifetime requirements for KeyValueTable +// relative to the related classes. Making KeyValueTable<T> stateless instead +// could be a better way to resolve these lifetime issues in the long run. template <typename T> -class KeyValueTable { +class KeyValueTable : public base::SupportsWeakPtr<KeyValueTable<T>> { public: explicit KeyValueTable(const std::string& table_name); // Virtual for testing. |