PostgreSQL Source Code git master
proclist.h File Reference
Include dependency graph for proclist.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define proclist_delete(list, procno, link_member)    proclist_delete_offset((list), (procno), offsetof(PGPROC, link_member))
 
#define proclist_push_head(list, procno, link_member)    proclist_push_head_offset((list), (procno), offsetof(PGPROC, link_member))
 
#define proclist_push_tail(list, procno, link_member)    proclist_push_tail_offset((list), (procno), offsetof(PGPROC, link_member))
 
#define proclist_pop_head_node(list, link_member)    proclist_pop_head_node_offset((list), offsetof(PGPROC, link_member))
 
#define proclist_contains(list, procno, link_member)    proclist_contains_offset((list), (procno), offsetof(PGPROC, link_member))
 
#define proclist_foreach_modify(iter, lhead, link_member)
 

Functions

static void proclist_init (proclist_head *list)
 
static bool proclist_is_empty (const proclist_head *list)
 
static proclist_nodeproclist_node_get (int procno, size_t node_offset)
 
static void proclist_push_head_offset (proclist_head *list, int procno, size_t node_offset)
 
static void proclist_push_tail_offset (proclist_head *list, int procno, size_t node_offset)
 
static void proclist_delete_offset (proclist_head *list, int procno, size_t node_offset)
 
static bool proclist_contains_offset (const proclist_head *list, int procno, size_t node_offset)
 
static PGPROCproclist_pop_head_node_offset (proclist_head *list, size_t node_offset)
 

Macro Definition Documentation

◆ proclist_contains

#define proclist_contains (   list,
  procno,
  link_member 
)     proclist_contains_offset((list), (procno), offsetof(PGPROC, link_member))

Definition at line 195 of file proclist.h.

◆ proclist_delete

#define proclist_delete (   list,
  procno,
  link_member 
)     proclist_delete_offset((list), (procno), offsetof(PGPROC, link_member))

Definition at line 187 of file proclist.h.

◆ proclist_foreach_modify

#define proclist_foreach_modify (   iter,
  lhead,
  link_member 
)
Value:
(iter).cur = (lhead)->head, \
offsetof(PGPROC, link_member))->next; \
(iter).cur != INVALID_PROC_NUMBER; \
(iter).cur = (iter).next, \
(iter).next = (iter).cur == INVALID_PROC_NUMBER ? INVALID_PROC_NUMBER : \
proclist_node_get((iter).cur, \
offsetof(PGPROC, link_member))->next)
static int32 next
Definition: blutils.c:221
#define AssertVariableIsOfTypeMacro(varname, typename)
Definition: c.h:941
struct cursor * cur
Definition: ecpg.c:29
static proclist_node * proclist_node_get(int procno, size_t node_offset)
Definition: proclist.h:48
#define INVALID_PROC_NUMBER
Definition: procnumber.h:26
Definition: proc.h:162
struct cursor * next
Definition: type.h:148

Definition at line 206 of file proclist.h.

◆ proclist_pop_head_node

#define proclist_pop_head_node (   list,
  link_member 
)     proclist_pop_head_node_offset((list), offsetof(PGPROC, link_member))

Definition at line 193 of file proclist.h.

◆ proclist_push_head

#define proclist_push_head (   list,
  procno,
  link_member 
)     proclist_push_head_offset((list), (procno), offsetof(PGPROC, link_member))

Definition at line 189 of file proclist.h.

◆ proclist_push_tail

#define proclist_push_tail (   list,
  procno,
  link_member 
)     proclist_push_tail_offset((list), (procno), offsetof(PGPROC, link_member))

Definition at line 191 of file proclist.h.

Function Documentation

◆ proclist_contains_offset()

static bool proclist_contains_offset ( const proclist_head list,
int  procno,
size_t  node_offset 
)
inlinestatic

Definition at line 146 of file proclist.h.

148{
149 const proclist_node *node = proclist_node_get(procno, node_offset);
150
151 /* If it's not in any list, it's definitely not in this one. */
152 if (node->prev == 0 && node->next == 0)
153 return false;
154
155 /*
156 * It must, in fact, be in this list. Ideally, in assert-enabled builds,
157 * we'd verify that. But since this function is typically used while
158 * holding a spinlock, crawling the whole list is unacceptable. However,
159 * we can verify matters in O(1) time when the node is a list head or
160 * tail, and that seems worth doing, since in practice that should often
161 * be enough to catch mistakes.
162 */
163 Assert(node->prev != INVALID_PROC_NUMBER || list->head == procno);
164 Assert(node->next != INVALID_PROC_NUMBER || list->tail == procno);
165
166 return true;
167}
#define Assert(condition)
Definition: c.h:815
ProcNumber prev
ProcNumber next

References Assert, INVALID_PROC_NUMBER, sort-test::list, proclist_node::next, proclist_node::prev, and proclist_node_get().

◆ proclist_delete_offset()

static void proclist_delete_offset ( proclist_head list,
int  procno,
size_t  node_offset 
)
inlinestatic

Definition at line 115 of file proclist.h.

116{
117 proclist_node *node = proclist_node_get(procno, node_offset);
118
119 Assert(node->next != 0 || node->prev != 0);
120
121 if (node->prev == INVALID_PROC_NUMBER)
122 {
123 Assert(list->head == procno);
124 list->head = node->next;
125 }
126 else
127 proclist_node_get(node->prev, node_offset)->next = node->next;
128
129 if (node->next == INVALID_PROC_NUMBER)
130 {
131 Assert(list->tail == procno);
132 list->tail = node->prev;
133 }
134 else
135 proclist_node_get(node->next, node_offset)->prev = node->prev;
136
137 node->next = node->prev = 0;
138}

References Assert, INVALID_PROC_NUMBER, sort-test::list, proclist_node::next, proclist_node::prev, and proclist_node_get().

Referenced by proclist_pop_head_node_offset().

◆ proclist_init()

static void proclist_init ( proclist_head list)
inlinestatic

Definition at line 29 of file proclist.h.

30{
31 list->head = list->tail = INVALID_PROC_NUMBER;
32}

References INVALID_PROC_NUMBER, and sort-test::list.

Referenced by ConditionVariableInit(), LWLockInitialize(), LWLockUpdateVar(), and LWLockWakeup().

◆ proclist_is_empty()

static bool proclist_is_empty ( const proclist_head list)
inlinestatic

◆ proclist_node_get()

static proclist_node * proclist_node_get ( int  procno,
size_t  node_offset 
)
inlinestatic

Definition at line 48 of file proclist.h.

49{
50 char *entry = (char *) GetPGProcByNumber(procno);
51
52 return (proclist_node *) (entry + node_offset);
53}
#define GetPGProcByNumber(n)
Definition: proc.h:423

References GetPGProcByNumber.

Referenced by proclist_contains_offset(), proclist_delete_offset(), proclist_push_head_offset(), and proclist_push_tail_offset().

◆ proclist_pop_head_node_offset()

static PGPROC * proclist_pop_head_node_offset ( proclist_head list,
size_t  node_offset 
)
inlinestatic

Definition at line 173 of file proclist.h.

174{
175 PGPROC *proc;
176
178 proc = GetPGProcByNumber(list->head);
179 proclist_delete_offset(list, list->head, node_offset);
180 return proc;
181}
static bool proclist_is_empty(const proclist_head *list)
Definition: proclist.h:38
static void proclist_delete_offset(proclist_head *list, int procno, size_t node_offset)
Definition: proclist.h:115

References Assert, GetPGProcByNumber, sort-test::list, proclist_delete_offset(), and proclist_is_empty().

◆ proclist_push_head_offset()

static void proclist_push_head_offset ( proclist_head list,
int  procno,
size_t  node_offset 
)
inlinestatic

Definition at line 59 of file proclist.h.

60{
61 proclist_node *node = proclist_node_get(procno, node_offset);
62
63 Assert(node->next == 0 && node->prev == 0);
64
65 if (list->head == INVALID_PROC_NUMBER)
66 {
68 node->next = node->prev = INVALID_PROC_NUMBER;
69 list->head = list->tail = procno;
70 }
71 else
72 {
74 Assert(list->head != procno);
75 Assert(list->tail != procno);
76 node->next = list->head;
77 proclist_node_get(node->next, node_offset)->prev = procno;
79 list->head = procno;
80 }
81}

References Assert, INVALID_PROC_NUMBER, sort-test::list, proclist_node::next, proclist_node::prev, and proclist_node_get().

◆ proclist_push_tail_offset()

static void proclist_push_tail_offset ( proclist_head list,
int  procno,
size_t  node_offset 
)
inlinestatic

Definition at line 87 of file proclist.h.

88{
89 proclist_node *node = proclist_node_get(procno, node_offset);
90
91 Assert(node->next == 0 && node->prev == 0);
92
93 if (list->tail == INVALID_PROC_NUMBER)
94 {
96 node->next = node->prev = INVALID_PROC_NUMBER;
97 list->head = list->tail = procno;
98 }
99 else
100 {
102 Assert(list->head != procno);
103 Assert(list->tail != procno);
104 node->prev = list->tail;
105 proclist_node_get(node->prev, node_offset)->next = procno;
107 list->tail = procno;
108 }
109}

References Assert, INVALID_PROC_NUMBER, sort-test::list, proclist_node::next, proclist_node::prev, and proclist_node_get().