NVMLib  very early alpha
A library to optimally use a Hybrid RAM setup.
free_slot_list.h File Reference
#include <libpmemobj.h>
Include dependency graph for free_slot_list.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define POBJ_SLIST_HEAD(name, type)
 
#define POBJ_SLIST_ENTRY(type)
 
#define POBJ_SLIST_EMPTY(head)   (TOID_IS_NULL((head)->pe_first))
 
#define POBJ_SLIST_FIRST(head)   ((head)->pe_first)
 
#define POBJ_SLIST_NEXT(elm, field)   (D_RO(elm)->field.pe_next)
 
#define POBJ_SLIST_INIT(head)
 
#define POBJ_SLIST_INSERT_HEAD(head, elm, field)
 
#define POBJ_SLIST_INSERT_AFTER(slistelm, elm, field)
 
#define POBJ_SLIST_REMOVE_HEAD(head, field)
 
#define POBJ_SLIST_REMOVE(head, elm, field)
 
#define POBJ_SLIST_REMOVE_FREE(head, elm, field)
 
#define POBJ_SLIST_FOREACH(var, head, field)
 
#define POBJ_TAILQ_ENTRY(type)
 
#define POBJ_TAILQ_HEAD(name, type)
 
#define POBJ_TAILQ_FIRST(head)   ((head)->pe_first)
 
#define POBJ_TAILQ_LAST(head)   ((head)->pe_last)
 
#define POBJ_TAILQ_EMPTY(head)   (TOID_IS_NULL((head)->pe_first))
 
#define POBJ_TAILQ_NEXT(elm, field)   (D_RO(elm)->field.pe_next)
 
#define POBJ_TAILQ_PREV(elm, field)   (D_RO(elm)->field.pe_prev)
 
#define _POBJ_SWAP_PTR(elm, field)
 
#define POBJ_TAILQ_SWAP_HEAD_TAIL(head, field)
 
#define POBJ_TAILQ_FOREACH(var, head, field)
 
#define POBJ_TAILQ_FOREACH_REVERSE(var, head, field)
 
#define POBJ_TAILQ_INIT(head)
 
#define POBJ_TAILQ_INSERT_HEAD(head, elm, field)
 
#define POBJ_TAILQ_INSERT_TAIL(head, elm, field)
 
#define POBJ_TAILQ_INSERT_AFTER(head, listelm, elm, field)
 
#define POBJ_TAILQ_INSERT_BEFORE(head, listelm, elm, field)
 
#define POBJ_TAILQ_REMOVE(head, elm, field)
 
#define POBJ_TAILQ_REMOVE_FREE(head, elm, field)
 
#define POBJ_TAILQ_MOVE_ELEMENT_HEAD(head, elm, field)
 
#define POBJ_TAILQ_MOVE_ELEMENT_TAIL(head, elm, field)
 

Macro Definition Documentation

◆ _POBJ_SWAP_PTR

#define _POBJ_SWAP_PTR (   elm,
  field 
)
Value:
do {\
TOID_TYPEOF(elm) *elm_ptr = D_RW(elm);\
TX_ADD_DIRECT(&elm_ptr->field);\
__typeof__(elm) temp = elm_ptr->field.pe_prev;\
elm_ptr->field.pe_prev = elm_ptr->field.pe_next;\
elm_ptr->field.pe_next = temp;\
} while (0)

Definition at line 149 of file free_slot_list.h.

◆ POBJ_SLIST_EMPTY

#define POBJ_SLIST_EMPTY (   head)    (TOID_IS_NULL((head)->pe_first))

Definition at line 66 of file free_slot_list.h.

◆ POBJ_SLIST_ENTRY

#define POBJ_SLIST_ENTRY (   type)
Value:
struct {\
TOID(type) pe_next;\
}

Definition at line 58 of file free_slot_list.h.

◆ POBJ_SLIST_FIRST

#define POBJ_SLIST_FIRST (   head)    ((head)->pe_first)

Definition at line 67 of file free_slot_list.h.

◆ POBJ_SLIST_FOREACH

#define POBJ_SLIST_FOREACH (   var,
  head,
  field 
)
Value:
for ((var) = POBJ_SLIST_FIRST(head);\
!TOID_IS_NULL(var);\
var = POBJ_SLIST_NEXT(var, field))

Definition at line 116 of file free_slot_list.h.

◆ POBJ_SLIST_HEAD

#define POBJ_SLIST_HEAD (   name,
  type 
)
Value:
struct name {\
TOID(type) pe_first;\
}

Definition at line 53 of file free_slot_list.h.

◆ POBJ_SLIST_INIT

#define POBJ_SLIST_INIT (   head)
Value:
do {\
TX_ADD_DIRECT(&(head)->pe_first);\
TOID_ASSIGN((head)->pe_first, MEMOID_NULL);\
} while (0)

Definition at line 73 of file free_slot_list.h.

◆ POBJ_SLIST_INSERT_AFTER

#define POBJ_SLIST_INSERT_AFTER (   slistelm,
  elm,
  field 
)
Value:
do {\
TOID_TYPEOF(slistelm) *slistelm_ptr = D_RW(slistelm);\
TOID_TYPEOF(elm) *elm_ptr = D_RW(elm);\
TX_ADD_DIRECT(&elm_ptr->field.pe_next);\
elm_ptr->field.pe_next = slistelm_ptr->field.pe_next;\
TX_ADD_DIRECT(&slistelm_ptr->field.pe_next);\
slistelm_ptr->field.pe_next = elm;\
} while (0)

Definition at line 85 of file free_slot_list.h.

◆ POBJ_SLIST_INSERT_HEAD

#define POBJ_SLIST_INSERT_HEAD (   head,
  elm,
  field 
)
Value:
do {\
TOID_TYPEOF(elm) *elm_ptr = D_RW(elm);\
TX_ADD_DIRECT(&elm_ptr->field.pe_next);\
elm_ptr->field.pe_next = (head)->pe_first;\
TX_SET_DIRECT(head, pe_first, elm);\
} while (0)

Definition at line 78 of file free_slot_list.h.

◆ POBJ_SLIST_NEXT

#define POBJ_SLIST_NEXT (   elm,
  field 
)    (D_RO(elm)->field.pe_next)

Definition at line 68 of file free_slot_list.h.

◆ POBJ_SLIST_REMOVE

#define POBJ_SLIST_REMOVE (   head,
  elm,
  field 
)
Value:
do {\
if (TOID_EQUALS((head)->pe_first, elm)) {\
POBJ_SLIST_REMOVE_HEAD(head, field);\
} else {\
TOID_TYPEOF(elm) *curelm_ptr = D_RW((head)->pe_first);\
while (!TOID_EQUALS(curelm_ptr->field.pe_next, elm))\
curelm_ptr = D_RW(curelm_ptr->field.pe_next);\
TX_ADD_DIRECT(&curelm_ptr->field.pe_next);\
curelm_ptr->field.pe_next = D_RO(elm)->field.pe_next;\
}\
} while (0)

Definition at line 99 of file free_slot_list.h.

◆ POBJ_SLIST_REMOVE_FREE

#define POBJ_SLIST_REMOVE_FREE (   head,
  elm,
  field 
)
Value:
do {\
POBJ_SLIST_REMOVE(head, elm, field);\
TX_FREE(elm);\
} while (0)

Definition at line 111 of file free_slot_list.h.

◆ POBJ_SLIST_REMOVE_HEAD

#define POBJ_SLIST_REMOVE_HEAD (   head,
  field 
)
Value:
do {\
TX_ADD_DIRECT(&(head)->pe_first);\
(head)->pe_first = D_RO((head)->pe_first)->field.pe_next;\
} while (0)

Definition at line 94 of file free_slot_list.h.

◆ POBJ_TAILQ_EMPTY

#define POBJ_TAILQ_EMPTY (   head)    (TOID_IS_NULL((head)->pe_first))

Definition at line 142 of file free_slot_list.h.

◆ POBJ_TAILQ_ENTRY

#define POBJ_TAILQ_ENTRY (   type)
Value:
struct {\
TOID(type) pe_next;\
TOID(type) pe_prev;\
}

Definition at line 124 of file free_slot_list.h.

◆ POBJ_TAILQ_FIRST

#define POBJ_TAILQ_FIRST (   head)    ((head)->pe_first)

Definition at line 139 of file free_slot_list.h.

◆ POBJ_TAILQ_FOREACH

#define POBJ_TAILQ_FOREACH (   var,
  head,
  field 
)
Value:
for ((var) = POBJ_TAILQ_FIRST(head);\
!TOID_IS_NULL(var);\
var = POBJ_TAILQ_NEXT(var, field))

Definition at line 167 of file free_slot_list.h.

◆ POBJ_TAILQ_FOREACH_REVERSE

#define POBJ_TAILQ_FOREACH_REVERSE (   var,
  head,
  field 
)
Value:
for ((var) = POBJ_TAILQ_LAST(head);\
!TOID_IS_NULL(var);\
var = POBJ_TAILQ_PREV(var, field))

Definition at line 172 of file free_slot_list.h.

◆ POBJ_TAILQ_HEAD

#define POBJ_TAILQ_HEAD (   name,
  type 
)
Value:
struct name {\
TOID(type) pe_first;\
TOID(type) pe_last;\
}

Definition at line 130 of file free_slot_list.h.

◆ POBJ_TAILQ_INIT

#define POBJ_TAILQ_INIT (   head)
Value:
do {\
TX_ADD_FIELD_DIRECT(head, pe_first);\
TOID_ASSIGN((head)->pe_first, MEMOID_NULL);\
TX_ADD_FIELD_DIRECT(head, pe_last);\
TOID_ASSIGN((head)->pe_last, MEMOID_NULL);\
} while (0)

Definition at line 177 of file free_slot_list.h.

◆ POBJ_TAILQ_INSERT_AFTER

#define POBJ_TAILQ_INSERT_AFTER (   head,
  listelm,
  elm,
  field 
)
Value:
do {\
TOID_TYPEOF(elm) *elm_ptr = D_RW(elm);\
TOID_TYPEOF(listelm) *listelm_ptr = D_RW(listelm);\
TX_ADD_DIRECT(&elm_ptr->field);\
elm_ptr->field.pe_prev = listelm;\
elm_ptr->field.pe_next = listelm_ptr->field.pe_next;\
if (TOID_IS_NULL(listelm_ptr->field.pe_next)) {\
TX_SET_DIRECT(head, pe_last, elm);\
} else {\
TOID_TYPEOF(elm) *next = D_RW(listelm_ptr->field.pe_next);\
TX_ADD_DIRECT(&next->field.pe_prev);\
next->field.pe_prev = elm;\
}\
TX_ADD_DIRECT(&listelm_ptr->field.pe_next);\
listelm_ptr->field.pe_next = elm;\
} while (0)

Definition at line 224 of file free_slot_list.h.

◆ POBJ_TAILQ_INSERT_BEFORE

#define POBJ_TAILQ_INSERT_BEFORE (   head,
  listelm,
  elm,
  field 
)
Value:
do {\
TOID_TYPEOF(elm) *elm_ptr = D_RW(elm);\
TOID_TYPEOF(listelm) *listelm_ptr = D_RW(listelm);\
TX_ADD_DIRECT(&elm_ptr->field);\
elm_ptr->field.pe_next = listelm;\
elm_ptr->field.pe_prev = listelm_ptr->field.pe_prev;\
if (TOID_IS_NULL(listelm_ptr->field.pe_prev)) {\
TX_SET_DIRECT(head, pe_first, elm);\
} else {\
TOID_TYPEOF(elm) *prev = D_RW(listelm_ptr->field.pe_prev);\
TX_ADD_DIRECT(&prev->field.pe_next);\
prev->field.pe_next = elm; \
}\
TX_ADD_DIRECT(&listelm_ptr->field.pe_prev);\
listelm_ptr->field.pe_prev = elm;\
} while (0)

Definition at line 241 of file free_slot_list.h.

◆ POBJ_TAILQ_INSERT_HEAD

#define POBJ_TAILQ_INSERT_HEAD (   head,
  elm,
  field 
)
Value:
do {\
TOID_TYPEOF(elm) *elm_ptr = D_RW(elm);\
if (TOID_IS_NULL((head)->pe_first)) {\
TX_ADD_DIRECT(&elm_ptr->field);\
elm_ptr->field.pe_prev = (head)->pe_first;\
elm_ptr->field.pe_next = (head)->pe_first;\
TX_ADD_DIRECT(head);\
(head)->pe_first = elm;\
(head)->pe_last = elm;\
} else {\
TOID_TYPEOF(elm) *first = D_RW((head)->pe_first);\
TX_ADD_DIRECT(&elm_ptr->field);\
elm_ptr->field.pe_next = (head)->pe_first;\
elm_ptr->field.pe_prev = first->field.pe_prev;\
TX_ADD_DIRECT(&first->field.pe_prev);\
first->field.pe_prev = elm;\
TX_SET_DIRECT(head, pe_first, elm);\
}\
} while (0)

Definition at line 184 of file free_slot_list.h.

◆ POBJ_TAILQ_INSERT_TAIL

#define POBJ_TAILQ_INSERT_TAIL (   head,
  elm,
  field 
)
Value:
do {\
TOID_TYPEOF(elm) *elm_ptr = D_RW(elm);\
if (TOID_IS_NULL((head)->pe_last)) {\
TX_ADD_DIRECT(&elm_ptr->field);\
elm_ptr->field.pe_prev = (head)->pe_last;\
elm_ptr->field.pe_next = (head)->pe_last;\
TX_ADD_DIRECT(head);\
(head)->pe_first = elm;\
(head)->pe_last = elm;\
} else {\
TOID_TYPEOF(elm) *last = D_RW((head)->pe_last);\
TX_ADD_DIRECT(&elm_ptr->field);\
elm_ptr->field.pe_prev = (head)->pe_last;\
elm_ptr->field.pe_next = last->field.pe_next;\
TX_ADD_DIRECT(&last->field.pe_next);\
last->field.pe_next = elm;\
TX_SET_DIRECT(head, pe_last, elm);\
}\
} while (0)

Definition at line 204 of file free_slot_list.h.

◆ POBJ_TAILQ_LAST

#define POBJ_TAILQ_LAST (   head)    ((head)->pe_last)

Definition at line 140 of file free_slot_list.h.

◆ POBJ_TAILQ_MOVE_ELEMENT_HEAD

#define POBJ_TAILQ_MOVE_ELEMENT_HEAD (   head,
  elm,
  field 
)
Value:
do {\
TOID_TYPEOF(elm) *elm_ptr = D_RW(elm);\
if (TOID_EQUALS((head)->pe_last, elm) &&\
TOID_EQUALS(D_RO((head)->pe_first)->field.pe_next, elm)) {\
_POBJ_SWAP_PTR(elm, field);\
_POBJ_SWAP_PTR((head)->pe_first, field);\
POBJ_TAILQ_SWAP_HEAD_TAIL(head, field);\
} else {\
TOID_TYPEOF(elm) *prev = D_RW(elm_ptr->field.pe_prev);\
TX_ADD_DIRECT(&prev->field.pe_next);\
prev->field.pe_next = elm_ptr->field.pe_next;\
if (TOID_EQUALS((head)->pe_last, elm)) {\
TX_SET_DIRECT(head, pe_last, elm_ptr->field.pe_prev);\
} else {\
TOID_TYPEOF(elm) *next = D_RW(elm_ptr->field.pe_next);\
TX_ADD_DIRECT(&next->field.pe_prev);\
next->field.pe_prev = elm_ptr->field.pe_prev;\
}\
TX_ADD_DIRECT(&elm_ptr->field);\
elm_ptr->field.pe_prev = D_RO((head)->pe_first)->field.pe_prev;\
elm_ptr->field.pe_next = (head)->pe_first;\
TOID_TYPEOF(elm) *first = D_RW((head)->pe_first);\
TX_ADD_DIRECT(&first->field.pe_prev);\
first->field.pe_prev = elm;\
TX_SET_DIRECT(head, pe_first, elm);\
}\
} while (0)

Definition at line 298 of file free_slot_list.h.

◆ POBJ_TAILQ_MOVE_ELEMENT_TAIL

#define POBJ_TAILQ_MOVE_ELEMENT_TAIL (   head,
  elm,
  field 
)
Value:
do {\
TOID_TYPEOF(elm) *elm_ptr = D_RW(elm);\
if (TOID_EQUALS((head)->pe_first, elm) &&\
TOID_EQUALS(D_RO((head)->pe_last)->field.pe_prev, elm)) {\
_POBJ_SWAP_PTR(elm, field);\
_POBJ_SWAP_PTR((head)->pe_last, field);\
POBJ_TAILQ_SWAP_HEAD_TAIL(head, field);\
} else {\
TOID_TYPEOF(elm) *next = D_RW(elm_ptr->field.pe_next);\
TX_ADD_DIRECT(&next->field.pe_prev);\
next->field.pe_prev = elm_ptr->field.pe_prev;\
if (TOID_EQUALS((head)->pe_first, elm)) {\
TX_SET_DIRECT(head, pe_first, elm_ptr->field.pe_next);\
} else { \
TOID_TYPEOF(elm) *prev = D_RW(elm_ptr->field.pe_prev);\
TX_ADD_DIRECT(&prev->field.pe_next);\
prev->field.pe_next = elm_ptr->field.pe_next;\
}\
TX_ADD_DIRECT(&elm_ptr->field);\
elm_ptr->field.pe_prev = (head)->pe_last;\
elm_ptr->field.pe_next = D_RO((head)->pe_last)->field.pe_next;\
__typeof__(elm_ptr) last = D_RW((head)->pe_last);\
TX_ADD_DIRECT(&last->field.pe_next);\
last->field.pe_next = elm;\
TX_SET_DIRECT(head, pe_last, elm);\
} \
} while (0)

Definition at line 326 of file free_slot_list.h.

◆ POBJ_TAILQ_NEXT

#define POBJ_TAILQ_NEXT (   elm,
  field 
)    (D_RO(elm)->field.pe_next)

Definition at line 143 of file free_slot_list.h.

◆ POBJ_TAILQ_PREV

#define POBJ_TAILQ_PREV (   elm,
  field 
)    (D_RO(elm)->field.pe_prev)

Definition at line 144 of file free_slot_list.h.

◆ POBJ_TAILQ_REMOVE

#define POBJ_TAILQ_REMOVE (   head,
  elm,
  field 
)
Value:
do {\
TOID_TYPEOF(elm) *elm_ptr = D_RW(elm);\
if (TOID_IS_NULL(elm_ptr->field.pe_prev) &&\
TOID_IS_NULL(elm_ptr->field.pe_next)) {\
TX_ADD_DIRECT(head);\
(head)->pe_first = elm_ptr->field.pe_prev;\
(head)->pe_last = elm_ptr->field.pe_next;\
} else {\
if (TOID_IS_NULL(elm_ptr->field.pe_prev)) {\
TX_SET_DIRECT(head, pe_first, elm_ptr->field.pe_next);\
TOID_TYPEOF(elm) *next = D_RW(elm_ptr->field.pe_next);\
TX_ADD_DIRECT(&next->field.pe_prev);\
next->field.pe_prev = elm_ptr->field.pe_prev;\
} else {\
TOID_TYPEOF(elm) *prev = D_RW(elm_ptr->field.pe_prev);\
TX_ADD_DIRECT(&prev->field.pe_next);\
prev->field.pe_next = elm_ptr->field.pe_next;\
}\
if (TOID_IS_NULL(elm_ptr->field.pe_next)) {\
TX_SET_DIRECT(head, pe_last, elm_ptr->field.pe_prev);\
TOID_TYPEOF(elm) *prev = D_RW(elm_ptr->field.pe_prev);\
TX_ADD_DIRECT(&prev->field.pe_next);\
prev->field.pe_next = elm_ptr->field.pe_next;\
} else {\
TOID_TYPEOF(elm) *next = D_RW(elm_ptr->field.pe_next);\
TX_ADD_DIRECT(&next->field.pe_prev);\
next->field.pe_prev = elm_ptr->field.pe_prev;\
}\
}\
} while (0)

Definition at line 258 of file free_slot_list.h.

◆ POBJ_TAILQ_REMOVE_FREE

#define POBJ_TAILQ_REMOVE_FREE (   head,
  elm,
  field 
)
Value:
do {\
POBJ_TAILQ_REMOVE(head, elm, field);\
TX_FREE(elm);\
} while (0)

Definition at line 289 of file free_slot_list.h.

◆ POBJ_TAILQ_SWAP_HEAD_TAIL

#define POBJ_TAILQ_SWAP_HEAD_TAIL (   head,
  field 
)
Value:
do {\
__typeof__((head)->pe_first) temp = (head)->pe_first;\
TX_ADD_DIRECT(head);\
(head)->pe_first = (head)->pe_last;\
(head)->pe_last = temp;\
} while (0)

Definition at line 160 of file free_slot_list.h.

POBJ_SLIST_NEXT
#define POBJ_SLIST_NEXT(elm, field)
Definition: free_slot_list.h:67
POBJ_SLIST_FIRST
#define POBJ_SLIST_FIRST(head)
Definition: free_slot_list.h:66
POBJ_TAILQ_LAST
#define POBJ_TAILQ_LAST(head)
Definition: free_slot_list.h:139
POBJ_TAILQ_PREV
#define POBJ_TAILQ_PREV(elm, field)
Definition: free_slot_list.h:143
POBJ_TAILQ_FIRST
#define POBJ_TAILQ_FIRST(head)
Definition: free_slot_list.h:138
POBJ_TAILQ_NEXT
#define POBJ_TAILQ_NEXT(elm, field)
Definition: free_slot_list.h:142
MEMOID_NULL
static const MEMoid MEMOID_NULL
Just a dummy obj.
Definition: malloc.h:52