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

Unified Diff: components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.cc

Issue 473723002: Update data reduction proxy statistics prefs less often on desktop (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@tooManyWritesPatch
Patch Set: Created 6 years, 4 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
Index: components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.cc
diff --git a/components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.cc b/components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.cc
new file mode 100644
index 0000000000000000000000000000000000000000..7b38bca8e7d1a8b516225b444573bf7cfb14d3c8
--- /dev/null
+++ b/components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.cc
@@ -0,0 +1,139 @@
+// 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.
+
+#include "components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.h"
+
+#include "base/bind.h"
+#include "base/location.h"
+#include "base/prefs/pref_service.h"
+#include "base/prefs/scoped_user_pref_update.h"
+#include "base/sequenced_task_runner.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/time/time.h"
+#include "base/values.h"
+
+namespace data_reduction_proxy {
+
+DataReductionProxyDelayedPrefService::DataReductionProxyDelayedPrefService(
+ PrefService* prefs,
+ scoped_refptr<base::SequencedTaskRunner> task_runner,
+ base::TimeDelta delay)
+ : pref_service_(prefs),
+ task_runner_(task_runner),
+ delay_(delay),
+ delayed_task_posted_(false) {
+ DCHECK(prefs);
bengr 2014/08/14 17:39:42 Also, DCHECK that delay is non-negative
megjablon 2014/08/26 19:28:40 Done.
+ if (delay_ <= base::TimeDelta()) {
bengr 2014/08/14 17:39:42 Don't you mean >=?. Also, afaict, these don't need
megjablon 2014/08/26 19:28:41 Done.
+ pref_map_ = new DataReductionProxyPrefMap();
+ list_pref_map_ = new DataReductionProxyListPrefMap();
+ }
+}
+
+DataReductionProxyDelayedPrefService::~DataReductionProxyDelayedPrefService() {
+ WritePrefs();
+}
+
+int64 DataReductionProxyDelayedPrefService::GetInt64(const char* pref_path) {
+ if (!(delay_ <= base::TimeDelta())) {
bengr 2014/08/14 17:39:41 if (delay_ == base::TimeDelta()) return pref_ser
megjablon 2014/08/26 19:28:41 Done.
+ return pref_service_->GetInt64(pref_path);
+ }
+
+ DataReductionProxyPrefMap::iterator iter = pref_map_->find(pref_path);
+ if (iter == pref_map_->end()) {
+ int64 pref_value = pref_service_->GetInt64(pref_path);
+ pref_map_->insert(std::pair<const char*, int64>(pref_path, pref_value));
bengr 2014/08/14 17:39:42 You can do pref_map_[pref_path] = pref_value, I th
megjablon 2014/08/26 19:28:40 Done.
+ return pref_value;
+ }
+ return iter->second;
+}
+
+void DataReductionProxyDelayedPrefService::SetInt64(const char* pref_path,
+ int64 pref_value) {
+ if (!(delay_ <= base::TimeDelta())) {
bengr 2014/08/14 17:39:41 if (delay_ == base::TimeDelta()) ...
megjablon 2014/08/26 19:28:41 Done.
+ pref_service_->SetInt64(pref_path, pref_value);
+ return;
+ }
+
+ if (!delayed_task_posted_)
+ WritePrefsAndPost();
+ DataReductionProxyPrefMap::iterator iter = pref_map_->find(pref_path);
bengr 2014/08/14 17:39:42 Can you factor out the initialization of the maps?
megjablon 2014/08/26 19:28:40 Done.
+ if (iter == pref_map_->end()) {
+ int64 pref_value = pref_service_->GetInt64(pref_path);
+ pref_map_->insert(std::pair<const char*, int64>(pref_path, pref_value));
bengr 2014/08/14 17:39:41 again, use []
megjablon 2014/08/26 19:28:40 Done.
+ }
+ (*pref_map_)[pref_path] = pref_value;
+}
+
+base::ListValue* DataReductionProxyDelayedPrefService::GetList(
+ const char* pref_path) {
+ if (!(delay_ <= base::TimeDelta())) {
+ return ListPrefUpdate(pref_service_, pref_path).Get();
+ }
+
+ if (!delayed_task_posted_)
+ WritePrefsAndPost();
+ DataReductionProxyListPrefMap::iterator iter =
+ list_pref_map_->find(pref_path);
+ if (iter == list_pref_map_->end()) {
+ base::ListValue* pref_value = pref_service_->GetList(pref_path)->DeepCopy();
bengr 2014/08/14 17:39:41 This looks like a memory leak. Where do you deallo
megjablon 2014/08/26 19:28:40 Using a ScopedPtrHashMap
megjablon 2014/08/26 19:28:40 Done.
+ list_pref_map_->insert(std::pair<const char*, base::ListValue*>
+ (pref_path, pref_value));
+ return pref_value;
+ }
+ return iter->second;
+}
+
+void DataReductionProxyDelayedPrefService::WritePrefs() {
+ for(DataReductionProxyPrefMap::iterator iter = pref_map_->begin();
bengr 2014/08/14 17:39:41 for (
megjablon 2014/08/26 19:28:41 Done.
+ iter != pref_map_->end(); ++iter) {
+ pref_service_->SetInt64(iter->first, iter->second);
+ }
+
+ for (DataReductionProxyListPrefMap::iterator iter = list_pref_map_->begin();
+ iter != list_pref_map_->end(); ++iter) {
bengr 2014/08/14 17:39:41 indent one more
megjablon 2014/08/26 19:28:40 Done.
+ TransferList(*(iter->second),
+ ListPrefUpdate(pref_service_, iter->first).Get());
+ }
+}
+
+void DataReductionProxyDelayedPrefService::WritePrefsAndPost() {
+ // Only write after the first time posting the task
+ if (!delayed_task_posted_) {
+ delayed_task_posted_ = true;
+ } else {
+ WritePrefs();
+ }
+ task_runner_->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&DataReductionProxyDelayedPrefService::WritePrefsAndPost,
+ base::Unretained(this)),
bengr 2014/08/14 17:39:41 What happens after this is destroyed? I think you
bengr 2014/08/14 23:09:49 Ignore that. I think you can just pass a WeakPtr i
megjablon 2014/08/26 19:28:40 Done.
+ delay_);
+}
+
+void DataReductionProxyDelayedPrefService::TransferList(
+ const base::ListValue& from_list,
+ base::ListValue* to_list) {
+ to_list->Clear();
+ for (size_t i = 0; i < from_list.GetSize(); ++i) {
+ int64 value = GetListPrefInt64Value(from_list, i);
+ to_list->Set(i, new base::StringValue(base::Int64ToString(value)));
bengr 2014/08/14 17:39:41 you can combine this line with the previous.
megjablon 2014/08/26 19:28:41 Done.
+ }
+}
+
+int64 DataReductionProxyDelayedPrefService::GetListPrefInt64Value(
+ const base::ListValue& list,
+ size_t index) {
+ std::string string_value;
+ if (!list.GetString(index, &string_value)) {
+ NOTREACHED();
+ return 0;
+ }
+
+ int64 value = 0;
+ bool rv = base::StringToInt64(string_value, &value);
+ DCHECK(rv);
+ return value;
+}
+
+} // namespace data_reduction_proxy

Powered by Google App Engine
This is Rietveld 408576698