| Index: storage/browser/blob/internal_blob_data.cc
|
| diff --git a/storage/browser/blob/internal_blob_data.cc b/storage/browser/blob/internal_blob_data.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e3b0884f8ac8160573eace4315a6836f3f71d1e9
|
| --- /dev/null
|
| +++ b/storage/browser/blob/internal_blob_data.cc
|
| @@ -0,0 +1,86 @@
|
| +// TODO: Insert description here. (generated by dmurph)
|
| +
|
| +#include "storage/browser/blob/internal_blob_data.h"
|
| +
|
| +#include "base/containers/hash_tables.h"
|
| +#include "base/metrics/histogram.h"
|
| +#include "storage/browser/blob/blob_data_item.h"
|
| +#include "storage/common/data_element.h"
|
| +
|
| +namespace storage {
|
| +namespace {
|
| +size_t GetNonsharedMemoryUsage(
|
| + const std::vector<scoped_refptr<ShareableBlobDataItem>>& items) {
|
| + size_t memory = 0;
|
| + base::hash_set<void*> seen_items;
|
| + for (const auto& data_item : items) {
|
| + if (data_item->item()->type() == DataElement::TYPE_BYTES &&
|
| + data_item->referencing_blobs().size() == 1) {
|
| + if (seen_items.find(data_item.get()) != seen_items.end()) {
|
| + continue;
|
| + }
|
| + memory += data_item->item()->length();
|
| + seen_items.insert(data_item.get());
|
| + }
|
| + }
|
| + return memory;
|
| +}
|
| +void RemoveBlobFromShareableItems(
|
| + const std::string& blob_uuid,
|
| + std::vector<scoped_refptr<ShareableBlobDataItem>>& items) {
|
| + for (auto& data_item : items) {
|
| + data_item->referencing_blobs().erase(blob_uuid);
|
| + }
|
| +}
|
| +} // namespace
|
| +
|
| +InternalBlobData::Builder::Builder() {
|
| +}
|
| +InternalBlobData::Builder::~Builder() {
|
| +}
|
| +
|
| +void InternalBlobData::Builder::AppendSharedBlobItem(
|
| + scoped_refptr<ShareableBlobDataItem> item) {
|
| + DCHECK(item);
|
| + items_.push_back(item);
|
| +}
|
| +
|
| +void InternalBlobData::Builder::RemoveBlobFromShareableItems(
|
| + const std::string& blob_uuid) {
|
| + ::storage::RemoveBlobFromShareableItems(blob_uuid, items_);
|
| +}
|
| +
|
| +size_t InternalBlobData::Builder::GetNonsharedMemoryUsage() const {
|
| + return ::storage::GetNonsharedMemoryUsage(items_);
|
| +}
|
| +
|
| +InternalBlobData::InternalBlobData(scoped_ptr<Builder> builder) {
|
| + content_type_.swap(builder->content_type_);
|
| + content_disposition_.swap(builder->content_disposition_);
|
| + items_.swap(builder->items_);
|
| +}
|
| +
|
| +InternalBlobData::~InternalBlobData() {
|
| +}
|
| +
|
| +const std::vector<scoped_refptr<ShareableBlobDataItem>>&
|
| +InternalBlobData::items() const {
|
| + return items_;
|
| +}
|
| +const std::string& InternalBlobData::content_type() const {
|
| + return content_type_;
|
| +}
|
| +const std::string& InternalBlobData::content_disposition() const {
|
| + return content_disposition_;
|
| +}
|
| +
|
| +void InternalBlobData::RemoveBlobFromShareableItems(
|
| + const std::string& blob_uuid) {
|
| + ::storage::RemoveBlobFromShareableItems(blob_uuid, items_);
|
| +}
|
| +
|
| +size_t InternalBlobData::GetNonsharedMemoryUsage() const {
|
| + return ::storage::GetNonsharedMemoryUsage(items_);
|
| +}
|
| +
|
| +} // namespace storage
|
|
|