31 #if !defined (WINDOWS) 45 #define VOLATILE_ACCESS(v,t) (*((t volatile *) &(v))) 50 typedef void *(*LF_ENTRY_ALLOC_FUNC) ();
59 #define LF_EM_NOT_USING_MUTEX 0 60 #define LF_EM_USING_MUTEX 1 109 #define LF_ENTRY_DESCRIPTOR_INITIALIZER { 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, \ 110 NULL, NULL, NULL, NULL, NULL} 115 #define LF_NULL_TRANSACTION_ID ULONG_MAX 143 #if defined (UNITTEST_LF) 145 pthread_mutex_t *locked_mutex;
146 int locked_mutex_line;
150 #define LF_TRAN_ENTRY_INITIALIZER { 0, LF_NULL_TRANSACTION_ID, NULL, NULL, NULL, -1, false } 179 #define LF_TRAN_SYSTEM_INITIALIZER \ 180 { NULL, 0, {}, 0, 0, 100, 0, NULL } 182 #define LF_TRAN_CLEANUP_NECESSARY(e) ((e)->tran_system->min_active_transaction_id > (e)->last_cleanup_id) 197 #define lf_tran_start_with_mb(entry, incr) lf_tran_start (entry, incr); MEMORY_BARRIER () 198 #define lf_tran_end_with_mb(entry) MEMORY_BARRIER (); lf_tran_end (entry) 248 #define LF_FREELIST_INITIALIZER \ 249 { NULL, 0, 0, 0, 0, NULL, NULL } 269 #define LF_LIST_BF_NONE 0x0 272 #define LF_LIST_BF_RETURN_ON_RESTART ((int) 0x01) 273 #define LF_LIST_BF_RESTART_ON_DUPLICATE ((int) 0x02) 274 #define LF_LIST_BF_INSERT_GIVEN ((int) 0x04) 275 #define LF_LIST_BF_FIND_OR_INSERT ((int) 0x08) 276 #define LF_LIST_BF_LOCK_ON_DELETE ((int) 0x10) 277 #define LF_LIST_BF_IS_FLAG_SET(bf, flag) ((*(bf) & (flag)) != 0) 278 #define LF_LIST_BF_SET_FLAG(bf, flag) (*(bf) = *(bf) | (flag)) 281 #define LF_LIST_BR_RESTARTED ((int) 0x100) 282 #define LF_LIST_BR_DUPLICATE ((int) 0x200) 283 #define LF_LIST_BR_IS_FLAG_SET(br, flag) ((*(br) & (flag))) 284 #define LF_LIST_BR_SET_FLAG(br, flag) (*(br) = *(br) | (flag)) 317 #define LF_HASH_TABLE_INITIALIZER \ 318 { NULL, NULL, PTHREAD_MUTEX_INITIALIZER, 0, NULL, NULL } 356 #if defined (UNITTEST_LF) 357 extern void lf_reset_counters (
void);
362 template <
class Key,
class T>
370 void init (
lf_tran_system &transys,
int hash_size,
int freelist_block_count,
int freelist_block_size,
375 bool find_or_insert (
lf_tran_entry *t_entry, Key &key, T *&t);
391 size_t get_size ()
const;
392 size_t get_element_count ()
const;
398 pthread_mutex_t *get_pthread_mutex (T *t);
399 template <
typename F>
400 bool generic_insert (F &ins_func,
lf_tran_entry *t_entry, Key &key, T *&t);
406 template <
class Key,
class T>
429 template <
class Key,
class T>
436 template <
class Key,
class T>
453 template <
class Key,
class T>
461 template <
class Key,
class T>
469 template <
class Key,
class T>
481 template <
class Key,
class T>
482 template <
typename F>
487 if (ins_func (t_entry, &
m_hash, &key, reinterpret_cast<void **> (&t), &inserted) !=
NO_ERROR)
491 return inserted != 0;
494 template <
class Key,
class T>
501 template <
class Key,
class T>
508 template <
class Key,
class T>
515 template <
class Key,
class T>
527 template <
class Key,
class T>
544 template <
class Key,
class T>
560 template <
class Key,
class T>
567 template <
class Key,
class T>
574 template <
class Key,
class T>
582 template <
class Key,
class T>
589 template <
class Key,
class T>
596 template <
class Key,
class T>
604 template <
class Key,
class T>
610 if (alloc_count > unused_count)
612 return static_cast<size_t> (alloc_count - unused_count);
620 template <
class Key,
class T>
627 template <
class Key,
class T>
638 template <
class Key,
class T>
646 template <
class Key,
class T>
651 template <
class Key,
class T>
658 template <
class Key,
class T>
int lf_callback_vpid_compare(void *vpid_1, void *vpid_2)
int lf_freelist_init(LF_FREELIST *freelist, int initial_blocks, int block_size, LF_ENTRY_DESCRIPTOR *edesc, LF_TRAN_SYSTEM *tran_system)
T * freelist_claim(lf_tran_entry *t_entry)
void * lf_stack_pop(void **top, LF_ENTRY_DESCRIPTOR *edesc)
LF_TRAN_SYSTEM spage_saving_Ts
int(* LF_ENTRY_KEY_COPY_FUNC)(void *src, void *dest)
int(* LF_ENTRY_FREE_FUNC)(void *)
void lf_tran_destroy_entry(LF_TRAN_ENTRY *entry)
int mati_refresh_interval
#define LF_NULL_TRANSACTION_ID
LF_TRAN_SYSTEM dwb_slots_Ts
void start_tran(lf_tran_entry *t_entry)
unsigned int of_local_next
LF_HASH_TABLE * hash_table
LF_ENTRY_INITIALIZE_FUNC f_init
void end_tran(lf_tran_entry *t_entry)
bool insert(lf_tran_entry *t_entry, Key &key, T *&t)
void unlock(lf_tran_entry *t_entry, T *&t)
UINT64 global_transaction_id
int lf_hash_find_or_insert(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, void **entry, int *inserted)
int(* LF_ENTRY_INITIALIZE_FUNC)(void *)
pthread_mutex_t backbuffer_mutex
#define pthread_mutex_unlock(a)
LF_ENTRY_UNINITIALIZE_FUNC f_uninit
void lf_tran_start(LF_TRAN_ENTRY *entry, bool incr)
bool insert_given(lf_tran_entry *t_entry, Key &key, T *&t)
LF_ENTRY_FREE_FUNC f_free
bool erase_locked(lf_tran_entry *t_entry, Key &key, T *&t)
LF_TRAN_SYSTEM catalog_Ts
LF_TRAN_SYSTEM fpcache_Ts
lf_hash_table_iterator m_iter
void *(* LF_ENTRY_ALLOC_FUNC)()
LF_TRAN_SYSTEM obj_lock_res_Ts
lf_hash_table & get_hash_table()
lf_freelist & get_freelist()
int lf_freelist_transport(LF_TRAN_ENTRY *tran_entry, LF_FREELIST *freelist)
#define lf_tran_end_with_mb(entry)
int lf_io_list_find(void **list_p, void *key, LF_ENTRY_DESCRIPTOR *edesc, void **entry)
int lf_list_find(LF_TRAN_ENTRY *tran, void **list_p, void *key, int *behavior_flags, LF_ENTRY_DESCRIPTOR *edesc, void **entry)
LF_ENTRY_DESCRIPTOR * entry_desc
LF_ENTRY_DESCRIPTOR * entry_desc
#define LF_HASH_TABLE_INITIALIZER
LF_TRAN_SYSTEM hfid_table_Ts
#define lf_tran_start_with_mb(entry, incr)
unsigned int of_del_tran_id
void init(lf_tran_system &transys, int hash_size, int freelist_block_count, int freelist_block_size, lf_entry_descriptor &edes)
pthread_mutex_t * get_pthread_mutex(T *t)
void lf_freelist_destroy(LF_FREELIST *freelist)
int lf_hash_insert_given(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, void **entry, int *inserted)
bool generic_insert(F &ins_func, lf_tran_entry *t_entry, Key &key, T *&t)
int lf_hash_find(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, void **entry)
UINT64 min_active_transaction_id
LF_ENTRY_KEY_COPY_FUNC f_key_copy
LF_TRAN_SYSTEM * tran_system
int lf_hash_delete(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, int *success)
LF_ENTRY_KEY_COMPARE_FUNC f_key_cmp
T * find(lf_tran_entry *t_entry, Key &key)
int(* LF_ENTRY_DUPLICATE_KEY_HANDLER)(void *key, void *existing)
int(* LF_ENTRY_UNINITIALIZE_FUNC)(void *)
int lf_io_list_find_or_insert(void **list_p, void *new_entry, LF_ENTRY_DESCRIPTOR *edesc, void **entry)
int lf_hash_insert(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, void **entry, int *inserted)
void * lf_freelist_claim(LF_TRAN_ENTRY *tran_entry, LF_FREELIST *freelist)
LF_TRAN_ENTRY * lf_tran_request_entry(LF_TRAN_SYSTEM *sys)
unsigned int(* LF_ENTRY_HASH_FUNC)(void *key, int htsize)
LF_TRAN_SYSTEM free_sort_list_Ts
LF_TRAN_SYSTEM sessions_Ts
int lf_callback_vpid_copy(void *src, void *dest)
int(* LF_ENTRY_KEY_COMPARE_FUNC)(void *key1, void *key2)
LF_ENTRY_DUPLICATE_KEY_HANDLER f_duplicate
void freelist_retire(lf_tran_entry *t_entry, T *&t)
int lf_initialize_transaction_systems(int max_threads)
void lf_tran_system_destroy(LF_TRAN_SYSTEM *sys)
#define LF_FREELIST_INITIALIZER
void lf_tran_return_entry(LF_TRAN_ENTRY *entry)
LF_ENTRY_HASH_FUNC f_hash
void lf_hash_destroy(LF_HASH_TABLE *table)
void clear(lf_tran_entry *t_entry)
int lf_stack_push(void **top, void *entry, LF_ENTRY_DESCRIPTOR *edesc)
LF_ENTRY_ALLOC_FUNC f_alloc
void lf_tran_compute_minimum_transaction_id(LF_TRAN_SYSTEM *sys)
bool find_or_insert(lf_tran_entry *t_entry, Key &key, T *&t)
LF_ENTRY_DESCRIPTOR * entry_desc
void lf_destroy_transaction_systems(void)
void lf_tran_end(LF_TRAN_ENTRY *entry)
int lf_hash_delete_already_locked(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, void *locked_entry, int *success)
LF_TRAN_SYSTEM global_unique_stats_Ts
void lf_hash_create_iterator(LF_HASH_TABLE_ITERATOR *iterator, LF_TRAN_ENTRY *tran_entry, LF_HASH_TABLE *table)
int lf_tran_system_init(LF_TRAN_SYSTEM *sys, int max_threads)
int lf_hash_init(LF_HASH_TABLE *table, LF_FREELIST *freelist, unsigned int hash_size, LF_ENTRY_DESCRIPTOR *edesc)
LF_TRAN_SYSTEM obj_lock_ent_Ts
LF_TRAN_ENTRY * tran_entry
int lf_list_delete(LF_TRAN_ENTRY *tran, void **list_p, void *key, void *locked_entry, int *behavior_flags, LF_ENTRY_DESCRIPTOR *edesc, LF_FREELIST *freelist, int *success)
size_t get_element_count() const
bool erase(lf_tran_entry *t_entry, Key &key)
LF_TRAN_SYSTEM * tran_system
int lf_freelist_retire(LF_TRAN_ENTRY *tran_entry, LF_FREELIST *freelist, void *entry)
unsigned int lf_callback_vpid_hash(void *vpid, int htsize)
void * lf_hash_iterate(LF_HASH_TABLE_ITERATOR *it)
void lf_hash_clear(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table)
void clear(cub_regex_object *®ex, char *&pattern)