16 return MurmurHash2(&value,
sizeof(value), 0x07387a4f);
24 assert(list && (list->size() > 0));
26 unsigned idx_high = list->size() - 1;
27 unsigned chunk_idx = idx_high / 2;
28 while (idx_low < idx_high) {
29 if (static_cast<uint64_t>(list->AtPtr(chunk_idx)->offset()) > off) {
31 idx_high = chunk_idx - 1;
33 if ((chunk_idx == list->size() - 1)
34 || (static_cast<uint64_t>(list->AtPtr(chunk_idx + 1)->offset())
38 idx_low = chunk_idx + 1;
40 chunk_idx = idx_low + (idx_high - idx_low) / 2;
54 for (
unsigned i = 0; i < list->size(); ++i) {
68 lock =
reinterpret_cast<pthread_mutex_t *
>(smalloc(
sizeof(pthread_mutex_t)));
69 int retval = pthread_mutex_init(lock, NULL);
72 for (
unsigned i = 0; i < kNumHandleLocks; ++i) {
73 pthread_mutex_t *m =
reinterpret_cast<pthread_mutex_t *
>(
74 smalloc(
sizeof(pthread_mutex_t)));
75 int retval = pthread_mutex_init(m, NULL);
77 handle_locks.PushBack(m);
99 pthread_mutex_destroy(lock);
101 for (
unsigned i = 0; i < kNumHandleLocks; ++i) {
102 pthread_mutex_destroy(handle_locks.At(i));
103 free(handle_locks.At(i));
120 handle2uniqino.Clear();
122 inode2chunks.Clear();
123 inode2references.Clear();
141 const double bucket =
static_cast<double>(hash)
142 * static_cast<double>(kNumHandleLocks)
143 /
static_cast<double>((uint32_t)(-1));
144 return handle_locks.At((uint32_t)bucket % kNumHandleLocks);
152 lock_ =
reinterpret_cast<pthread_mutex_t *
>(smalloc(
sizeof(pthread_mutex_t)));
153 int retval = pthread_mutex_init(lock_, NULL);
159 for (
unsigned i = 0; i < fd_table_.size(); ++i) {
160 delete fd_table_[i].chunk_reflist.list;
162 pthread_mutex_destroy(lock_);
174 for (; i < fd_table_.size(); ++i) {
175 if (fd_table_[i].chunk_reflist.list == NULL) {
176 fd_table_[i] = new_entry;
181 fd_table_.push_back(new_entry);
192 unsigned idx =
static_cast<unsigned>(fd);
194 if (idx < fd_table_.size())
195 result = fd_table_[idx];
206 unsigned idx =
static_cast<unsigned>(fd);
207 if (idx >= fd_table_.size()) {
212 delete fd_table_[idx].chunk_reflist.list;
213 fd_table_[idx].chunk_reflist.list = NULL;
214 fd_table_[idx].chunk_reflist.path.Assign(
"", 0);
215 delete fd_table_[idx].chunk_fd;
216 fd_table_[idx].chunk_fd = NULL;
217 while (!fd_table_.empty() && (fd_table_.back().chunk_reflist.list == NULL)) {
218 fd_table_.pop_back();
struct cvmcache_context * ctx
FileChunkReflist chunk_reflist
SmallHashDynamic< uint64_t, uint64_t > handle2uniqino
assert((mem||(size==0))&&"Out Of Memory")
static uint32_t hasher_uint64t(const uint64_t &value)
SmallHashDynamic< uint64_t, ChunkFd > handle2fd
void Init(ContextPtr context)
pthread_mutex_t * Handle2Lock(const uint64_t handle) const
unsigned FindChunkIdx(const uint64_t offset)
void Final(ContextPtr context, Any *any_digest)
SmallHashDynamic< uint64_t, uint32_t > inode2references
ChunkTables & operator=(const ChunkTables &other)
int Add(FileChunkReflist chunks)
void Update(const unsigned char *buffer, const unsigned buffer_length, ContextPtr context)
shash::Any HashChunkList()
void CopyFrom(const ChunkTables &other)
const unsigned kDigestSizes[]
SmallHashDynamic< uint64_t, FileChunkReflist > inode2chunks
uint32_t MurmurHash2(const void *key, int len, uint32_t seed)