Add a comment explaining ITER_COMM_CHANNELS

This commit is contained in:
Ed Kellett 2020-10-21 20:29:26 +01:00
parent 25f673bfde
commit 6b3ae7e7b7

View file

@ -204,7 +204,22 @@ int iter_comm_channels_step(rb_dlink_node *pos1, rb_dlink_node *pos2,
struct membership **ms1, struct membership **ms2,
struct Channel **chptr);
#define ITER_COMM_CHANNELS(pos1, pos2, head1, head2, ms1, ms2, chptr) for ((pos1) = (head1), (pos2) = (head2); \
/* Iterate two sorted linked lists of channels, with heads headN, in lockstep.
At each iteration, chptr will be a channel in at least one of the lists,
and each msN will be non-null iff the channel is in its corresponding list.
head1 and head2 must be linked list heads.
pos1, pos2, ms1, ms2 must be names of modifiable variables, and should not
be modified during iteration. It is safe to break or continue at any point
without any special cleanup.
rb_dlink_node_t *pos1, *pos2, *head1, *head2;
struct membership *ms1, *ms2;
struct Channel *chptr;
*/
#define ITER_COMM_CHANNELS(pos1, pos2, head1, head2, ms1, ms2, chptr) \
for ((pos1) = (head1), (pos2) = (head2); \
iter_comm_channels_step((pos1), (pos2), &(ms1), &(ms2), &(chptr)); \
(ms1) && ((pos1) = (pos1)->next), (ms2) && ((pos2) = (pos2)->next))