leveldb
Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
leveldb::anonymous_namespace{memenv.cc}::FileState Class Reference

Public Member Functions

 FileState ()
 
void Ref ()
 
void Unref ()
 
uint64_t Size () const
 
Status Read (uint64_t offset, size_t n, Slice *result, char *scratch) const
 
Status Append (const Slice &data)
 

Private Types

enum  { kBlockSize = 8 * 1024 }
 

Private Member Functions

 ~FileState ()
 
 FileState (const FileState &)
 
void operator= (const FileState &)
 

Private Attributes

port::Mutex refs_mutex_
 
int refs_
 
std::vector< char * > blocks_
 
uint64_t size_
 

Detailed Description

Definition at line 20 of file memenv.cc.

Member Enumeration Documentation

§ anonymous enum

anonymous enum
private
Enumerator
kBlockSize 

Definition at line 146 of file memenv.cc.

Constructor & Destructor Documentation

§ FileState() [1/2]

leveldb::anonymous_namespace{memenv.cc}::FileState::FileState ( )
inline

§ ~FileState()

leveldb::anonymous_namespace{memenv.cc}::FileState::~FileState ( )
inlineprivate

Definition at line 126 of file memenv.cc.

126  {
127  for (std::vector<char*>::iterator i = blocks_.begin(); i != blocks_.end();
128  ++i) {
129  delete [] *i;
130  }
131  }

§ FileState() [2/2]

leveldb::anonymous_namespace{memenv.cc}::FileState::FileState ( const FileState )
private

Member Function Documentation

§ Append()

Status leveldb::anonymous_namespace{memenv.cc}::FileState::Append ( const Slice data)
inline

Definition at line 95 of file memenv.cc.

95  {
96  const char* src = data.data();
97  size_t src_len = data.size();
98 
99  while (src_len > 0) {
100  size_t avail;
101  size_t offset = size_ % kBlockSize;
102 
103  if (offset != 0) {
104  // There is some room in the last block.
105  avail = kBlockSize - offset;
106  } else {
107  // No room in the last block; push new one.
108  blocks_.push_back(new char[kBlockSize]);
109  avail = kBlockSize;
110  }
111 
112  if (avail > src_len) {
113  avail = src_len;
114  }
115  memcpy(blocks_.back() + offset, src, avail);
116  src_len -= avail;
117  src += avail;
118  size_ += avail;
119  }
120 
121  return Status::OK();
122  }
static Status OK()
Definition: status.h:32
Here is the call graph for this function:

§ operator=()

void leveldb::anonymous_namespace{memenv.cc}::FileState::operator= ( const FileState )
private

§ Read()

Status leveldb::anonymous_namespace{memenv.cc}::FileState::Read ( uint64_t  offset,
size_t  n,
Slice result,
char *  scratch 
) const
inline

Definition at line 52 of file memenv.cc.

52  {
53  if (offset > size_) {
54  return Status::IOError("Offset greater than file size.");
55  }
56  const uint64_t available = size_ - offset;
57  if (n > available) {
58  n = static_cast<size_t>(available);
59  }
60  if (n == 0) {
61  *result = Slice();
62  return Status::OK();
63  }
64 
65  assert(offset / kBlockSize <= SIZE_MAX);
66  size_t block = static_cast<size_t>(offset / kBlockSize);
67  size_t block_offset = offset % kBlockSize;
68 
69  if (n <= kBlockSize - block_offset) {
70  // The requested bytes are all in the first block.
71  *result = Slice(blocks_[block] + block_offset, n);
72  return Status::OK();
73  }
74 
75  size_t bytes_to_copy = n;
76  char* dst = scratch;
77 
78  while (bytes_to_copy > 0) {
79  size_t avail = kBlockSize - block_offset;
80  if (avail > bytes_to_copy) {
81  avail = bytes_to_copy;
82  }
83  memcpy(dst, blocks_[block] + block_offset, avail);
84 
85  bytes_to_copy -= avail;
86  dst += avail;
87  block++;
88  block_offset = 0;
89  }
90 
91  *result = Slice(scratch, n);
92  return Status::OK();
93  }
static Status OK()
Definition: status.h:32
static Status IOError(const Slice &msg, const Slice &msg2=Slice())
Definition: status.h:47
Here is the call graph for this function:

§ Ref()

void leveldb::anonymous_namespace{memenv.cc}::FileState::Ref ( )
inline

Definition at line 27 of file memenv.cc.

Here is the caller graph for this function:

§ Size()

uint64_t leveldb::anonymous_namespace{memenv.cc}::FileState::Size ( ) const
inline

Definition at line 50 of file memenv.cc.

§ Unref()

void leveldb::anonymous_namespace{memenv.cc}::FileState::Unref ( )
inline

Definition at line 33 of file memenv.cc.

33  {
34  bool do_delete = false;
35 
36  {
37  MutexLock lock(&refs_mutex_);
38  --refs_;
39  assert(refs_ >= 0);
40  if (refs_ <= 0) {
41  do_delete = true;
42  }
43  }
44 
45  if (do_delete) {
46  delete this;
47  }
48  }

Member Data Documentation

§ blocks_

std::vector<char*> leveldb::anonymous_namespace{memenv.cc}::FileState::blocks_
private

Definition at line 143 of file memenv.cc.

§ refs_

int leveldb::anonymous_namespace{memenv.cc}::FileState::refs_
private

Definition at line 138 of file memenv.cc.

§ refs_mutex_

port::Mutex leveldb::anonymous_namespace{memenv.cc}::FileState::refs_mutex_
private

Definition at line 137 of file memenv.cc.

§ size_

uint64_t leveldb::anonymous_namespace{memenv.cc}::FileState::size_
private

Definition at line 144 of file memenv.cc.


The documentation for this class was generated from the following file: