Chromium Code Reviews| Index: webkit/fileapi/isolated_context.cc |
| diff --git a/webkit/fileapi/isolated_context.cc b/webkit/fileapi/isolated_context.cc |
| index e8b52ae83f0ae9bc77904e2934878aac00714bde..adece4277a539b45a47ca7f15b2f487acb8f66ee 100644 |
| --- a/webkit/fileapi/isolated_context.cc |
| +++ b/webkit/fileapi/isolated_context.cc |
| @@ -43,15 +43,24 @@ std::string IsolatedContext::RegisterIsolatedFileSystem( |
| toplevels.insert(std::make_pair(basename, fullpath)); |
| } |
| toplevel_map_[filesystem_id] = toplevels; |
| + |
| + // Each file system is created with refcount == 0. |
| + ref_counts_[filesystem_id] = 0; |
| + |
| return filesystem_id; |
| } |
| -// Revoke any registered drag context for the child_id. |
| -void IsolatedContext::RevokeIsolatedFileSystem( |
| - const std::string& filesystem_id) { |
| +void IsolatedContext::AddReference(const std::string& filesystem_id) { |
| base::AutoLock locker(lock_); |
| - toplevel_map_.erase(filesystem_id); |
| - writable_ids_.erase(filesystem_id); |
| + DCHECK(ref_counts_.find(filesystem_id) != ref_counts_.end()); |
| + ref_counts_[filesystem_id]++; |
| +} |
| + |
| +void IsolatedContext::RemoveReference(const std::string& filesystem_id) { |
| + base::AutoLock locker(lock_); |
|
tzik
2012/06/21 14:00:35
Could you add DCHECK(ref_counts_.find(filesystem_i
kinuko
2012/06/22 04:53:30
Done. We didn't have similar check in RevokeIsola
|
| + // Refcount could become <0 if it has never gotten referenced. |
| + if (--ref_counts_[filesystem_id] <= 0) |
| + RevokeWithoutLocking(filesystem_id); |
| } |
| bool IsolatedContext::CrackIsolatedPath(const FilePath& virtual_path, |
| @@ -147,6 +156,13 @@ IsolatedContext::IsolatedContext() { |
| IsolatedContext::~IsolatedContext() { |
| } |
| +void IsolatedContext::RevokeWithoutLocking( |
| + const std::string& filesystem_id) { |
| + toplevel_map_.erase(filesystem_id); |
| + writable_ids_.erase(filesystem_id); |
| + ref_counts_.erase(filesystem_id); |
| +} |
| + |
| std::string IsolatedContext::GetNewFileSystemId() const { |
| // Returns an arbitrary random string which must be unique in the map. |
| uint32 random_data[4]; |