| Index: chrome/browser/visitedlink/visitedlink_master.cc
|
| diff --git a/chrome/browser/visitedlink/visitedlink_master.cc b/chrome/browser/visitedlink/visitedlink_master.cc
|
| index eedda931a1ecb22487abba82703ae0ae10c20579..50a824857da50e20bdf6a85d8365ee7163141783 100644
|
| --- a/chrome/browser/visitedlink/visitedlink_master.cc
|
| +++ b/chrome/browser/visitedlink/visitedlink_master.cc
|
| @@ -14,6 +14,7 @@
|
| #include <algorithm>
|
|
|
| #include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| #include "base/file_util.h"
|
| #include "base/logging.h"
|
| #include "base/message_loop.h"
|
| @@ -62,86 +63,30 @@ void GenerateSalt(uint8 salt[LINK_SALT_LENGTH]) {
|
| memcpy(salt, &randval, 8);
|
| }
|
|
|
| -// AsyncWriter ----------------------------------------------------------------
|
| -
|
| -// This task executes on a background thread and executes a write. This
|
| -// prevents us from blocking the UI thread doing I/O.
|
| -class AsyncWriter : public Task {
|
| - public:
|
| - AsyncWriter(FILE* file, int32 offset, const void* data, size_t data_len)
|
| - : file_(file),
|
| - offset_(offset) {
|
| - data_->resize(data_len);
|
| - memcpy(&*data_->begin(), data, data_len);
|
| - }
|
| -
|
| - virtual void Run() {
|
| - WriteToFile(file_, offset_,
|
| - &*data_->begin(), static_cast<int32>(data_->size()));
|
| - }
|
| -
|
| - // Exposed as a static so it can be called directly from the Master to
|
| - // reduce the number of platform-specific I/O sites we have. Returns true if
|
| - // the write was complete.
|
| - static bool WriteToFile(FILE* file,
|
| - off_t offset,
|
| - const void* data,
|
| - size_t data_len) {
|
| - if (fseek(file, offset, SEEK_SET) != 0)
|
| - return false; // Don't write to an invalid part of the file.
|
| -
|
| - size_t num_written = fwrite(data, 1, data_len, file);
|
| -
|
| - // The write may not make it to the kernel (stdlib may buffer the write)
|
| - // until the next fseek/fclose call. If we crash, it's easy for our used
|
| - // item count to be out of sync with the number of hashes we write.
|
| - // Protect against this by calling fflush.
|
| - int ret = fflush(file);
|
| - DCHECK_EQ(0, ret);
|
| - return num_written == data_len;
|
| - }
|
| -
|
| - private:
|
| - // The data to write and where to write it.
|
| - FILE* file_;
|
| - int32 offset_; // Offset from the beginning of the file.
|
| -
|
| - // Most writes are just a single fingerprint, so we reserve that much in this
|
| - // object to avoid mallocs in that case.
|
| - StackVector<char, sizeof(VisitedLinkCommon::Fingerprint)> data_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AsyncWriter);
|
| -};
|
| -
|
| -// Used to asynchronously set the end of the file. This must be done on the
|
| -// same thread as the writing to keep things synchronized.
|
| -class AsyncSetEndOfFile : public Task {
|
| - public:
|
| - explicit AsyncSetEndOfFile(FILE* file) : file_(file) {}
|
| -
|
| - virtual void Run() {
|
| - TruncateFile(file_);
|
| - }
|
| -
|
| - private:
|
| - FILE* file_;
|
| - DISALLOW_COPY_AND_ASSIGN(AsyncSetEndOfFile);
|
| -};
|
| +// Returns true if the write was complete.
|
| +static bool WriteToFile(FILE* file,
|
| + off_t offset,
|
| + const void* data,
|
| + size_t data_len) {
|
| + if (fseek(file, offset, SEEK_SET) != 0)
|
| + return false; // Don't write to an invalid part of the file.
|
|
|
| -// Used to asynchronously close a file. This must be done on the same thread as
|
| -// the writing to keep things synchronized.
|
| -class AsyncCloseHandle : public Task {
|
| - public:
|
| - explicit AsyncCloseHandle(FILE* file) : file_(file) {}
|
| + size_t num_written = fwrite(data, 1, data_len, file);
|
|
|
| - virtual void Run() {
|
| - fclose(file_);
|
| - }
|
| + // The write may not make it to the kernel (stdlib may buffer the write)
|
| + // until the next fseek/fclose call. If we crash, it's easy for our used
|
| + // item count to be out of sync with the number of hashes we write.
|
| + // Protect against this by calling fflush.
|
| + int ret = fflush(file);
|
| + DCHECK_EQ(0, ret);
|
| + return num_written == data_len;
|
| +}
|
|
|
| - private:
|
| - FILE* file_;
|
| - DISALLOW_COPY_AND_ASSIGN(AsyncCloseHandle);
|
| -};
|
| +// This task executes on a background thread and executes a write. This
|
| +// prevents us from blocking the UI thread doing I/O.
|
| +void AsyncWrite(FILE* file, int32 offset, const std::string& data) {
|
| + WriteToFile(file, offset, data.data(), data.size());
|
| +}
|
|
|
| } // namespace
|
|
|
| @@ -536,7 +481,9 @@ bool VisitedLinkMaster::WriteFullTable() {
|
|
|
| // The hash table may have shrunk, so make sure this is the end.
|
| BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE, new AsyncSetEndOfFile(file_));
|
| + BrowserThread::FILE,
|
| + FROM_HERE,
|
| + base::Bind(base::IgnoreResult(&TruncateFile), file_));
|
| return true;
|
| }
|
|
|
| @@ -728,7 +675,9 @@ void VisitedLinkMaster::FreeURLTable() {
|
| return;
|
|
|
| BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE, new AsyncCloseHandle(file_));
|
| + BrowserThread::FILE,
|
| + FROM_HERE,
|
| + base::Bind(base::IgnoreResult(&fclose), file_));
|
| }
|
|
|
| bool VisitedLinkMaster::ResizeTableIfNecessary() {
|
| @@ -914,7 +863,8 @@ void VisitedLinkMaster::WriteToFile(FILE* file,
|
|
|
| BrowserThread::PostTask(
|
| BrowserThread::FILE, FROM_HERE,
|
| - new AsyncWriter(file, offset, data, data_size));
|
| + base::Bind(&AsyncWrite, file, offset,
|
| + std::string(static_cast<const char*>(data), data_size)));
|
| }
|
|
|
| void VisitedLinkMaster::WriteUsedItemCountToFile() {
|
|
|