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

Unified Diff: webkit/blob/shareable_file_reference.cc

Issue 14261015: Add ScopedFile class which supports scope-out deletion and/or callbacks (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 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
« no previous file with comments | « webkit/blob/shareable_file_reference.h ('k') | webkit/blob/webkit_blob.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « webkit/blob/shareable_file_reference.h ('k') | webkit/blob/webkit_blob.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698