Dear, This is the double circle queue. But the operations are not enqueue the circle queue. Below is the standard operations:
if (!base->server_head) { ns->next = ns->prev = ns; base->server_head = ns; } else { ns->next = base->server_head->next; ns->prev = base->server_head; base->server_head->next = ns; if (base->server_head->prev == base->server_head) { base->server_head->prev = ns; }else{ base->server_head->next->next-prev = ns; } } On 12/22/11, wang qin <scpl0...@gmail.com> wrote: > Dear, > > This code snippet comes from libevent-2.0.13. The list operation is > the same. I think it does not have any bugs. > > yrs, > > > > /* insert this nameserver into the list of them */ > if (!base->server_head) { > ns->next = ns->prev = ns; > base->server_head = ns; > } else { > ns->next = base->server_head->next; > ns->prev = base->server_head; > base->server_head->next = ns; > if (base->server_head->prev == base->server_head) { > base->server_head->prev = ns; > } > } > > > On 12/22/11, Nick Mathewson <ni...@freehaven.net> wrote: >> On Wed, Dec 21, 2011 at 7:53 AM, wang qin <scpl0...@gmail.com> wrote: >>> >>> Dear, >>> >>> I do not understand of the list operation of the >>> _evdns_nameserver_add_impl. >>> >>> How to understand this snippet? >>> >>> Best is figures and notes. >>> >>> >>> >>> Thank you very much! >>> >>> >>> /* insert this nameserver into the list of them */ >>> if (!server_head) { >>> ns->next = ns->prev = ns; >>> server_head = ns; >>> } else { >>> ns->next = server_head->next; >>> ns->prev = server_head; >>> server_head->next = ns; >>> if (server_head->prev == server_head) { >>> server_head->prev = ns; >>> } >>> } >> >> It looks like it's supposed to be a circular doubly linked list to me. >> If the list is empty, then the new nameserver is inserted as the sole >> node, and its prev and next pointers are set to itself (to make the >> list circular). But if the list is notempty, we insert the new >> nameserver after the current head (server_head). >> >> It looks like there's a possible bug there; I don't see anything that >> points ns->next->prev at ns. If that's so, the best solution here is >> probably to replace the whole thing evdns_base.server_head thing with >> a CIRCLEQ or such. >> >> (FWIW, this looks like really old code; Libevent 2.0 is the version >> folks should be using. Libevent 1.4 is not under active development.) >> >> yrs, >> -- >> Nick >> *********************************************************************** >> To unsubscribe, send an e-mail to majord...@freehaven.net with >> unsubscribe libevent-users in the body. >> > *********************************************************************** To unsubscribe, send an e-mail to majord...@freehaven.net with unsubscribe libevent-users in the body.