void TimeTable::release(uint64_t thd_id, uint64_t key) { uint64_t idx = hash(key); uint64_t mtx_wait_starttime = get_sys_clock(); pthread_mutex_lock(&table[idx].mtx); INC_STATS(thd_id,mtx[35],get_sys_clock() - mtx_wait_starttime); TimeTableEntry* entry = find(key); if(entry) { LIST_REMOVE_HT(entry,table[idx].head,table[idx].tail); DEBUG_M("TimeTable::release entry free\n"); mem_allocator.free(entry,sizeof(TimeTableEntry)); } pthread_mutex_unlock(&table[idx].mtx); }
void TxnTable::release_transaction_manager(uint64_t thd_id, uint64_t txn_id, uint64_t batch_id){ uint64_t starttime = get_sys_clock(); uint64_t pool_id = txn_id % pool_size; uint64_t mtx_starttime = starttime; // set modify bit for this pool: txn_id % pool_size while(!ATOM_CAS(pool[pool_id]->modify,false,true)) { }; INC_STATS(thd_id,mtx[8],get_sys_clock()-mtx_starttime); txn_node_t t_node = pool[pool_id]->head; #if CC_ALG == MVCC uint64_t min_ts = UINT64_MAX; txn_node_t saved_t_node = NULL; #endif uint64_t prof_starttime = get_sys_clock(); while (t_node != NULL) { if(is_matching_txn_node(t_node,txn_id,batch_id)) { LIST_REMOVE_HT(t_node,pool[txn_id % pool_size]->head,pool[txn_id % pool_size]->tail); --pool[pool_id]->cnt; #if CC_ALG == MVCC saved_t_node = t_node; t_node = t_node->next; continue; #else break; #endif } #if CC_ALG == MVCC if(t_node->txn_man->get_timestamp() < min_ts) min_ts = t_node->txn_man->get_timestamp(); #endif t_node = t_node->next; } INC_STATS(thd_id,mtx[25],get_sys_clock()-prof_starttime); prof_starttime = get_sys_clock(); #if CC_ALG == MVCC t_node = saved_t_node; pool[pool_id]->min_ts = min_ts; #endif // unset modify bit for this pool: txn_id % pool_size ATOM_CAS(pool[pool_id]->modify,true,false); prof_starttime = get_sys_clock(); assert(t_node); assert(t_node->txn_man); txn_man_pool.put(thd_id,t_node->txn_man); INC_STATS(thd_id,mtx[26],get_sys_clock()-prof_starttime); prof_starttime = get_sys_clock(); txn_table_pool.put(thd_id,t_node); INC_STATS(thd_id,mtx[27],get_sys_clock()-prof_starttime); INC_STATS(thd_id,txn_table_release_time,get_sys_clock() - starttime); INC_STATS(thd_id,txn_table_release_cnt,1); }