struct file_buffer *cache_lookup(struct cache *cache, long long index) { /* Lookup block in the cache, if found return with usage count * incremented, if not found return NULL */ int hash = CALCULATE_CACHE_HASH(index); struct file_buffer *entry; pthread_cleanup_push((void *) pthread_mutex_unlock, &cache->mutex); pthread_mutex_lock(&cache->mutex); for(entry = cache->hash_table[hash]; entry; entry = entry->hash_next) if(entry->index == index) break; if(entry) { /* found the block in the cache, increment used count and * if necessary remove from free list so it won't disappear */ if(entry->used == 0) { remove_free_list(&cache->free_list, entry); cache->used ++; } entry->used ++; } pthread_cleanup_pop(1); return entry; }
Ndb* NdbPool::get_hint_ndb(Uint32 hint_id, Uint32 hash_entry) { Ndb* ret_ndb = NULL; do { if ((hint_id != 0) && (hint_id <= m_max_ndb_objects) && (m_pool_reference[hint_id].in_use) && (m_pool_reference[hint_id].free_entry)) { ret_ndb = m_pool_reference[hint_id].ndb_reference; if (ret_ndb != NULL) { break; } else { assert(false); } } return NULL; } while (1); /* This is where we remove the entry from the free list and from the db hash table. */ remove_free_list(hint_id); remove_db_hash(hint_id, hash_entry); return ret_ndb; }
static struct file_buffer *cache_freelist(struct cache *cache) { struct file_buffer *entry = cache->free_list; remove_free_list(&cache->free_list, entry); /* a block on the free_list is hashed */ remove_cache_hash_table(cache, entry); cache->used ++; return entry; }