CUBRID Engine  latest
lock_free.h
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 /*
20  * lock_free.h : Lock-free structures interface.
21  */
22 
23 #ifndef _LOCK_FREE_H_
24 #define _LOCK_FREE_H_
25 
26 #include "dbtype_def.h"
27 #include "lockfree_bitmap.hpp"
28 #include "porting.h"
29 
30 #include <cassert>
31 #if !defined (WINDOWS)
32 #include <pthread.h>
33 #endif
34 
35 /*
36  * Some common hash, copy and compare functions
37  */
38 extern unsigned int lf_callback_vpid_hash (void *vpid, int htsize);
39 extern int lf_callback_vpid_compare (void *vpid_1, void *vpid_2);
40 extern int lf_callback_vpid_copy (void *src, void *dest);
41 
42 /*
43  * Volatile access to a variable
44  */
45 #define VOLATILE_ACCESS(v,t) (*((t volatile *) &(v)))
46 
47 /*
48  * Entry descriptor
49  */
50 typedef void *(*LF_ENTRY_ALLOC_FUNC) ();
51 typedef int (*LF_ENTRY_FREE_FUNC) (void *);
52 typedef int (*LF_ENTRY_INITIALIZE_FUNC) (void *);
53 typedef int (*LF_ENTRY_UNINITIALIZE_FUNC) (void *);
54 typedef int (*LF_ENTRY_KEY_COPY_FUNC) (void *src, void *dest);
55 typedef int (*LF_ENTRY_KEY_COMPARE_FUNC) (void *key1, void *key2);
56 typedef unsigned int (*LF_ENTRY_HASH_FUNC) (void *key, int htsize);
57 typedef int (*LF_ENTRY_DUPLICATE_KEY_HANDLER) (void *key, void *existing);
58 
59 #define LF_EM_NOT_USING_MUTEX 0
60 #define LF_EM_USING_MUTEX 1
61 
64 {
65  /* offset of "next" pointer used in local lists */
66  unsigned int of_local_next;
67 
68  /* offset of "next" pointer */
69  unsigned int of_next;
70 
71  /* offset of transaction id of delete operation */
72  unsigned int of_del_tran_id;
73 
74  /* offset of key */
75  unsigned int of_key;
76 
77  /* offset of entry mutex */
78  unsigned int of_mutex;
79 
80  /* does entry have mutex */
82 
83  /* allocation callback */
85 
86  /* deallocation callback */
88 
89  /* initialization callback; can be NULL */
91 
92  /* uninitialization callback; can be NULL */
94 
95  /* copy function for keys */
97 
98  /* compare function for keys */
100 
101  /* hash function for keys */
103 
104  /* callback for lf_insert with existing key */
105  /* NOTE: when NULL, lf_insert will spin until existing entry is deleted */
107 };
108 
109 #define LF_ENTRY_DESCRIPTOR_INITIALIZER { 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, \
110  NULL, NULL, NULL, NULL, NULL}
111 
112 /*
113  * Lock free transaction based memory garbage collector
114  */
115 #define LF_NULL_TRANSACTION_ID ULONG_MAX
116 
119 
121 {
122  /* last ID for which a cleanup of retired_list was performed */
124 
125  /* id of current transaction */
127 
128  /* list of retired node for attached thread */
130 
131  /* temp entry - for find_and_insert operations, to avoid unnecessary ops */
132  void *temp_entry;
133 
134  /* attached transaction system */
136 
137  /* entry in transaction system */
139 
140  /* Was transaction ID incremented? */
141  bool did_incr;
142 
143 #if defined (UNITTEST_LF)
144  /* Debug */
145  pthread_mutex_t *locked_mutex;
146  int locked_mutex_line;
147 #endif /* UNITTEST_LF */
148 };
149 
150 #define LF_TRAN_ENTRY_INITIALIZER { 0, LF_NULL_TRANSACTION_ID, NULL, NULL, NULL, -1, false }
151 
153 {
154  /* pointer array to thread dtran entries */
156 
157  /* capacity */
159 
160  /* lock-free bitmap */
162 
163  /* global delete ID for all delete operations */
165 
166  /* minimum curr_delete_id of all used LF_DTRAN_ENTRY entries */
168 
169  /* number of transactions between computing min_active_transaction_id */
171 
172  /* current used count */
174 
175  /* entry descriptor */
177 };
178 
179 #define LF_TRAN_SYSTEM_INITIALIZER \
180  { NULL, 0, {}, 0, 0, 100, 0, NULL }
181 
182 #define LF_TRAN_CLEANUP_NECESSARY(e) ((e)->tran_system->min_active_transaction_id > (e)->last_cleanup_id)
183 
184 extern int lf_tran_system_init (LF_TRAN_SYSTEM * sys, int max_threads);
185 extern void lf_tran_system_destroy (LF_TRAN_SYSTEM * sys);
186 
188 extern void lf_tran_return_entry (LF_TRAN_ENTRY * entry);
189 extern void lf_tran_destroy_entry (LF_TRAN_ENTRY * entry);
191 
192 extern void lf_tran_start (LF_TRAN_ENTRY * entry, bool incr);
193 extern void lf_tran_end (LF_TRAN_ENTRY * entry);
194 /* TODO: Investigate memory barriers. First of all, I need to check if it breaks the inlining of lf_tran_start and
195  * lf_tran_end functions. Second of all, full memory barriers might not be necessary.
196  */
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)
199 
200 /*
201  * Global lock free transaction system declarations
202  */
214 
215 extern int lf_initialize_transaction_systems (int max_threads);
216 extern void lf_destroy_transaction_systems (void);
217 
218 /*
219  * Lock free stack
220  */
221 extern int lf_stack_push (void **top, void *entry, LF_ENTRY_DESCRIPTOR * edesc);
222 extern void *lf_stack_pop (void **top, LF_ENTRY_DESCRIPTOR * edesc);
223 
224 /*
225  * Lock free freelist
226  */
227 typedef struct lf_freelist LF_FREELIST;
229 {
230  /* available stack (i.e. entries that can be safely reclaimed) */
231  void *available;
232 
233  /* allocation block size */
235 
236  /* entry counters */
240 
241  /* entry descriptor */
243 
244  /* transaction system */
246 };
247 
248 #define LF_FREELIST_INITIALIZER \
249  { NULL, 0, 0, 0, 0, NULL, NULL }
250 
251 extern int lf_freelist_init (LF_FREELIST * freelist, int initial_blocks, int block_size, LF_ENTRY_DESCRIPTOR * edesc,
252  LF_TRAN_SYSTEM * tran_system);
253 extern void lf_freelist_destroy (LF_FREELIST * freelist);
254 
255 extern void *lf_freelist_claim (LF_TRAN_ENTRY * tran_entry, LF_FREELIST * freelist);
256 extern int lf_freelist_retire (LF_TRAN_ENTRY * tran_entry, LF_FREELIST * freelist, void *entry);
257 extern int lf_freelist_transport (LF_TRAN_ENTRY * tran_entry, LF_FREELIST * freelist);
258 
259 /*
260  * Lock free insert-only list based dictionary
261  * NOTE: This list does not use a LF_TRAN_SYSTEM nor a LF_FREELIST.
262  */
263 extern int lf_io_list_find (void **list_p, void *key, LF_ENTRY_DESCRIPTOR * edesc, void **entry);
264 extern int lf_io_list_find_or_insert (void **list_p, void *new_entry, LF_ENTRY_DESCRIPTOR * edesc, void **entry);
265 
266 /*
267  * Lock free linked list based dictionary
268  */
269 #define LF_LIST_BF_NONE 0x0
270 
271 /* flags that can be given to lf_list_* functions */
272 #define LF_LIST_BF_RETURN_ON_RESTART ((int) 0x01)
273 #define LF_LIST_BF_RESTART_ON_DUPLICATE ((int) 0x02) /* Not used for now. */
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))
279 
280 /* responses to flags from lf_list_* functions */
281 #define LF_LIST_BR_RESTARTED ((int) 0x100)
282 #define LF_LIST_BR_DUPLICATE ((int) 0x200) /* Not used for now. */
283 #define LF_LIST_BR_IS_FLAG_SET(br, flag) ((*(br) & (flag)))
284 #define LF_LIST_BR_SET_FLAG(br, flag) (*(br) = *(br) | (flag))
285 
286 extern int lf_list_find (LF_TRAN_ENTRY * tran, void **list_p, void *key, int *behavior_flags,
287  LF_ENTRY_DESCRIPTOR * edesc, void **entry);
288 extern int lf_list_delete (LF_TRAN_ENTRY * tran, void **list_p, void *key, void *locked_entry, int *behavior_flags,
289  LF_ENTRY_DESCRIPTOR * edesc, LF_FREELIST * freelist, int *success);
290 /* TODO: Add lf_list_insert functions. So far, they are only used for lf_hash_insert. */
291 
292 /*
293  * Lock free hash table
294  */
297 {
298  /* table buckets */
299  void **buckets;
300 
301  /* backbuffer */
302  void **backbuffer;
303 
304  /* backbuffer mutex */
305  pthread_mutex_t backbuffer_mutex;
306 
307  /* size of hash table */
308  unsigned int hash_size;
309 
310  /* freelist for memory reuse */
312 
313  /* entry descriptor */
315 };
316 
317 #define LF_HASH_TABLE_INITIALIZER \
318  { NULL, NULL, PTHREAD_MUTEX_INITIALIZER, 0, NULL, NULL }
319 
320 extern int lf_hash_init (LF_HASH_TABLE * table, LF_FREELIST * freelist, unsigned int hash_size,
321  LF_ENTRY_DESCRIPTOR * edesc);
322 extern void lf_hash_destroy (LF_HASH_TABLE * table);
323 
324 extern int lf_hash_find (LF_TRAN_ENTRY * tran, LF_HASH_TABLE * table, void *key, void **entry);
325 extern int lf_hash_find_or_insert (LF_TRAN_ENTRY * tran, LF_HASH_TABLE * table, void *key, void **entry, int *inserted);
326 extern int lf_hash_insert (LF_TRAN_ENTRY * tran, LF_HASH_TABLE * table, void *key, void **entry, int *inserted);
327 extern int lf_hash_insert_given (LF_TRAN_ENTRY * tran, LF_HASH_TABLE * table, void *key, void **entry, int *inserted);
328 extern int lf_hash_delete (LF_TRAN_ENTRY * tran, LF_HASH_TABLE * table, void *key, int *success);
329 extern int lf_hash_delete_already_locked (LF_TRAN_ENTRY * tran, LF_HASH_TABLE * table, void *key, void *locked_entry,
330  int *success);
331 extern void lf_hash_clear (LF_TRAN_ENTRY * tran, LF_HASH_TABLE * table);
332 
333 /*
334  * Lock free hash table iterator
335  */
338 {
339  /* hash table we iterate on */
341 
342  /* current bucket index */
344 
345  /* current entry */
346  void *curr;
347 
348  /* transaction entry to use */
350 };
351 
352 extern void lf_hash_create_iterator (LF_HASH_TABLE_ITERATOR * iterator, LF_TRAN_ENTRY * tran_entry,
353  LF_HASH_TABLE * table);
354 extern void *lf_hash_iterate (LF_HASH_TABLE_ITERATOR * it);
355 
356 #if defined (UNITTEST_LF)
357 extern void lf_reset_counters (void);
358 #endif /* UNITTEST_LF */
359 
360 // C++ style lock-free hash
361 // *INDENT-OFF*
362 template <class Key, class T>
364 {
365  public:
366  class iterator;
367 
369 
370  void init (lf_tran_system &transys, int hash_size, int freelist_block_count, int freelist_block_size,
371  lf_entry_descriptor &edes);
372  void destroy ();
373 
374  T *find (lf_tran_entry *t_entry, Key &key);
375  bool find_or_insert (lf_tran_entry *t_entry, Key &key, T *&t);
376  bool insert (lf_tran_entry *t_entry, Key &key, T *&t);
377  bool insert_given (lf_tran_entry *t_entry, Key &key, T *&t);
378  bool erase (lf_tran_entry *t_entry, Key &key);
379  bool erase_locked (lf_tran_entry *t_entry, Key &key, T *&t);
380 
381  void unlock (lf_tran_entry *t_entry, T *&t);
382 
383  void clear (lf_tran_entry *t_entry);
384 
385  T *freelist_claim (lf_tran_entry *t_entry);
386  void freelist_retire (lf_tran_entry *t_entry, T *&t);
387 
388  void start_tran (lf_tran_entry *t_entry);
389  void end_tran (lf_tran_entry *t_entry);
390 
391  size_t get_size () const;
392  size_t get_element_count () const;
393 
394  lf_hash_table &get_hash_table ();
395  lf_freelist &get_freelist ();
396 
397  private:
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);
401 
404 };
405 
406 template <class Key, class T>
408 {
409  public:
410  iterator () = default;
411  iterator (lf_tran_entry *t_entry, lf_hash_table_cpp & hash);
412  ~iterator ();
413 
414  T *iterate ();
415  void restart ();
416 
417  private:
420 };
421 
422 //
423 // implementation
424 //
425 
426 //
427 // lf_hash_table_cpp
428 //
429 template <class Key, class T>
431  : m_freelist LF_FREELIST_INITIALIZER
433 {
434 }
435 
436 template <class Key, class T>
437 void
438 lf_hash_table_cpp<Key, T>::init (lf_tran_system &transys, int hash_size, int freelist_block_count,
439  int freelist_block_size, lf_entry_descriptor &edesc)
440 {
441  if (lf_freelist_init (&m_freelist, freelist_block_count, freelist_block_size, &edesc, &transys) != NO_ERROR)
442  {
443  assert (false);
444  return;
445  }
446  if (lf_hash_init (&m_hash, &m_freelist, hash_size, &edesc) != NO_ERROR)
447  {
448  assert (false);
449  return;
450  }
451 }
452 
453 template <class Key, class T>
454 void
456 {
459 }
460 
461 template <class Key, class T>
462 pthread_mutex_t *
464 {
466  return (pthread_mutex_t *) (((char *) t) + m_freelist.entry_desc->of_mutex);
467 }
468 
469 template <class Key, class T>
470 T *
472 {
473  T *ret = NULL;
474  if (lf_hash_find (t_entry, &m_hash, &key, (void **) (&ret)) != NO_ERROR)
475  {
476  assert (false);
477  }
478  return ret;
479 }
480 
481 template <class Key, class T>
482 template <typename F>
483 bool
484 lf_hash_table_cpp<Key, T>::generic_insert (F &ins_func, lf_tran_entry *t_entry, Key &key, T *&t)
485 {
486  int inserted = 0;
487  if (ins_func (t_entry, &m_hash, &key, reinterpret_cast<void **> (&t), &inserted) != NO_ERROR)
488  {
489  assert (false);
490  }
491  return inserted != 0;
492 }
493 
494 template <class Key, class T>
495 bool
497 {
498  return generic_insert (lf_hash_find_or_insert, t_entry, key, t);
499 }
500 
501 template <class Key, class T>
502 bool
504 {
505  return generic_insert (lf_hash_insert, t_entry, key, t);
506 }
507 
508 template <class Key, class T>
509 bool
511 {
512  return generic_insert (lf_hash_insert_given, t_entry, key, t);
513 }
514 
515 template <class Key, class T>
516 bool
518 {
519  int success = 0;
520  if (lf_hash_delete (t_entry, &m_hash, &key, &success) != NO_ERROR)
521  {
522  assert (false);
523  }
524  return success != 0;
525 }
526 
527 template <class Key, class T>
528 bool
530 {
531  int success = 0;
532  if (lf_hash_delete_already_locked (t_entry, &m_hash, &key, t, &success) != NO_ERROR)
533  {
534  assert (false);
536  }
537  if (success != 0)
538  {
539  t = NULL;
540  }
541  return success != 0;
542 }
543 
544 template <class Key, class T>
545 void
547 {
548  assert (t != NULL);
550  {
552  }
553  else
554  {
555  lf_tran_end_with_mb (t_entry);
556  }
557  t = NULL;
558 }
559 
560 template <class Key, class T>
561 void
563 {
564  lf_hash_clear (t_entry, &m_hash);
565 }
566 
567 template <class Key, class T>
568 T *
570 {
571  return (T *) lf_freelist_claim (t_entry, &m_freelist);
572 }
573 
574 template <class Key, class T>
575 void
577 {
578  lf_freelist_retire (t_entry, &m_freelist, t);
579  t = NULL;
580 }
581 
582 template <class Key, class T>
583 void
585 {
586  lf_tran_start_with_mb (t_entry, false);
587 }
588 
589 template <class Key, class T>
590 void
592 {
593  lf_tran_end_with_mb (t_entry);
594 }
595 
596 template <class Key, class T>
597 size_t
599 {
600  assert (m_hash.hash_size > 0);
601  return (size_t) m_hash.hash_size;
602 }
603 
604 template <class Key, class T>
605 size_t
607 {
608  int alloc_count = m_freelist.alloc_cnt;
609  int unused_count = m_freelist.available_cnt + m_freelist.retired_cnt;
610  if (alloc_count > unused_count)
611  {
612  return static_cast<size_t> (alloc_count - unused_count);
613  }
614  else
615  {
616  return 0;
617  }
618 }
619 
620 template <class Key, class T>
623 {
624  return m_hash;
625 }
626 
627 template <class Key, class T>
628 lf_freelist &
630 {
631  return m_freelist;
632 }
633 
634 //
635 // lf_hash_table_cpp::iterator
636 //
637 
638 template <class Key, class T>
640  : m_iter ()
641  , m_crt_val (NULL)
642 {
643  lf_hash_create_iterator (&m_iter, t_entry, &hash.m_hash);
644 }
645 
646 template <class Key, class T>
648 {
649 }
650 
651 template <class Key, class T>
652 T *
654 {
655  return static_cast<T *> (lf_hash_iterate (&m_iter));
656 }
657 
658 template <class Key, class T>
659 void
661 {
663  {
665  }
666  m_crt_val = NULL;
667 }
668 
669 // *INDENT-ON*
670 
671 #endif /* _LOCK_FREE_H_ */
int lf_callback_vpid_compare(void *vpid_1, void *vpid_2)
Definition: lock_free.c:154
int lf_freelist_init(LF_FREELIST *freelist, int initial_blocks, int block_size, LF_ENTRY_DESCRIPTOR *edesc, LF_TRAN_SYSTEM *tran_system)
Definition: lock_free.c:666
T * freelist_claim(lf_tran_entry *t_entry)
Definition: lock_free.h:569
void * lf_stack_pop(void **top, LF_ENTRY_DESCRIPTOR *edesc)
Definition: lock_free.c:575
LF_TRAN_SYSTEM spage_saving_Ts
Definition: lock_free.c:46
#define NO_ERROR
Definition: error_code.h:46
int(* LF_ENTRY_KEY_COPY_FUNC)(void *src, void *dest)
Definition: lock_free.h:54
int(* LF_ENTRY_FREE_FUNC)(void *)
Definition: lock_free.h:51
void lf_tran_destroy_entry(LF_TRAN_ENTRY *entry)
Definition: lock_free.c:336
int mati_refresh_interval
Definition: lock_free.h:170
#define LF_NULL_TRANSACTION_ID
Definition: lock_free.h:115
LF_TRAN_SYSTEM dwb_slots_Ts
Definition: lock_free.c:56
size_t get_size() const
Definition: lock_free.h:598
void start_tran(lf_tran_entry *t_entry)
Definition: lock_free.h:584
void * temp_entry
Definition: lock_free.h:132
unsigned int of_local_next
Definition: lock_free.h:66
LF_HASH_TABLE * hash_table
Definition: lock_free.h:340
LF_ENTRY_INITIALIZE_FUNC f_init
Definition: lock_free.h:90
void end_tran(lf_tran_entry *t_entry)
Definition: lock_free.h:591
int retired_cnt
Definition: lock_free.h:239
int available_cnt
Definition: lock_free.h:238
bool insert(lf_tran_entry *t_entry, Key &key, T *&t)
Definition: lock_free.h:503
int alloc_cnt
Definition: lock_free.h:237
void unlock(lf_tran_entry *t_entry, T *&t)
Definition: lock_free.h:546
UINT64 global_transaction_id
Definition: lock_free.h:164
int lf_hash_find_or_insert(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, void **entry, int *inserted)
Definition: lock_free.c:2101
int(* LF_ENTRY_INITIALIZE_FUNC)(void *)
Definition: lock_free.h:52
pthread_mutex_t backbuffer_mutex
Definition: lock_free.h:305
#define pthread_mutex_unlock(a)
Definition: area_alloc.c:51
LF_ENTRY_UNINITIALIZE_FUNC f_uninit
Definition: lock_free.h:93
void ** backbuffer
Definition: lock_free.h:302
unsigned int hash_size
Definition: lock_free.h:308
void lf_tran_start(LF_TRAN_ENTRY *entry, bool incr)
Definition: lock_free.c:403
bool insert_given(lf_tran_entry *t_entry, Key &key, T *&t)
Definition: lock_free.h:510
Definition: lock_free.h:63
LF_ENTRY_FREE_FUNC f_free
Definition: lock_free.h:87
bool erase_locked(lf_tran_entry *t_entry, Key &key, T *&t)
Definition: lock_free.h:529
LF_TRAN_SYSTEM catalog_Ts
Definition: lock_free.c:49
Definition: lock_free.h:120
LF_TRAN_SYSTEM fpcache_Ts
Definition: lock_free.c:55
void * retired_list
Definition: lock_free.h:129
lf_hash_table_iterator m_iter
Definition: lock_free.h:418
void *(* LF_ENTRY_ALLOC_FUNC)()
Definition: lock_free.h:50
LF_TRAN_SYSTEM obj_lock_res_Ts
Definition: lock_free.c:47
lf_hash_table & get_hash_table()
Definition: lock_free.h:622
lf_freelist & get_freelist()
Definition: lock_free.h:629
lf_freelist m_freelist
Definition: lock_free.h:402
int lf_freelist_transport(LF_TRAN_ENTRY *tran_entry, LF_FREELIST *freelist)
Definition: lock_free.c:930
UINT64 last_cleanup_id
Definition: lock_free.h:123
#define lf_tran_end_with_mb(entry)
Definition: lock_free.h:198
lf_hash_table m_hash
Definition: lock_free.h:403
int lf_io_list_find(void **list_p, void *key, LF_ENTRY_DESCRIPTOR *edesc, void **entry)
Definition: lock_free.c:1047
int lf_list_find(LF_TRAN_ENTRY *tran, void **list_p, void *key, int *behavior_flags, LF_ENTRY_DESCRIPTOR *edesc, void **entry)
Definition: lock_free.c:1191
LF_ENTRY_DESCRIPTOR * entry_desc
Definition: lock_free.h:314
LF_ENTRY_DESCRIPTOR * entry_desc
Definition: lock_free.h:242
#define LF_HASH_TABLE_INITIALIZER
Definition: lock_free.h:317
LF_TRAN_SYSTEM hfid_table_Ts
Definition: lock_free.c:53
#define lf_tran_start_with_mb(entry, incr)
Definition: lock_free.h:197
unsigned int of_del_tran_id
Definition: lock_free.h:72
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)
Definition: lock_free.h:463
void lf_freelist_destroy(LF_FREELIST *freelist)
Definition: lock_free.c:711
int lf_hash_insert_given(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, void **entry, int *inserted)
Definition: lock_free.c:2134
bool generic_insert(F &ins_func, lf_tran_entry *t_entry, Key &key, T *&t)
Definition: lock_free.h:484
int lf_hash_find(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, void **entry)
Definition: lock_free.c:1987
#define assert(x)
UINT64 min_active_transaction_id
Definition: lock_free.h:167
LF_ENTRY_KEY_COPY_FUNC f_key_copy
Definition: lock_free.h:96
LF_BITMAP lf_bitmap
Definition: lock_free.h:161
LF_TRAN_SYSTEM * tran_system
Definition: lock_free.h:245
int used_entry_count
Definition: lock_free.h:173
int lf_hash_delete(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, int *success)
Definition: lock_free.c:2181
LF_ENTRY_KEY_COMPARE_FUNC f_key_cmp
Definition: lock_free.h:99
unsigned int of_next
Definition: lock_free.h:69
T * find(lf_tran_entry *t_entry, Key &key)
Definition: lock_free.h:471
int(* LF_ENTRY_DUPLICATE_KEY_HANDLER)(void *key, void *existing)
Definition: lock_free.h:57
int(* LF_ENTRY_UNINITIALIZE_FUNC)(void *)
Definition: lock_free.h:53
int lf_io_list_find_or_insert(void **list_p, void *new_entry, LF_ENTRY_DESCRIPTOR *edesc, void **entry)
Definition: lock_free.c:1101
int lf_hash_insert(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, void **entry, int *inserted)
Definition: lock_free.c:2118
void ** buckets
Definition: lock_free.h:299
void * lf_freelist_claim(LF_TRAN_ENTRY *tran_entry, LF_FREELIST *freelist)
Definition: lock_free.c:751
LF_TRAN_ENTRY * lf_tran_request_entry(LF_TRAN_SYSTEM *sys)
Definition: lock_free.c:271
unsigned int(* LF_ENTRY_HASH_FUNC)(void *key, int htsize)
Definition: lock_free.h:56
#define NULL
Definition: freelistheap.h:34
LF_TRAN_SYSTEM free_sort_list_Ts
Definition: lock_free.c:51
LF_TRAN_SYSTEM sessions_Ts
Definition: lock_free.c:50
int lf_callback_vpid_copy(void *src, void *dest)
Definition: lock_free.c:169
static int success()
unsigned int of_mutex
Definition: lock_free.h:78
int(* LF_ENTRY_KEY_COMPARE_FUNC)(void *key1, void *key2)
Definition: lock_free.h:55
LF_ENTRY_DUPLICATE_KEY_HANDLER f_duplicate
Definition: lock_free.h:106
LF_TRAN_SYSTEM xcache_Ts
Definition: lock_free.c:54
void freelist_retire(lf_tran_entry *t_entry, T *&t)
Definition: lock_free.h:576
int using_mutex
Definition: lock_free.h:81
int lf_initialize_transaction_systems(int max_threads)
Definition: lock_free.c:448
void lf_tran_system_destroy(LF_TRAN_SYSTEM *sys)
Definition: lock_free.c:240
#define LF_FREELIST_INITIALIZER
Definition: lock_free.h:248
void lf_tran_return_entry(LF_TRAN_ENTRY *entry)
Definition: lock_free.c:310
LF_ENTRY_HASH_FUNC f_hash
Definition: lock_free.h:102
void lf_hash_destroy(LF_HASH_TABLE *table)
Definition: lock_free.c:1933
void clear(lf_tran_entry *t_entry)
Definition: lock_free.h:562
int lf_stack_push(void **top, void *entry, LF_ENTRY_DESCRIPTOR *edesc)
Definition: lock_free.c:545
LF_ENTRY_ALLOC_FUNC f_alloc
Definition: lock_free.h:84
void lf_tran_compute_minimum_transaction_id(LF_TRAN_SYSTEM *sys)
Definition: lock_free.c:369
bool find_or_insert(lf_tran_entry *t_entry, Key &key, T *&t)
Definition: lock_free.h:496
LF_ENTRY_DESCRIPTOR * entry_desc
Definition: lock_free.h:176
void lf_destroy_transaction_systems(void)
Definition: lock_free.c:520
void lf_tran_end(LF_TRAN_ENTRY *entry)
Definition: lock_free.c:436
int lf_hash_delete_already_locked(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table, void *key, void *locked_entry, int *success)
Definition: lock_free.c:2164
LF_FREELIST * freelist
Definition: lock_free.h:311
LF_TRAN_SYSTEM global_unique_stats_Ts
Definition: lock_free.c:52
void lf_hash_create_iterator(LF_HASH_TABLE_ITERATOR *iterator, LF_TRAN_ENTRY *tran_entry, LF_HASH_TABLE *table)
Definition: lock_free.c:2368
int lf_tran_system_init(LF_TRAN_SYSTEM *sys, int max_threads)
Definition: lock_free.c:184
int lf_hash_init(LF_HASH_TABLE *table, LF_FREELIST *freelist, unsigned int hash_size, LF_ENTRY_DESCRIPTOR *edesc)
Definition: lock_free.c:1873
LF_TRAN_SYSTEM obj_lock_ent_Ts
Definition: lock_free.c:48
LF_TRAN_ENTRY * tran_entry
Definition: lock_free.h:349
int entry_idx
Definition: lock_free.h:138
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)
Definition: lock_free.c:1634
size_t get_element_count() const
Definition: lock_free.h:606
int block_size
Definition: lock_free.h:234
bool erase(lf_tran_entry *t_entry, Key &key)
Definition: lock_free.h:517
LF_TRAN_SYSTEM * tran_system
Definition: lock_free.h:135
LF_TRAN_ENTRY * entries
Definition: lock_free.h:155
UINT64 transaction_id
Definition: lock_free.h:126
int lf_freelist_retire(LF_TRAN_ENTRY *tran_entry, LF_FREELIST *freelist, void *entry)
Definition: lock_free.c:864
unsigned int lf_callback_vpid_hash(void *vpid, int htsize)
Definition: lock_free.c:140
void * lf_hash_iterate(LF_HASH_TABLE_ITERATOR *it)
Definition: lock_free.c:2388
bool did_incr
Definition: lock_free.h:141
void lf_hash_clear(LF_TRAN_ENTRY *tran, LF_HASH_TABLE *table)
Definition: lock_free.c:2246
void * available
Definition: lock_free.h:231
unsigned int of_key
Definition: lock_free.h:75
void clear(cub_regex_object *&regex, char *&pattern)