blob: ebeabdc687723972246532d8d6288d276c558065 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "storage/common/blob_storage/blob_storage_constants.h"
#include "base/command_line.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
namespace storage {
namespace {
// Specifies the minimum file size.
constexpr const char kBlobFileTransportMinFileSizeSwitch[] =
"blob-transport-file-min-size";
// Specifies the maximum file size.
constexpr const char kBlobFileTransportMaxFileSizeSwitch[] =
"blob-transport-file-max-size";
// Specifies a custom maximum size of the shared memory segments used to
// transport blob.
const char kBlobSharedMemoryTransportMaxSizeSwitch[] =
"blob-transport-shared-memory-max-size";
} // namespace
static_assert(kDefaultIPCMemorySize < kDefaultSharedMemorySize,
"IPC transport size must be smaller than shared memory size.");
static_assert(kDefaultMinPageFileSize < kDefaultMaxPageFileSize,
"Min page file size must be less than max.");
static_assert(kDefaultMinPageFileSize < kDefaultMaxBlobInMemorySpace,
"Page file size must be less than in-memory space.");
BlobStorageLimits::BlobStorageLimits() {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (UNLIKELY(
command_line->HasSwitch(kBlobFileTransportByFileTriggerSwitch))) {
CHECK(base::StringToUint64(command_line->GetSwitchValueASCII(
kBlobFileTransportByFileTriggerSwitch),
&override_file_transport_min_size))
<< "Unable to parse "
<< command_line->GetSwitchValueASCII(
kBlobFileTransportByFileTriggerSwitch);
}
if (UNLIKELY(
command_line->HasSwitch(kBlobSharedMemoryTransportMaxSizeSwitch))) {
CHECK(base::StringToSizeT(command_line->GetSwitchValueASCII(
kBlobSharedMemoryTransportMaxSizeSwitch),
&max_shared_memory_size))
<< "Unable to parse "
<< command_line->GetSwitchValueASCII(
kBlobSharedMemoryTransportMaxSizeSwitch);
}
if (UNLIKELY(command_line->HasSwitch(kBlobFileTransportMinFileSizeSwitch))) {
CHECK(base::StringToUint64(
command_line->GetSwitchValueASCII(kBlobFileTransportMinFileSizeSwitch),
&min_page_file_size))
<< "Unable to parse "
<< command_line->GetSwitchValueASCII(
kBlobSharedMemoryTransportMaxSizeSwitch);
}
if (UNLIKELY(command_line->HasSwitch(kBlobFileTransportMaxFileSizeSwitch))) {
CHECK(base::StringToUint64(
command_line->GetSwitchValueASCII(kBlobFileTransportMaxFileSizeSwitch),
&max_file_size))
<< "Unable to parse "
<< command_line->GetSwitchValueASCII(
kBlobSharedMemoryTransportMaxSizeSwitch);
}
CHECK(IsValid());
}
BlobStorageLimits::~BlobStorageLimits() {}
BlobStorageLimits::BlobStorageLimits(const BlobStorageLimits&) = default;
BlobStorageLimits& BlobStorageLimits::operator=(const BlobStorageLimits&) =
default;
bool BlobStorageLimits::IsValid() const {
return max_ipc_memory_size <= max_bytes_data_item_size &&
max_shared_memory_size <= max_bytes_data_item_size &&
min_page_file_size <= max_file_size &&
min_page_file_size <= max_blob_in_memory_space &&
effective_max_disk_space <= desired_max_disk_space;
}
bool BlobStatusIsError(BlobStatus status) {
return static_cast<int>(status) <= static_cast<int>(BlobStatus::LAST_ERROR);
}
bool BlobStatusIsPending(BlobStatus status) {
int status_int = static_cast<int>(status);
return status_int >= static_cast<int>(BlobStatus::PENDING_QUOTA) &&
status_int <= static_cast<int>(BlobStatus::LAST_PENDING);
}
bool BlobStatusIsBadIPC(BlobStatus status) {
return status == BlobStatus::ERR_INVALID_CONSTRUCTION_ARGUMENTS;
}
} // namespace storage