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

Side by Side Diff: chrome/browser/force_tls_persister.cc

Issue 186014: ForceTLS: persist to disk (Closed)
Patch Set: ... Created 11 years, 3 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/force_tls_persister.h"
6
7 #include "base/file_path.h"
8 #include "base/file_util.h"
9 #include "base/message_loop.h"
10 #include "base/path_service.h"
11 #include "base/thread.h"
12 #include "chrome/common/chrome_paths.h"
13 #include "net/base/force_tls_state.h"
14
15 // Since the ForceTLSState takes a simple C function as the callback, this
16 // bounces to the StateIsDirty method of the given object.
17 static void StateIsDirtyTrampoline(void* arg) {
18 ForceTLSPersister* persister = reinterpret_cast<ForceTLSPersister*>(arg);
19 persister->StateIsDirty();
20 }
21
22 ForceTLSPersister::ForceTLSPersister(net::ForceTLSState* state,
23 base::Thread* file_thread)
24 : state_is_dirty_(false),
25 force_tls_state_(state),
26 file_thread_(file_thread) {
27 state->SetDirtyCallback(StateIsDirtyTrampoline, this);
28
29 Task* task = NewRunnableMethod(this, &ForceTLSPersister::LoadState);
30 file_thread->message_loop()->PostDelayedTask(FROM_HERE, task,
31 1000 /* 1 second */);
32 }
33
34 static FilePath GetStateFile() {
35 FilePath user_data_dir;
36 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
37 return user_data_dir.Append("ForceTLSState");
38 }
39
40 void ForceTLSPersister::LoadState() {
41 // Runs on |file_thread_|
42 AutoLock locked_(lock_);
43 DCHECK(file_thread_->message_loop() == MessageLoop::current());
44
45 std::string state;
46 if (!file_util::ReadFileToString(GetStateFile(), &state))
47 return;
48
49 force_tls_state_->Deserialise(state);
50 }
51
52 void ForceTLSPersister::StateIsDirty() {
53 // Runs on arbitary thread, may not block nor reenter |force_tls_state_|
54 AutoLock locked_(lock_);
55
56 if (state_is_dirty_)
57 return; // we already have a serialisation scheduled
58
59 Task* task = NewRunnableMethod(this, &ForceTLSPersister::SerialiseState);
60 file_thread_->message_loop()->PostDelayedTask(FROM_HERE, task,
61 1000 /* 1 second */);
62 state_is_dirty_ = true;
63 }
64
65 void ForceTLSPersister::SerialiseState() {
66 // Runs on |file_thread_|
67 AutoLock locked_(lock_);
68 DCHECK(file_thread_->message_loop() == MessageLoop::current());
69
70 DCHECK(state_is_dirty_);
71 state_is_dirty_ = false;
72
73 std::string state;
74 if (!force_tls_state_->Serialise(&state))
75 return;
76
77 file_util::WriteFile(GetStateFile(), state.data(), state.size());
78 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698