Index: content/browser/indexed_db/indexed_db_dispatcher_host.cc |
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host.cc b/content/browser/indexed_db/indexed_db_dispatcher_host.cc |
index ec8737b81680e5dd2c39873ee125df951688239f..abdf38046b8a897423dccf9849bc894173300526 100644 |
--- a/content/browser/indexed_db/indexed_db_dispatcher_host.cc |
+++ b/content/browser/indexed_db/indexed_db_dispatcher_host.cc |
@@ -69,7 +69,8 @@ IndexedDBDispatcherHost::IndexedDBDispatcherHost( |
} |
IndexedDBDispatcherHost::~IndexedDBDispatcherHost() { |
- STLDeleteValues(&blob_data_handle_map_); |
+ for (auto& iter : blob_data_handle_map_) |
+ delete iter.second.first; |
} |
void IndexedDBDispatcherHost::OnChannelConnected(int32 peer_pid) { |
@@ -209,18 +210,36 @@ uint32 IndexedDBDispatcherHost::TransactionIdToProcessId( |
return (host_transaction_id >> 32) & 0xffffffff; |
} |
+bool IndexedDBDispatcherHost::IncrementBlobDataIfHeld(const std::string& uuid) { |
+ base::AutoLock lock(blob_data_map_lock_); |
+ BlobDataHandleMap::iterator iter = blob_data_handle_map_.find(uuid); |
+ if (iter != blob_data_handle_map_.end()) { |
+ iter->second.second += 1; |
+ return true; |
+ } |
+ return false; |
+} |
+ |
void IndexedDBDispatcherHost::HoldBlobDataHandle( |
const std::string& uuid, |
scoped_ptr<storage::BlobDataHandle> blob_data_handle) { |
+ base::AutoLock lock(blob_data_map_lock_); |
DCHECK(!ContainsKey(blob_data_handle_map_, uuid)); |
- blob_data_handle_map_[uuid] = blob_data_handle.release(); |
+ blob_data_handle_map_[uuid] = |
+ std::pair<storage::BlobDataHandle*, int>(blob_data_handle.release(), 1); |
} |
void IndexedDBDispatcherHost::DropBlobDataHandle(const std::string& uuid) { |
+ base::AutoLock lock(blob_data_map_lock_); |
BlobDataHandleMap::iterator iter = blob_data_handle_map_.find(uuid); |
if (iter != blob_data_handle_map_.end()) { |
- delete iter->second; |
- blob_data_handle_map_.erase(iter); |
+ DCHECK_GE(iter->second.second, 1); |
+ if (iter->second.second == 1) { |
+ delete iter->second.first; |
+ blob_data_handle_map_.erase(iter); |
+ } else { |
+ iter->second.second -= 1; |
+ } |
} else { |
DLOG(FATAL) << "Failed to find blob UUID in map:" << uuid; |
} |