| Index: webkit/blob/shareable_file_reference.cc
|
| diff --git a/webkit/blob/shareable_file_reference.cc b/webkit/blob/shareable_file_reference.cc
|
| index 07acac3a55e5598c4fd4bc8f7a0946c454216009..fd7591753bb2cb2c21606d6ebfea5d24ec2cded0 100644
|
| --- a/webkit/blob/shareable_file_reference.cc
|
| +++ b/webkit/blob/shareable_file_reference.cc
|
| @@ -6,22 +6,17 @@
|
|
|
| #include <map>
|
|
|
| -#include "base/file_util.h"
|
| -#include "base/files/file_util_proxy.h"
|
| #include "base/lazy_instance.h"
|
| +#include "base/message_loop/message_loop_proxy.h"
|
| #include "base/task_runner.h"
|
| -#include "base/threading/thread_checker.h"
|
| +#include "base/threading/non_thread_safe.h"
|
|
|
| namespace webkit_blob {
|
|
|
| namespace {
|
|
|
| // A shareable file map with enforcement of thread checker.
|
| -// This map may get deleted on a different thread in AtExitManager at the
|
| -// very end on the main thread (at the point all other threads must be
|
| -// terminated), so we use ThreadChecker rather than NonThreadSafe and do not
|
| -// check thread in the dtor.
|
| -class ShareableFileMap {
|
| +class ShareableFileMap : public base::NonThreadSafe {
|
| public:
|
| typedef std::map<base::FilePath, ShareableFileReference*> FileMap;
|
| typedef FileMap::iterator iterator;
|
| @@ -30,6 +25,10 @@ class ShareableFileMap {
|
|
|
| ShareableFileMap() {}
|
|
|
| + ~ShareableFileMap() {
|
| + DetachFromThread();
|
| + }
|
| +
|
| iterator Find(key_type key) {
|
| DCHECK(CalledOnValidThread());
|
| return file_map_.find(key);
|
| @@ -50,13 +49,8 @@ class ShareableFileMap {
|
| file_map_.erase(key);
|
| }
|
|
|
| - bool CalledOnValidThread() const {
|
| - return thread_checker_.CalledOnValidThread();
|
| - }
|
| -
|
| private:
|
| FileMap file_map_;
|
| - base::ThreadChecker thread_checker_;
|
| DISALLOW_COPY_AND_ASSIGN(ShareableFileMap);
|
| };
|
|
|
| @@ -75,21 +69,33 @@ scoped_refptr<ShareableFileReference> ShareableFileReference::Get(
|
|
|
| // static
|
| scoped_refptr<ShareableFileReference> ShareableFileReference::GetOrCreate(
|
| - const base::FilePath& path, FinalReleasePolicy policy,
|
| + const base::FilePath& path,
|
| + FinalReleasePolicy policy,
|
| base::TaskRunner* file_task_runner) {
|
| - DCHECK(file_task_runner);
|
| - typedef std::pair<ShareableFileMap::iterator, bool> InsertResult;
|
| + return GetOrCreate(
|
| + ScopedFile(path, static_cast<ScopedFile::ScopeOutPolicy>(policy),
|
| + file_task_runner));
|
| +}
|
| +
|
| +// static
|
| +scoped_refptr<ShareableFileReference> ShareableFileReference::GetOrCreate(
|
| + ScopedFile scoped_file) {
|
| + if (scoped_file.path().empty())
|
| + return scoped_refptr<ShareableFileReference>();
|
|
|
| + typedef std::pair<ShareableFileMap::iterator, bool> InsertResult;
|
| // Required for VS2010: http://connect.microsoft.com/VisualStudio/feedback/details/520043/error-converting-from-null-to-a-pointer-type-in-std-pair
|
| webkit_blob::ShareableFileReference* null_reference = NULL;
|
| InsertResult result = g_file_map.Get().Insert(
|
| - ShareableFileMap::value_type(path, null_reference));
|
| - if (result.second == false)
|
| + ShareableFileMap::value_type(scoped_file.path(), null_reference));
|
| + if (result.second == false) {
|
| + scoped_file.Release();
|
| return scoped_refptr<ShareableFileReference>(result.first->second);
|
| + }
|
|
|
| // Wasn't in the map, create a new reference and store the pointer.
|
| scoped_refptr<ShareableFileReference> reference(
|
| - new ShareableFileReference(path, policy, file_task_runner));
|
| + new ShareableFileReference(scoped_file.Pass()));
|
| result.first->second = reference.get();
|
| return reference;
|
| }
|
| @@ -97,29 +103,17 @@ scoped_refptr<ShareableFileReference> ShareableFileReference::GetOrCreate(
|
| void ShareableFileReference::AddFinalReleaseCallback(
|
| const FinalReleaseCallback& callback) {
|
| DCHECK(g_file_map.Get().CalledOnValidThread());
|
| - final_release_callbacks_.push_back(callback);
|
| + scoped_file_.AddScopeOutCallback(callback, NULL);
|
| }
|
|
|
| -ShareableFileReference::ShareableFileReference(
|
| - const base::FilePath& path, FinalReleasePolicy policy,
|
| - base::TaskRunner* file_task_runner)
|
| - : path_(path),
|
| - final_release_policy_(policy),
|
| - file_task_runner_(file_task_runner) {
|
| - DCHECK(g_file_map.Get().Find(path_)->second == NULL);
|
| +ShareableFileReference::ShareableFileReference(ScopedFile scoped_file)
|
| + : scoped_file_(scoped_file.Pass()) {
|
| + DCHECK(g_file_map.Get().Find(path())->second == NULL);
|
| }
|
|
|
| ShareableFileReference::~ShareableFileReference() {
|
| - DCHECK(g_file_map.Get().Find(path_)->second == this);
|
| - g_file_map.Get().Erase(path_);
|
| -
|
| - for (size_t i = 0; i < final_release_callbacks_.size(); i++)
|
| - final_release_callbacks_[i].Run(path_);
|
| -
|
| - if (final_release_policy_ == DELETE_ON_FINAL_RELEASE) {
|
| - base::FileUtilProxy::Delete(file_task_runner_, path_, false /* recursive */,
|
| - base::FileUtilProxy::StatusCallback());
|
| - }
|
| + DCHECK(g_file_map.Get().Find(path())->second == this);
|
| + g_file_map.Get().Erase(path());
|
| }
|
|
|
| } // namespace webkit_blob
|
|
|