0

Move ImportantFileWriter to base/. It now has two consumers, base/prefs and chrome/.

TBR=ben@chromium.org
BUG=155525


Review URL: https://chromiumcodereview.appspot.com/11227026

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@163840 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
joi@chromium.org
2012-10-24 16:33:36 +00:00
parent 1dfddfd36b
commit 4348625078
12 changed files with 533 additions and 52 deletions

476
.gitmodules vendored Normal file

@ -0,0 +1,476 @@
[submodule "breakpad/src"]
path = breakpad/src
url = https://chromium.googlesource.com/external/google-breakpad/src.git
os = all
[submodule "build/util/support"]
path = build/util/support
url =
os = ios
[submodule "chrome/installer/mac/third_party/xz/xz"]
path = chrome/installer/mac/third_party/xz/xz
url = https://chromium.googlesource.com/chromium/deps/xz.git
os = mac
[submodule "chrome/test/data/extensions/api_test/permissions/nacl_enabled/bin"]
path = chrome/test/data/extensions/api_test/permissions/nacl_enabled/bin
url = https://chromium.googlesource.com/native_client/src/native_client/tests/prebuilt.git
os = all
[submodule "chrome/test/data/perf/canvas_bench"]
path = chrome/test/data/perf/canvas_bench
url = https://chromium.googlesource.com/chromium/canvas_bench.git
os = all
[submodule "chrome/test/data/perf/frame_rate/content"]
path = chrome/test/data/perf/frame_rate/content
url = https://chromium.googlesource.com/chromium/frame_rate/content.git
os = all
[submodule "chrome/tools/test/reference_build/chrome_linux"]
path = chrome/tools/test/reference_build/chrome_linux
url = https://chromium.googlesource.com/chromium/reference_builds/chrome_linux.git
os = unix
[submodule "chrome/tools/test/reference_build/chrome_mac"]
path = chrome/tools/test/reference_build/chrome_mac
url = https://chromium.googlesource.com/chromium/reference_builds/chrome_mac.git
os = mac
[submodule "chrome/tools/test/reference_build/chrome_win"]
path = chrome/tools/test/reference_build/chrome_win
url = https://chromium.googlesource.com/chromium/reference_builds/chrome_win.git
os = win
[submodule "chrome_frame/tools/test/reference_build/chrome_win"]
path = chrome_frame/tools/test/reference_build/chrome_win
url = https://chromium.googlesource.com/chromium/reference_builds/chrome_win.git
os = win
[submodule "content/test/data/layout_tests/LayoutTests/fast/events"]
path = content/test/data/layout_tests/LayoutTests/fast/events
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/fast/filesystem/resources"]
path = content/test/data/layout_tests/LayoutTests/fast/filesystem/resources
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/fast/js/resources"]
path = content/test/data/layout_tests/LayoutTests/fast/js/resources
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/fast/workers"]
path = content/test/data/layout_tests/LayoutTests/fast/workers
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/http/tests/appcache"]
path = content/test/data/layout_tests/LayoutTests/http/tests/appcache
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/http/tests/resources"]
path = content/test/data/layout_tests/LayoutTests/http/tests/resources
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/http/tests/websocket/tests"]
path = content/test/data/layout_tests/LayoutTests/http/tests/websocket/tests
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/http/tests/workers"]
path = content/test/data/layout_tests/LayoutTests/http/tests/workers
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/http/tests/xmlhttprequest"]
path = content/test/data/layout_tests/LayoutTests/http/tests/xmlhttprequest
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/media"]
path = content/test/data/layout_tests/LayoutTests/media
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/platform/chromium-win/fast/events"]
path = content/test/data/layout_tests/LayoutTests/platform/chromium-win/fast/events
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/platform/chromium-win/fast/workers"]
path = content/test/data/layout_tests/LayoutTests/platform/chromium-win/fast/workers
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/platform/chromium-win/http/tests/workers"]
path = content/test/data/layout_tests/LayoutTests/platform/chromium-win/http/tests/workers
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/platform/chromium-win/storage/domstorage"]
path = content/test/data/layout_tests/LayoutTests/platform/chromium-win/storage/domstorage
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/platform/chromium/fast/events"]
path = content/test/data/layout_tests/LayoutTests/platform/chromium/fast/events
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/platform/chromium/fast/workers"]
path = content/test/data/layout_tests/LayoutTests/platform/chromium/fast/workers
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/storage/domstorage"]
path = content/test/data/layout_tests/LayoutTests/storage/domstorage
url =
os = ios
[submodule "content/test/data/layout_tests/LayoutTests/storage/indexeddb"]
path = content/test/data/layout_tests/LayoutTests/storage/indexeddb
url =
os = ios
[submodule "googleurl"]
path = googleurl
url = https://chromium.googlesource.com/external/google-url.git
os = all
[submodule "native_client"]
path = native_client
url = https://chromium.googlesource.com/native_client/src/native_client.git
os = all
[submodule "sandbox/linux/seccomp-legacy"]
path = sandbox/linux/seccomp-legacy
url = https://chromium.googlesource.com/external/seccompsandbox.git
os = all
[submodule "sdch/open-vcdiff"]
path = sdch/open-vcdiff
url = https://chromium.googlesource.com/external/open-vcdiff.git
os = all
[submodule "testing/gmock"]
path = testing/gmock
url = https://chromium.googlesource.com/external/googlemock.git
os = all
[submodule "testing/gtest"]
path = testing/gtest
url = https://chromium.googlesource.com/external/googletest.git
os = all
[submodule "testing/iossim/third_party/class-dump"]
path = testing/iossim/third_party/class-dump
url = https://chromium.googlesource.com/chromium/deps/class-dump.git
os = ios
[submodule "third_party/GTM"]
path = third_party/GTM
url = https://chromium.googlesource.com/external/google-toolbox-for-mac.git
os = ios,mac
[submodule "third_party/WebKit"]
path = third_party/WebKit
url = https://chromium.googlesource.com/external/WebKit_trimmed.git
os = all
[submodule "third_party/android_tools"]
path = third_party/android_tools
url = https://chromium.googlesource.com/android_tools.git
os = android
[submodule "third_party/angle"]
path = third_party/angle
url = https://chromium.googlesource.com/external/angleproject.git
os = all
[submodule "third_party/aosp"]
path = third_party/aosp
url = https://chromium.googlesource.com/chromium/deps/aosp.git
os = android
[submodule "third_party/bidichecker"]
path = third_party/bidichecker
url = https://chromium.googlesource.com/external/bidichecker/lib.git
os = all
[submodule "third_party/bison"]
path = third_party/bison
url = https://chromium.googlesource.com/chromium/deps/bison.git
os = win
[submodule "third_party/cacheinvalidation/src"]
path = third_party/cacheinvalidation/src
url = https://chromium.googlesource.com/external/google-cache-invalidation-api/src.git
os = all
[submodule "third_party/cros_dbus_cplusplus/source"]
path = third_party/cros_dbus_cplusplus/source
url = https://chromium.googlesource.com/chromiumos/third_party/dbus-cplusplus.git
os = unix
[submodule "third_party/cros_system_api"]
path = third_party/cros_system_api
url = https://chromium.googlesource.com/chromiumos/platform/system_api.git
os = unix
[submodule "third_party/cygwin"]
path = third_party/cygwin
url = https://chromium.googlesource.com/chromium/deps/cygwin.git
os = win
[submodule "third_party/ffmpeg"]
path = third_party/ffmpeg
url = https://chromium.googlesource.com/chromium/third_party/ffmpeg.git
os = all
[submodule "third_party/flac"]
path = third_party/flac
url = https://chromium.googlesource.com/chromium/deps/flac.git
os = all
[submodule "third_party/freetype"]
path = third_party/freetype
url = https://chromium.googlesource.com/chromium/src/third_party/freetype.git
os = android
[submodule "third_party/gnu_binutils"]
path = third_party/gnu_binutils
url = https://chromium.googlesource.com/native_client/deps/third_party/gnu_binutils.git
os = win
[submodule "third_party/gold"]
path = third_party/gold
url = https://chromium.googlesource.com/chromium/deps/gold.git
os = unix
[submodule "third_party/gperf"]
path = third_party/gperf
url = https://chromium.googlesource.com/chromium/deps/gperf.git
os = win
[submodule "third_party/hunspell"]
path = third_party/hunspell
url = https://chromium.googlesource.com/chromium/deps/hunspell.git
os = all
[submodule "third_party/hunspell_dictionaries"]
path = third_party/hunspell_dictionaries
url = https://chromium.googlesource.com/chromium/deps/hunspell_dictionaries.git
os = all
[submodule "third_party/icu"]
path = third_party/icu
url = https://chromium.googlesource.com/chromium/deps/icu46.git
os = all
[submodule "third_party/jsoncpp/source/include"]
path = third_party/jsoncpp/source/include
url = https://chromium.googlesource.com/external/jsoncpp/jsoncpp/include.git
os = all
[submodule "third_party/jsoncpp/source/src/lib_json"]
path = third_party/jsoncpp/source/src/lib_json
url = https://chromium.googlesource.com/external/jsoncpp/jsoncpp/src/lib_json.git
os = all
[submodule "third_party/leveldatabase/src"]
path = third_party/leveldatabase/src
url = https://chromium.googlesource.com/external/leveldb.git
os = all
[submodule "third_party/libexif/sources"]
path = third_party/libexif/sources
url = https://chromium.googlesource.com/chromium/deps/libexif/sources.git
os = all
[submodule "third_party/libjingle/source"]
path = third_party/libjingle/source
url = https://chromium.googlesource.com/external/libjingle.git
os = all
[submodule "third_party/libjpeg_turbo"]
path = third_party/libjpeg_turbo
url = https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git
os = all
[submodule "third_party/libmtp"]
path = third_party/libmtp
url = https://chromium.googlesource.com/chromium/deps/libmtp.git
os = unix
[submodule "third_party/libphonenumber/src/phonenumbers"]
path = third_party/libphonenumber/src/phonenumbers
url = https://chromium.googlesource.com/external/libphonenumber/cpp/src/phonenumbers.git
os = all
[submodule "third_party/libphonenumber/src/resources"]
path = third_party/libphonenumber/src/resources
url = https://chromium.googlesource.com/external/libphonenumber/resources.git
os = all
[submodule "third_party/libphonenumber/src/test"]
path = third_party/libphonenumber/src/test
url = https://chromium.googlesource.com/external/libphonenumber/cpp/test.git
os = all
[submodule "third_party/libsrtp"]
path = third_party/libsrtp
url = https://chromium.googlesource.com/chromium/deps/libsrtp.git
os = all
[submodule "third_party/libvpx"]
path = third_party/libvpx
url = https://chromium.googlesource.com/chromium/deps/libvpx.git
os = all
[submodule "third_party/libyuv"]
path = third_party/libyuv
url = https://chromium.googlesource.com/external/libyuv.git
os = all
[submodule "third_party/lighttpd"]
path = third_party/lighttpd
url = https://chromium.googlesource.com/chromium/deps/lighttpd.git
os = win,mac
[submodule "third_party/lss"]
path = third_party/lss
url = https://chromium.googlesource.com/external/linux-syscall-support/lss.git
os = unix
[submodule "third_party/mingw-w64/mingw/bin"]
path = third_party/mingw-w64/mingw/bin
url = https://chromium.googlesource.com/native_client/deps/third_party/mingw-w64/mingw/bin.git
os = win
[submodule "third_party/mozc/chrome/chromeos/renderer"]
path = third_party/mozc/chrome/chromeos/renderer
url = https://chromium.googlesource.com/external/mozc/src/chrome/chromeos/renderer.git
os = all
[submodule "third_party/mozc/session"]
path = third_party/mozc/session
url = https://chromium.googlesource.com/external/mozc/src/session.git
os = all
[submodule "third_party/mtpd/source"]
path = third_party/mtpd/source
url = https://chromium.googlesource.com/chromiumos/platform/mtpd.git
os = unix
[submodule "third_party/nacl_sdk_binaries"]
path = third_party/nacl_sdk_binaries
url = https://chromium.googlesource.com/chromium/deps/nacl_sdk_binaries.git
os = win
[submodule "third_party/nss"]
path = third_party/nss
url = https://chromium.googlesource.com/chromium/deps/nss.git
os = win,ios,mac
[submodule "third_party/openssl"]
path = third_party/openssl
url = https://chromium.googlesource.com/chromium/deps/openssl.git
os = unix
[submodule "third_party/opus/src"]
path = third_party/opus/src
url = https://chromium.googlesource.com/chromium/deps/opus.git
os = all
[submodule "third_party/ots"]
path = third_party/ots
url = https://chromium.googlesource.com/external/ots.git
os = all
[submodule "third_party/pdfsqueeze"]
path = third_party/pdfsqueeze
url = https://chromium.googlesource.com/external/pdfsqueeze.git
os = mac
[submodule "third_party/pefile"]
path = third_party/pefile
url = https://chromium.googlesource.com/external/pefile.git
os = win
[submodule "third_party/perl"]
path = third_party/perl
url = https://chromium.googlesource.com/chromium/deps/perl.git
os = win
[submodule "third_party/psyco_win32"]
path = third_party/psyco_win32
url = https://chromium.googlesource.com/chromium/deps/psyco_win32.git
os = win
[submodule "third_party/pyftpdlib/src"]
path = third_party/pyftpdlib/src
url = https://chromium.googlesource.com/external/pyftpdlib.git
os = all
[submodule "third_party/pylib"]
path = third_party/pylib
url =
os = ios
[submodule "third_party/pymox/src"]
path = third_party/pymox/src
url = https://chromium.googlesource.com/external/pymox.git
os = all
[submodule "third_party/python_26"]
path = third_party/python_26
url = https://chromium.googlesource.com/chromium/deps/python_26.git
os = win
[submodule "third_party/pywebsocket/src"]
path = third_party/pywebsocket/src
url = https://chromium.googlesource.com/external/pywebsocket/src.git
os = all
[submodule "third_party/safe_browsing/testing"]
path = third_party/safe_browsing/testing
url = https://chromium.googlesource.com/external/google-safe-browsing/testing.git
os = all
[submodule "third_party/scons-2.0.1"]
path = third_party/scons-2.0.1
url = https://chromium.googlesource.com/native_client/src/third_party/scons-2.0.1.git
os = all
[submodule "third_party/sfntly/cpp/src"]
path = third_party/sfntly/cpp/src
url = https://chromium.googlesource.com/external/sfntly/cpp/src.git
os = all
[submodule "third_party/skia/gyp"]
path = third_party/skia/gyp
url = https://chromium.googlesource.com/external/skia/gyp.git
os = all
[submodule "third_party/skia/include"]
path = third_party/skia/include
url = https://chromium.googlesource.com/external/skia/include.git
os = all
[submodule "third_party/skia/src"]
path = third_party/skia/src
url = https://chromium.googlesource.com/external/skia/src.git
os = all
[submodule "third_party/smhasher/src"]
path = third_party/smhasher/src
url = https://chromium.googlesource.com/external/smhasher.git
os = all
[submodule "third_party/snappy/src"]
path = third_party/snappy/src
url = https://chromium.googlesource.com/external/snappy.git
os = all
[submodule "third_party/speex"]
path = third_party/speex
url = https://chromium.googlesource.com/chromium/deps/speex.git
os = all
[submodule "third_party/swig/Lib"]
path = third_party/swig/Lib
url = https://chromium.googlesource.com/chromium/deps/swig/Lib.git
os = all
[submodule "third_party/swig/linux"]
path = third_party/swig/linux
url = https://chromium.googlesource.com/chromium/deps/swig/linux.git
os = unix
[submodule "third_party/swig/mac"]
path = third_party/swig/mac
url = https://chromium.googlesource.com/chromium/deps/swig/mac.git
os = mac
[submodule "third_party/swig/win"]
path = third_party/swig/win
url = https://chromium.googlesource.com/chromium/deps/swig/win.git
os = win
[submodule "third_party/syzygy/binaries"]
path = third_party/syzygy/binaries
url = https://chromium.googlesource.com/external/sawbuck/syzygy/binaries.git
os = win
[submodule "third_party/trace-viewer"]
path = third_party/trace-viewer
url = https://chromium.googlesource.com/external/trace-viewer.git
os = all
[submodule "third_party/undoview"]
path = third_party/undoview
url = https://chromium.googlesource.com/chromium/deps/undoview.git
os = all
[submodule "third_party/v8-i18n"]
path = third_party/v8-i18n
url = https://chromium.googlesource.com/external/v8-i18n.git
os = all
[submodule "third_party/webdriver/pylib"]
path = third_party/webdriver/pylib
url = https://chromium.googlesource.com/external/selenium/py.git
os = all
[submodule "third_party/webgl_conformance"]
path = third_party/webgl_conformance
url = https://chromium.googlesource.com/chromium/deps/webgl/sdk/tests.git
os = all
[submodule "third_party/webpagereplay"]
path = third_party/webpagereplay
url = https://chromium.googlesource.com/external/web-page-replay.git
os = all
[submodule "third_party/webrtc"]
path = third_party/webrtc
url = https://chromium.googlesource.com/external/webrtc/stable/src.git
os = all
[submodule "third_party/xdg-utils"]
path = third_party/xdg-utils
url = https://chromium.googlesource.com/chromium/deps/xdg-utils.git
os = unix
[submodule "third_party/xulrunner-sdk"]
path = third_party/xulrunner-sdk
url = https://chromium.googlesource.com/chromium/deps/xulrunner-sdk.git
os = win
[submodule "third_party/yasm/binaries"]
path = third_party/yasm/binaries
url = https://chromium.googlesource.com/chromium/deps/yasm/binaries.git
os = win
[submodule "third_party/yasm/source/patched-yasm"]
path = third_party/yasm/source/patched-yasm
url = https://chromium.googlesource.com/chromium/deps/yasm/patched-yasm.git
os = all
[submodule "tools/deps2git"]
path = tools/deps2git
url = https://chromium.googlesource.com/chromium/tools/deps2git.git
os = all
[submodule "tools/grit"]
path = tools/grit
url = https://chromium.googlesource.com/external/grit-i18n.git
os = all
[submodule "tools/gyp"]
path = tools/gyp
url = https://chromium.googlesource.com/external/gyp.git
os = all
[submodule "tools/page_cycler/acid3"]
path = tools/page_cycler/acid3
url = https://chromium.googlesource.com/chromium/deps/acid3.git
os = all
[submodule "tools/swarm_client"]
path = tools/swarm_client
url = https://chromium.googlesource.com/chromium/tools/swarm_client.git
os = all
[submodule "v8"]
path = v8
url = https://chromium.googlesource.com/external/v8.git
os = all

@ -396,6 +396,7 @@
'file_util_unittest.cc',
'file_version_info_unittest.cc',
'files/dir_reader_posix_unittest.cc',
'files/important_file_writer_unittest.cc',
'gmock_unittest.cc',
'guid_unittest.cc',
'hi_res_timer_manager_unittest.cc',

@ -146,6 +146,8 @@
'files/file_path_watcher_linux.cc',
'files/file_path_watcher_stub.cc',
'files/file_path_watcher_win.cc',
'files/important_file_writer.h',
'files/important_file_writer.cc',
'float_util.h',
'format_macros.h',
'global_descriptors_posix.cc',

@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/common/important_file_writer.h"
#include "base/files/important_file_writer.h"
#include <stdio.h>
@ -18,7 +18,7 @@
#include "base/threading/thread.h"
#include "base/time.h"
using base::TimeDelta;
namespace base {
namespace {
@ -37,7 +37,7 @@ void LogFailure(const FilePath& path, TempFileFailure failure_code,
const std::string& message) {
UMA_HISTOGRAM_ENUMERATION("ImportantFile.TempFileFailures", failure_code,
TEMP_FILE_FAILURE_MAX);
DPLOG(WARNING) << "temp file failure: " << path.value()
DPLOG(WARNING) << "temp file failure: " << path.value().c_str()
<< " : " << message;
}
@ -52,21 +52,21 @@ void WriteToDiskTask(const FilePath& path, const std::string& data) {
return;
}
int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE;
base::PlatformFile tmp_file =
base::CreatePlatformFile(tmp_file_path, flags, NULL, NULL);
if (tmp_file == base::kInvalidPlatformFileValue) {
int flags = PLATFORM_FILE_OPEN | PLATFORM_FILE_WRITE;
PlatformFile tmp_file =
CreatePlatformFile(tmp_file_path, flags, NULL, NULL);
if (tmp_file == kInvalidPlatformFileValue) {
LogFailure(path, FAILED_OPENING, "could not open temporary file");
return;
}
// If this happens in the wild something really bad is going on.
CHECK_LE(data.length(), static_cast<size_t>(kint32max));
int bytes_written = base::WritePlatformFile(
int bytes_written = WritePlatformFile(
tmp_file, 0, data.data(), static_cast<int>(data.length()));
base::FlushPlatformFile(tmp_file); // Ignore return value.
FlushPlatformFile(tmp_file); // Ignore return value.
if (!base::ClosePlatformFile(tmp_file)) {
if (!ClosePlatformFile(tmp_file)) {
LogFailure(path, FAILED_CLOSING, "failed to close temporary file");
file_util::Delete(tmp_file_path, false);
return;
@ -74,7 +74,7 @@ void WriteToDiskTask(const FilePath& path, const std::string& data) {
if (bytes_written < static_cast<int>(data.length())) {
LogFailure(path, FAILED_WRITING, "error writing, bytes_written=" +
base::IntToString(bytes_written));
IntToString(bytes_written));
file_util::Delete(tmp_file_path, false);
return;
}
@ -89,7 +89,7 @@ void WriteToDiskTask(const FilePath& path, const std::string& data) {
} // namespace
ImportantFileWriter::ImportantFileWriter(
const FilePath& path, base::MessageLoopProxy* file_message_loop_proxy)
const FilePath& path, MessageLoopProxy* file_message_loop_proxy)
: path_(path),
file_message_loop_proxy_(file_message_loop_proxy),
serializer_(NULL),
@ -122,7 +122,7 @@ void ImportantFileWriter::WriteNow(const std::string& data) {
timer_.Stop();
if (!file_message_loop_proxy_->PostTask(
FROM_HERE, base::Bind(&WriteToDiskTask, path_, data))) {
FROM_HERE, Bind(&WriteToDiskTask, path_, data))) {
// Posting the task to background message loop is not expected
// to fail, but if it does, avoid losing data and just hit the disk
// on the current thread.
@ -151,7 +151,9 @@ void ImportantFileWriter::DoScheduledWrite() {
WriteNow(data);
} else {
DLOG(WARNING) << "failed to serialize data to be saved in "
<< path_.value();
<< path_.value().c_str();
}
serializer_ = NULL;
}
} // namespace base

@ -2,11 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_COMMON_IMPORTANT_FILE_WRITER_H_
#define CHROME_COMMON_IMPORTANT_FILE_WRITER_H_
#ifndef BASE_FILES_IMPORTANT_FILE_WRITER_H_
#define BASE_FILES_IMPORTANT_FILE_WRITER_H_
#include <string>
#include "base/base_export.h"
#include "base/basictypes.h"
#include "base/file_path.h"
#include "base/memory/ref_counted.h"
@ -15,9 +16,9 @@
#include "base/timer.h"
namespace base {
class MessageLoopProxy;
class Thread;
}
// Helper to ensure that a file won't be corrupted by the write (for example on
// application crash). Consider a naive way to save an important file F:
@ -35,7 +36,7 @@ class Thread;
//
// If you want to know more about this approach and ext3/ext4 fsync issues, see
// http://valhenson.livejournal.com/37921.html
class ImportantFileWriter : public base::NonThreadSafe {
class BASE_EXPORT ImportantFileWriter : public NonThreadSafe {
public:
// Used by ScheduleSave to lazily provide the data to be saved. Allows us
// to also batch data serializations.
@ -56,7 +57,7 @@ class ImportantFileWriter : public base::NonThreadSafe {
// file I/O can be done.
// All non-const methods, ctor and dtor must be called on the same thread.
ImportantFileWriter(const FilePath& path,
base::MessageLoopProxy* file_message_loop_proxy);
MessageLoopProxy* file_message_loop_proxy);
// You have to ensure that there are no pending writes at the moment
// of destruction.
@ -83,11 +84,11 @@ class ImportantFileWriter : public base::NonThreadSafe {
// Serialize data pending to be saved and execute write on backend thread.
void DoScheduledWrite();
base::TimeDelta commit_interval() const {
TimeDelta commit_interval() const {
return commit_interval_;
}
void set_commit_interval(const base::TimeDelta& interval) {
void set_commit_interval(const TimeDelta& interval) {
commit_interval_ = interval;
}
@ -96,18 +97,20 @@ class ImportantFileWriter : public base::NonThreadSafe {
const FilePath path_;
// MessageLoopProxy for the thread on which file I/O can be done.
scoped_refptr<base::MessageLoopProxy> file_message_loop_proxy_;
scoped_refptr<MessageLoopProxy> file_message_loop_proxy_;
// Timer used to schedule commit after ScheduleWrite.
base::OneShotTimer<ImportantFileWriter> timer_;
OneShotTimer<ImportantFileWriter> timer_;
// Serializer which will provide the data to be saved.
DataSerializer* serializer_;
// Time delta after which scheduled data will be written to disk.
base::TimeDelta commit_interval_;
TimeDelta commit_interval_;
DISALLOW_COPY_AND_ASSIGN(ImportantFileWriter);
};
#endif // CHROME_COMMON_IMPORTANT_FILE_WRITER_H_
} // namespace base
#endif // BASE_FILES_IMPORTANT_FILE_WRITER_H_

@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/common/important_file_writer.h"
#include "base/files/important_file_writer.h"
#include "base/compiler_specific.h"
#include "base/file_path.h"
@ -14,6 +14,8 @@
#include "base/time.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace base {
namespace {
std::string GetFileContent(const FilePath& path) {
@ -58,7 +60,7 @@ class ImportantFileWriterTest : public testing::Test {
TEST_F(ImportantFileWriterTest, Basic) {
ImportantFileWriter writer(file_,
base::MessageLoopProxy::current());
MessageLoopProxy::current());
EXPECT_FALSE(file_util::PathExists(writer.path()));
writer.WriteNow("foo");
loop_.RunAllPending();
@ -69,8 +71,8 @@ TEST_F(ImportantFileWriterTest, Basic) {
TEST_F(ImportantFileWriterTest, ScheduleWrite) {
ImportantFileWriter writer(file_,
base::MessageLoopProxy::current());
writer.set_commit_interval(base::TimeDelta::FromMilliseconds(25));
MessageLoopProxy::current());
writer.set_commit_interval(TimeDelta::FromMilliseconds(25));
EXPECT_FALSE(writer.HasPendingWrite());
DataSerializer serializer("foo");
writer.ScheduleWrite(&serializer);
@ -78,7 +80,7 @@ TEST_F(ImportantFileWriterTest, ScheduleWrite) {
MessageLoop::current()->PostDelayedTask(
FROM_HERE,
MessageLoop::QuitClosure(),
base::TimeDelta::FromMilliseconds(100));
TimeDelta::FromMilliseconds(100));
MessageLoop::current()->Run();
EXPECT_FALSE(writer.HasPendingWrite());
ASSERT_TRUE(file_util::PathExists(writer.path()));
@ -87,7 +89,7 @@ TEST_F(ImportantFileWriterTest, ScheduleWrite) {
TEST_F(ImportantFileWriterTest, DoScheduledWrite) {
ImportantFileWriter writer(file_,
base::MessageLoopProxy::current());
MessageLoopProxy::current());
EXPECT_FALSE(writer.HasPendingWrite());
DataSerializer serializer("foo");
writer.ScheduleWrite(&serializer);
@ -96,7 +98,7 @@ TEST_F(ImportantFileWriterTest, DoScheduledWrite) {
MessageLoop::current()->PostDelayedTask(
FROM_HERE,
MessageLoop::QuitClosure(),
base::TimeDelta::FromMilliseconds(100));
TimeDelta::FromMilliseconds(100));
MessageLoop::current()->Run();
EXPECT_FALSE(writer.HasPendingWrite());
ASSERT_TRUE(file_util::PathExists(writer.path()));
@ -106,8 +108,8 @@ TEST_F(ImportantFileWriterTest, DoScheduledWrite) {
// Flaky - http://crbug.com/109292
TEST_F(ImportantFileWriterTest, DISABLED_BatchingWrites) {
ImportantFileWriter writer(file_,
base::MessageLoopProxy::current());
writer.set_commit_interval(base::TimeDelta::FromMilliseconds(25));
MessageLoopProxy::current());
writer.set_commit_interval(TimeDelta::FromMilliseconds(25));
DataSerializer foo("foo"), bar("bar"), baz("baz");
writer.ScheduleWrite(&foo);
writer.ScheduleWrite(&bar);
@ -115,8 +117,10 @@ TEST_F(ImportantFileWriterTest, DISABLED_BatchingWrites) {
MessageLoop::current()->PostDelayedTask(
FROM_HERE,
MessageLoop::QuitClosure(),
base::TimeDelta::FromMilliseconds(100));
TimeDelta::FromMilliseconds(100));
MessageLoop::current()->Run();
ASSERT_TRUE(file_util::PathExists(writer.path()));
EXPECT_EQ("baz", GetFileContent(writer.path()));
}
} // namespace base

@ -1,8 +1,3 @@
include_rules = [
# Will move to base/
"+chrome/common/important_file_writer.h",
]
specific_include_rules = {
'.*_[a-z]+test\.cc': [
"!chrome/common/chrome_notification_types.h",

@ -11,10 +11,11 @@
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/file_path.h"
#include "base/files/important_file_writer.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop_proxy.h"
#include "base/observer_list.h"
#include "base/prefs/persistent_pref_store.h"
#include "chrome/common/important_file_writer.h"
namespace base {
class DictionaryValue;
@ -26,7 +27,7 @@ class FilePath;
// A writable PrefStore implementation that is used for user preferences.
class JsonPrefStore : public PersistentPrefStore,
public ImportantFileWriter::DataSerializer {
public base::ImportantFileWriter::DataSerializer {
public:
// |file_message_loop_proxy| is the MessageLoopProxy for a thread on which
// file I/O can be done.
@ -76,7 +77,7 @@ class JsonPrefStore : public PersistentPrefStore,
bool read_only_;
// Helper for safely writing pref data.
ImportantFileWriter writer_;
base::ImportantFileWriter writer_;
ObserverList<PrefStore::Observer, true> observers_;

@ -5,10 +5,10 @@
#ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_STORAGE_H_
#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_STORAGE_H_
#include "base/files/important_file_writer.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/bookmarks/bookmark_index.h"
#include "chrome/common/important_file_writer.h"
class BookmarkModel;
class BookmarkPermanentNode;
@ -92,7 +92,7 @@ class BookmarkLoadDetails {
// as notifying the BookmarkStorage every time the model changes.
//
// Internally BookmarkStorage uses BookmarkCodec to do the actual read/write.
class BookmarkStorage : public ImportantFileWriter::DataSerializer,
class BookmarkStorage : public base::ImportantFileWriter::DataSerializer,
public base::RefCountedThreadSafe<BookmarkStorage> {
public:
// Creates a BookmarkStorage for the specified model
@ -128,7 +128,7 @@ class BookmarkStorage : public ImportantFileWriter::DataSerializer,
BookmarkModel* model_;
// Helper to write bookmark data safely.
ImportantFileWriter writer_;
base::ImportantFileWriter writer_;
// See class description of BookmarkLoadDetails for details on this.
scoped_ptr<BookmarkLoadDetails> details_;

@ -36,15 +36,15 @@
#include <string>
#include "base/file_path.h"
#include "base/files/important_file_writer.h"
#include "base/memory/weak_ptr.h"
#include "chrome/common/important_file_writer.h"
#include "net/base/transport_security_state.h"
// Reads and updates on-disk TransportSecurity state.
// Must be created, used and destroyed only on the IO thread.
class TransportSecurityPersister
: public net::TransportSecurityState::Delegate,
public ImportantFileWriter::DataSerializer {
public base::ImportantFileWriter::DataSerializer {
public:
TransportSecurityPersister(net::TransportSecurityState* state,
const FilePath& profile_path,
@ -117,7 +117,7 @@ class TransportSecurityPersister
net::TransportSecurityState* transport_security_state_;
// Helper for safely writing the data.
ImportantFileWriter writer_;
base::ImportantFileWriter writer_;
// Whether or not we're in read-only mode.
const bool readonly_;

@ -216,8 +216,6 @@
'common/form_field_data_predictions.cc',
'common/form_field_data_predictions.h',
'common/icon_messages.h',
'common/important_file_writer.cc',
'common/important_file_writer.h',
'common/instant_types.cc',
'common/instant_types.h',
'common/json_schema_constants.cc',

@ -2116,7 +2116,6 @@
'common/extensions/user_script_unittest.cc',
'common/extensions/value_counter_unittest.cc',
'common/extensions/api/extension_api_unittest.cc',
'common/important_file_writer_unittest.cc',
'common/json_schema_validator_unittest.cc',
'common/json_schema_validator_unittest_base.cc',
'common/json_schema_validator_unittest_base.h',