pw_blob_store#

Flash-backed persistent storage for data blobs

Stable C++

pw_blob_store is a storage container library for storing a single blob of data. BlobStore is a flash-backed persistent storage system with integrated data integrity checking that serves as a lightweight alternative to a file system.

Usage#

Most operations on a BlobStore are done using BlobReader and BlobWriter objects that have been constructed using a BlobStore. Though a BlobStore may have multiple open BlobReader objects, no other readers/writers may be active if a BlobWriter is opened on a blob store.

The data state of a blob can be checked using the HasData() method. The method returns true if the blob is currenty valid and has at least one data byte. This allows checking if a blob has stored data without needing to instantiate and open a reader or writer.

Write buffer#

BlobStore uses a write buffer to allow writes smaller than and/or unaligned to the flash write aligment. BlobStore also supports using the write buffer for deferred writes that can be enqueued and written to flash at a later time or by a different thread/context.

BlobStore can be used with a zero-size write buffer to reduce memory requirements. When using zero-size write buffer, the user is required to write maintain write sizes that are a multiple of the flash write size the blob is configured for.

If a non-zero sized write buffer is used, the write buffer size must be a multiple of the flash write size.

Writing to a BlobStore#

BlobWriter objects are pw::stream::Writer compatible, but do not support reading any of the blob’s contents. Opening a BlobWriter on a BlobStore that contains data will discard any existing data if Discard(), Write (), or Erase() are called. Partially written blobs can be resumed using Resume(). There is currently no mechanism to allow appending to completed data write.

BlobStore::BlobWriterWithBuffer writer(my_blob_store);
writer.Open();
writer.Write(my_data);

// ...

// A close is implied when a BlobWriter is destroyed. Manually closing a
// BlobWriter enables error handling on Close() failure.
writer.Close();

Resuming a BlobStore write#

BlobWriter::Resume() supports resuming writes for blobs that have not been completed (writer.Close()). Supported resume situations are after Abandon() has been called on a write or after a crash/reboot with a fresh BlobStore instance.

Resume() opens the BlobWriter at the most recent safe resume point. Resume() finds the furthest written point in the flash partition and then backs up by erasing any partially written sector plus a full sector. This backing up is to try to avoid any corrupted or otherwise wrong data that might have resulted from the previous write failing. Resume() returns the current number of valid bytes in the resumed write.

If the blob is using a ChecksumAlgorithm, the checksum of the resumed blob write instance calculated from the content of the already written data. If it is desired to check the integrity of the already written data, BlobWriter::CurrentChecksum() can be used to check against the incoming data.

Once Resume() has successfully completed, the writer is ready to continue writing as normal.

Erasing a BlobStore#

There are two distinctly different mechanisms to “erase” the contents of a BlobStore:

  1. Discard(): Discards any ongoing writes and ensures BlobReader objects see the BlobStore as empty. This is the fastest way to logically erase a BlobStore.

  2. Erase(): Performs an explicit flash erase of the BlobStore’s underlying partition. This is useful for manually controlling when a flash erase is performed before a BlobWriter starts to write data (as flash erase operations may be time-consuming).

Naming a BlobStore’s contents#

Data in a BlobStore May be named similarly to a file. This enables identification of a BlobStore’s contents in cases where different data may be stored to a shared blob store. This requires an additional RAM buffer that can be used to encode the BlobStore’s KVS metadata entry. Calling MaxFileNameLength() on a BlobWriter will provide the max file name length based on the BlobWriter’s metadata encode buffer size.

SetFileName() performs a copy of the provided file name, meaning it’s safe for the std::string_view to be invalidated after the function returns.

constexpr size_t kMaxFileNameLength = 48;
BlobStore::BlobWriterWithBuffer<kMaxFileNameLength> writer(my_blob_store);
writer.Open();
writer.SetFileName("stonks.jpg");
writer.Write(my_data);
// ...
writer.Close();

Reading from a BlobStore#

A BlobStore may have multiple open BlobReader objects. No other readers/writers may be open/active if a BlobWriter is opened on a blob store.

  1. Create BlobReader instance

  2. BlobReader::Open()

  3. Read data using BlobReader::Read() or BlobReader::GetMemoryMappedBlob(). BlobReader is seekable. Use BlobReader::Seek() to read from a desired offset.

  4. BlobReader::Close()

FileSystem RPC integration#

pw_blob_store provides an optional FileSystemEntry implementation for use with pw_file’s FlatFileSystemService. This simplifies the process of enumerating BlobStore objects as files via pw_file’s FileSystem RPC service.

Size report#

The following size report showcases the memory usage of the blob store.

Label

Segment

Delta

BlobStore

FLASH

+16

[section .code]

DEL

-306

pw::kvs::internal::Sectors::Find()

DEL

-288

pw::kvs::KeyValueStore::UpdateEntriesToPrimaryFormat()

-4

quorem

DEL

-268

pw::kvs::internal::Sectors::FindSectorToGarbageCollect()

DEL

-258

pw::kvs::KeyValueStore::WriteEntry()

DEL

-236

pw::kvs::KeyValueStore::FullMaintenanceHelper()

DEL

-184

pw::kvs::KeyValueStore::GarbageCollectSector()

DEL

-176

pw::kvs::KeyValueStore::GetSectorForWrite()

-7

pw::kvs::KeyValueStore::Init()::_pw_tokenizer_string_entry_91_15

DEL

-160

pw::kvs::KeyValueStore::AppendEntry()

+60

pw::kvs::KeyValueStore::Init()::_pw_tokenizer_string_entry_78_11

DEL

-136

pw::kvs::KeyValueStore::FixedSizeGet()

DEL

-136

pw::kvs::KeyValueStore::PutBytes()

DEL

-128

main::_pw_tokenizer_string_entry_84_13

DEL

-128

pw::kvs::KeyValueStore::CopyEntryToSector()

DEL

-128

pw::kvs::KeyValueStore::WriteEntryForNewKey()

-32

pw::kvs::KeyValueStore::Init()::_pw_tokenizer_string_entry_117_27

DEL

-126

std::__find_if<>()

+33

pw::bloat::BloatThisBinary()::_pw_tokenizer_string_entry_62_1

DEL

-120

pw::kvs::KeyValueStore::Get()

DEL

-118

pw::kvs::KeyValueStore::AddRedundantEntries()

DEL

-118

pw::kvs::KeyValueStore::RelocateEntry()

DEL

-108

pw::kvs::KeyValueStore::UpdateKeyDescriptor()

DEL

-104

pw::kvs::KeyValueStore::RepairCorruptSectors()

+19

pw::kvs::KeyValueStore::Init()::_pw_tokenizer_string_entry_111_19

DEL

-90

pw::kvs::KeyValueStore::CreateEntry()

DEL

-90

pw::kvs::KeyValueStore::EnsureEntryRedundancy()

DEL

-82

pw::kvs::KeyValueStore::ReadEntry()

DEL

-76

pw::kvs::KeyValueStore::Delete()

DEL

-72

pw::kvs::KeyValueStore::CreateOrUpdateKeyDescriptor()

DEL

-70

pw::kvs::KeyValueStore::RelocateKeyAddressesInSector()

DEL

-64

pw::kvs::KeyValueStore::GetAddressesForWrite()

DEL

-60

_GLOBAL__sub_I_base.cc

DEL

-60

pw::kvs::KeyValueStore::EnsureFreeSectorExists()

DEL

-56

pw::kvs::KeyValueStore::WriteEntryForExistingKey()

DEL

-42

pw::kvs::KeyValueStore::FindEntry()

DEL

-40

pw::kvs::KeyValueStore::Init()::_pw_tokenizer_string_entry_111_17

DEL

-36

pw::kvs::KeyValueStore::GarbageCollect()

DEL

-36

pw::kvs::KeyValueStore::Repair()

DEL

-36

pw::kvs::internal::Entry::Tombstone()

DEL

-36

pw::kvs::internal::Entry::Valid()

DEL

-36

pw::kvs::internal::Sectors::NextWritableAddress()

DEL

-34

pw::kvs::KeyValueStore::ValueSize()

DEL

-32

pw::Vector<>::Append()

DEL

-32

pw::kvs::internal::Sectors::FindSpaceDuringGarbageCollection()

DEL

-30

pw::kvs::internal::Sectors::FindSpace()

DEL

-30

pw::kvs::internal::Sectors::WearLeveledSectorFromIndex()

-2

pw::tokenizer::EncodedMessage<>::EncodedMessage()

DEL

-24

pw::kvs::KeyValueStore::FindExisting()

DEL

-22

pw::kvs::internal::Sectors::BaseAddress()

DEL

-20

pw::kvs::internal::EntryMetadata::AddNewAddress()

+6

OUTLINED_FUNCTION_2

DEL

-18

pw::kvs::internal::Entry::size()

+8

OUTLINED_FUNCTION_3

+6

OUTLINED_FUNCTION_5

DEL

-14

pw::span<>::front()

DEL

-8

pw::Vector<>::assign()

+8

OUTLINED_FUNCTION_0

+8

OUTLINED_FUNCTION_1

DEL

-6

pw::kvs::KeyValueStore::HeavyMaintenance()

DEL

-4

std::find<>()

NEW

+171

pw::blob_store::BlobStore::BlobWriter::Resume()::_pw_tokenizer_string_entry_658_117

NEW

+164

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_406_71

NEW

+159

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_414_77

NEW

+157

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_49_7

NEW

+155

pw::blob_store::BlobStore::BlobWriter::WriteMetadata()::_pw_tokenizer_string_entry_707_121

NEW

+155

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_54_11

NEW

+154

pw::blob_store::BlobStore::WriteBufferBytesFree()::_pw_tokenizer_string_entry_453_81

NEW

+150

pw::blob_store::BlobStore::BlobWriter::Close()::$_0::operator()()::_pw_tokenizer_string_entry_749_129

NEW

+149

pw::blob_store::BlobStore::BlobWriter::WriteMetadata()::_pw_tokenizer_string_entry_716_125

NEW

+146

pw::blob_store::BlobStore::Erase()::_pw_tokenizer_string_entry_502_83

NEW

+145

pw::blob_store::BlobStore::Flush()::_pw_tokenizer_string_entry_383_61

NEW

+145

pw::blob_store::BlobStore::Flush()::_pw_tokenizer_string_entry_389_63

NEW

+145

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_327_55

NEW

+144

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_404_69

NEW

+143

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_275_49

NEW

+141

pw::blob_store::BlobStore::BlobWriter::WriteMetadata()::_pw_tokenizer_string_entry_708_123

NEW

+139

pw::blob_store::BlobStore::BlobReader::Open()::_pw_tokenizer_string_entry_807_137

NEW

+136

pw::blob_store::BlobStore::LoadMetadata()::_pw_tokenizer_string_entry_94_23

NEW

+134

main::_pw_tokenizer_string_entry_88_13

NEW

+134

pw::blob_store::BlobStore::WriteBufferBytesUsed()::_pw_tokenizer_string_entry_447_79

NEW

+133

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_48_5

NEW

+131

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_52_9

NEW

+131

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_68_19

NEW

+129

pw::blob_store::BlobStore::BlobWriter::SetFileName()::_pw_tokenizer_string_entry_603_105

NEW

+129

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_545_91

NEW

+127

pw::blob_store::BlobStore::BlobWriter::Close()::$_0::operator()()::_pw_tokenizer_string_entry_761_131

NEW

+125

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_552_95

NEW

+124

pw::blob_store::BlobStore::Flush()::_pw_tokenizer_string_entry_370_59

NEW

+124

pw::blob_store::BlobStore::Flush()::_pw_tokenizer_string_entry_394_65

NEW

+124

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_409_73

NEW

+124

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_62_15

NEW

+124

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_270_47

NEW

+124

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_292_51

NEW

+124

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_328_57

NEW

+122

pw::blob_store::BlobStore::OpenRead()::_pw_tokenizer_string_entry_222_35

NEW

+122

pw::blob_store::BlobStore::ResumeWrite()::_pw_tokenizer_string_entry_180_31

NEW

+121

pw::blob_store::BlobStore::BlobWriter::GetFileName()::_pw_tokenizer_string_entry_624_109

NEW

+121

pw::blob_store::BlobStore::BlobWriter::SetFileName()::_pw_tokenizer_string_entry_604_107

NEW

+121

pw::blob_store::BlobStore::Erase()::_pw_tokenizer_string_entry_503_85

NEW

+121

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_403_67

NEW

+120

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_307_53

NEW

+119

pw::blob_store::BlobStore::CloseRead()::_pw_tokenizer_string_entry_233_41

NEW

+113

pw::blob_store::BlobStore::Erase()::_pw_tokenizer_string_entry_507_87

NEW

+108

pw::blob_store::BlobStore::BlobReader::Open()::_pw_tokenizer_string_entry_800_133

NEW

+108

pw::blob_store::BlobStore::BlobWriter::Open()::_pw_tokenizer_string_entry_644_111

NEW

+105

pw::blob_store::BlobStore::BlobWriter::Resume()::_pw_tokenizer_string_entry_656_115

NEW

+104

pw::blob_store::BlobStore::BlobWriter::Open()::_pw_tokenizer_string_entry_646_113

NEW

+103

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_565_103

NEW

+101

pw::blob_store::BlobStore::BlobWriter::WriteMetadata()::_pw_tokenizer_string_entry_688_119

NEW

+97

pw::blob_store::BlobStore::CloseRead()::_pw_tokenizer_string_entry_235_45

NEW

+96

pw::blob_store::BlobStore::OpenRead()::_pw_tokenizer_string_entry_226_39

NEW

+96

pw::blob_store::BlobStore::OpenWrite()::_pw_tokenizer_string_entry_123_27

NEW

+94

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_44_3

NEW

+90

main::_pw_tokenizer_string_entry_114_17

NEW

+90

main::_pw_tokenizer_string_entry_117_21

NEW

+60

_GLOBAL__sub_I_basic_blob.cc

NEW

+47

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_561_99

NEW

+41

pw::blob_store::BlobStore::BlobReader::Open()::_pw_tokenizer_string_entry_807_135

NEW

+41

pw::blob_store::BlobStore::BlobWriter::Close()::$_0::operator()()::_pw_tokenizer_string_entry_749_127

NEW

+41

pw::blob_store::BlobStore::CloseRead()::_pw_tokenizer_string_entry_235_43

NEW

+41

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_414_75

NEW

+41

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_44_1

NEW

+41

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_62_13

NEW

+41

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_68_17

NEW

+41

pw::blob_store::BlobStore::LoadMetadata()::_pw_tokenizer_string_entry_94_21

NEW

+41

pw::blob_store::BlobStore::OpenRead()::_pw_tokenizer_string_entry_222_33

NEW

+41

pw::blob_store::BlobStore::OpenRead()::_pw_tokenizer_string_entry_226_37

NEW

+41

pw::blob_store::BlobStore::OpenWrite()::_pw_tokenizer_string_entry_123_25

NEW

+41

pw::blob_store::BlobStore::ResumeWrite()::_pw_tokenizer_string_entry_180_29

NEW

+41

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_545_89

NEW

+41

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_552_93

NEW

+41

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_565_101

NEW

+37

main::_pw_tokenizer_string_entry_117_19

NEW

+36

pw::ByteBuilder::ResizeForAppend()

NEW

+36

pw::blob_store::BlobStore::BlobReader

NEW

+36

pw::blob_store::BlobStore::BlobWriter

NEW

+34

pw::ByteBuilder::append()

NEW

+22

main::_pw_tokenizer_string_entry_114_15

NEW

+13

pw::ByteBuilder::WriteInOrder<>()

+3,584

BlobStore with deferred write

FLASH

+16

[section .code]

DEL

-306

pw::kvs::internal::Sectors::Find()

DEL

-288

pw::kvs::KeyValueStore::UpdateEntriesToPrimaryFormat()

-4

quorem

DEL

-268

pw::kvs::internal::Sectors::FindSectorToGarbageCollect()

DEL

-258

pw::kvs::KeyValueStore::WriteEntry()

DEL

-236

pw::kvs::KeyValueStore::FullMaintenanceHelper()

DEL

-184

pw::kvs::KeyValueStore::GarbageCollectSector()

DEL

-176

pw::kvs::KeyValueStore::GetSectorForWrite()

-5

pw::kvs::KeyValueStore::Init()::_pw_tokenizer_string_entry_91_15

DEL

-160

pw::kvs::KeyValueStore::AppendEntry()

+60

pw::kvs::KeyValueStore::Init()::_pw_tokenizer_string_entry_78_11

DEL

-136

pw::kvs::KeyValueStore::FixedSizeGet()

DEL

-136

pw::kvs::KeyValueStore::PutBytes()

DEL

-128

main::_pw_tokenizer_string_entry_84_13

DEL

-128

pw::kvs::KeyValueStore::CopyEntryToSector()

DEL

-128

pw::kvs::KeyValueStore::WriteEntryForNewKey()

-32

pw::kvs::KeyValueStore::Init()::_pw_tokenizer_string_entry_117_27

DEL

-126

std::__find_if<>()

+33

pw::bloat::BloatThisBinary()::_pw_tokenizer_string_entry_62_1

DEL

-120

pw::kvs::KeyValueStore::Get()

DEL

-118

pw::kvs::KeyValueStore::AddRedundantEntries()

DEL

-118

pw::kvs::KeyValueStore::RelocateEntry()

DEL

-108

pw::kvs::KeyValueStore::UpdateKeyDescriptor()

DEL

-104

pw::kvs::KeyValueStore::RepairCorruptSectors()

+17

pw::kvs::KeyValueStore::Init()::_pw_tokenizer_string_entry_111_19

DEL

-90

pw::kvs::KeyValueStore::CreateEntry()

DEL

-90

pw::kvs::KeyValueStore::EnsureEntryRedundancy()

DEL

-82

pw::kvs::KeyValueStore::ReadEntry()

DEL

-76

pw::kvs::KeyValueStore::Delete()

DEL

-72

pw::kvs::KeyValueStore::CreateOrUpdateKeyDescriptor()

DEL

-70

pw::kvs::KeyValueStore::RelocateKeyAddressesInSector()

DEL

-64

pw::kvs::KeyValueStore::GetAddressesForWrite()

DEL

-60

_GLOBAL__sub_I_base.cc

DEL

-60

pw::kvs::KeyValueStore::EnsureFreeSectorExists()

DEL

-56

pw::kvs::KeyValueStore::WriteEntryForExistingKey()

DEL

-42

pw::kvs::KeyValueStore::FindEntry()

DEL

-40

pw::kvs::KeyValueStore::Init()::_pw_tokenizer_string_entry_111_17

DEL

-36

pw::kvs::KeyValueStore::GarbageCollect()

DEL

-36

pw::kvs::KeyValueStore::Repair()

DEL

-36

pw::kvs::internal::Entry::Tombstone()

DEL

-36

pw::kvs::internal::Entry::Valid()

DEL

-36

pw::kvs::internal::Sectors::NextWritableAddress()

DEL

-34

pw::kvs::KeyValueStore::ValueSize()

DEL

-32

pw::Vector<>::Append()

DEL

-32

pw::kvs::internal::Sectors::FindSpaceDuringGarbageCollection()

DEL

-30

pw::kvs::internal::Sectors::FindSpace()

DEL

-30

pw::kvs::internal::Sectors::WearLeveledSectorFromIndex()

-2

pw::tokenizer::EncodedMessage<>::EncodedMessage()

DEL

-24

pw::kvs::KeyValueStore::FindExisting()

DEL

-22

pw::kvs::internal::Sectors::BaseAddress()

DEL

-20

pw::kvs::internal::EntryMetadata::AddNewAddress()

+6

OUTLINED_FUNCTION_2

DEL

-18

pw::kvs::internal::Entry::size()

+8

OUTLINED_FUNCTION_3

-4

p05.0

+6

OUTLINED_FUNCTION_5

DEL

-14

pw::span<>::front()

DEL

-8

pw::Vector<>::assign()

+8

OUTLINED_FUNCTION_0

+8

OUTLINED_FUNCTION_1

DEL

-6

pw::kvs::KeyValueStore::HeavyMaintenance()

DEL

-4

std::find<>()

NEW

+171

pw::blob_store::BlobStore::BlobWriter::Resume()::_pw_tokenizer_string_entry_658_117

NEW

+164

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_406_71

NEW

+159

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_414_77

NEW

+157

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_49_7

NEW

+155

pw::blob_store::BlobStore::BlobWriter::WriteMetadata()::_pw_tokenizer_string_entry_707_121

NEW

+155

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_54_11

NEW

+154

pw::blob_store::BlobStore::WriteBufferBytesFree()::_pw_tokenizer_string_entry_453_81

NEW

+150

pw::blob_store::BlobStore::BlobWriter::Close()::$_0::operator()()::_pw_tokenizer_string_entry_749_129

NEW

+149

pw::blob_store::BlobStore::BlobWriter::WriteMetadata()::_pw_tokenizer_string_entry_716_125

NEW

+146

pw::blob_store::BlobStore::Erase()::_pw_tokenizer_string_entry_502_83

NEW

+145

pw::blob_store::BlobStore::Flush()::_pw_tokenizer_string_entry_383_61

NEW

+145

pw::blob_store::BlobStore::Flush()::_pw_tokenizer_string_entry_389_63

NEW

+145

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_327_55

NEW

+144

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_404_69

NEW

+143

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_275_49

NEW

+141

pw::blob_store::BlobStore::BlobWriter::WriteMetadata()::_pw_tokenizer_string_entry_708_123

NEW

+139

pw::blob_store::BlobStore::BlobReader::Open()::_pw_tokenizer_string_entry_807_137

NEW

+136

pw::blob_store::BlobStore::LoadMetadata()::_pw_tokenizer_string_entry_94_23

NEW

+134

pw::blob_store::BlobStore::WriteBufferBytesUsed()::_pw_tokenizer_string_entry_447_79

NEW

+133

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_48_5

NEW

+131

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_52_9

NEW

+131

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_68_19

NEW

+129

pw::blob_store::BlobStore::BlobWriter::SetFileName()::_pw_tokenizer_string_entry_603_105

NEW

+129

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_545_91

NEW

+127

pw::blob_store::BlobStore::BlobWriter::Close()::$_0::operator()()::_pw_tokenizer_string_entry_761_131

NEW

+127

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_552_95

NEW

+124

pw::blob_store::BlobStore::Flush()::_pw_tokenizer_string_entry_370_59

NEW

+124

pw::blob_store::BlobStore::Flush()::_pw_tokenizer_string_entry_394_65

NEW

+124

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_409_73

NEW

+124

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_62_15

NEW

+124

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_270_47

NEW

+124

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_292_51

NEW

+124

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_328_57

NEW

+122

pw::blob_store::BlobStore::OpenRead()::_pw_tokenizer_string_entry_222_35

NEW

+122

pw::blob_store::BlobStore::ResumeWrite()::_pw_tokenizer_string_entry_180_31

NEW

+121

pw::blob_store::BlobStore::BlobWriter::GetFileName()::_pw_tokenizer_string_entry_624_109

NEW

+121

pw::blob_store::BlobStore::BlobWriter::SetFileName()::_pw_tokenizer_string_entry_604_107

NEW

+121

pw::blob_store::BlobStore::Erase()::_pw_tokenizer_string_entry_503_85

NEW

+121

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_403_67

NEW

+120

pw::blob_store::BlobStore::Write()::_pw_tokenizer_string_entry_307_53

NEW

+119

pw::blob_store::BlobStore::CloseRead()::_pw_tokenizer_string_entry_233_41

NEW

+118

main::_pw_tokenizer_string_entry_88_13

NEW

+113

pw::blob_store::BlobStore::Erase()::_pw_tokenizer_string_entry_507_87

NEW

+108

pw::blob_store::BlobStore::BlobReader::Open()::_pw_tokenizer_string_entry_800_133

NEW

+108

pw::blob_store::BlobStore::BlobWriter::Open()::_pw_tokenizer_string_entry_644_111

NEW

+106

pw::blob_store::BlobStore::BlobWriter::Open()::_pw_tokenizer_string_entry_646_113

NEW

+103

pw::blob_store::BlobStore::BlobWriter::Resume()::_pw_tokenizer_string_entry_656_115

NEW

+103

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_565_103

NEW

+101

pw::blob_store::BlobStore::BlobWriter::WriteMetadata()::_pw_tokenizer_string_entry_688_119

NEW

+99

main::_pw_tokenizer_string_entry_116_17

NEW

+99

main::_pw_tokenizer_string_entry_119_21

NEW

+97

pw::blob_store::BlobStore::CloseRead()::_pw_tokenizer_string_entry_235_45

NEW

+96

pw::blob_store::BlobStore::OpenRead()::_pw_tokenizer_string_entry_226_39

NEW

+96

pw::blob_store::BlobStore::OpenWrite()::_pw_tokenizer_string_entry_123_27

NEW

+94

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_44_3

NEW

+60

_GLOBAL__sub_I_deferred_write_blob.cc

NEW

+45

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_561_99

NEW

+44

pw::blob_store::BlobStore::BlobReader::DoRead()

NEW

+43

pw::blob_store::BlobStore::BlobReader::DoSeek()

NEW

+41

pw::blob_store::BlobStore::BlobReader::Open()::_pw_tokenizer_string_entry_807_135

NEW

+41

pw::blob_store::BlobStore::BlobWriter::Close()::$_0::operator()()::_pw_tokenizer_string_entry_749_127

NEW

+41

pw::blob_store::BlobStore::CloseRead()::_pw_tokenizer_string_entry_235_43

NEW

+41

pw::blob_store::BlobStore::FlushFinalPartialChunk()::_pw_tokenizer_string_entry_414_75

NEW

+41

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_44_1

NEW

+41

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_62_13

NEW

+41

pw::blob_store::BlobStore::Init()::_pw_tokenizer_string_entry_68_17

NEW

+41

pw::blob_store::BlobStore::LoadMetadata()::_pw_tokenizer_string_entry_94_21

NEW

+41

pw::blob_store::BlobStore::OpenRead()::_pw_tokenizer_string_entry_222_33

NEW

+41

pw::blob_store::BlobStore::OpenRead()::_pw_tokenizer_string_entry_226_37

NEW

+41

pw::blob_store::BlobStore::OpenWrite()::_pw_tokenizer_string_entry_123_25

NEW

+41

pw::blob_store::BlobStore::ResumeWrite()::_pw_tokenizer_string_entry_180_29

NEW

+41

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_545_89

NEW

+41

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_552_93

NEW

+41

pw::blob_store::BlobStore::ValidateChecksum()::_pw_tokenizer_string_entry_565_101

NEW

+37

main::_pw_tokenizer_string_entry_116_15

NEW

+37

main::_pw_tokenizer_string_entry_119_19

NEW

+37

main::_pw_tokenizer_string_entry_88_11

NEW

+36

pw::ByteBuilder::ResizeForAppend()

NEW

+36

pw::blob_store::BlobStore::BlobReader

NEW

+36

pw::blob_store::BlobStore::BlobWriter

NEW

+36

pw::blob_store::BlobStore::DeferredWriter

NEW

+34

pw::ByteBuilder::append()

NEW

+32

pw::ByteBuilder::WriteInOrder<>()

NEW

+16

pw::blob_store::BlobStore::BlobReader::~BlobReader()

+3,792

Note

The documentation for this module is currently incomplete.