[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [Libevent-users] The function list operation of "_evdns_nameserver_add_impl"



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 <scpl0000@xxxxxxxxx> 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 <nickm@xxxxxxxxxxxxx> wrote:
>> On Wed, Dec 21, 2011 at 7:53 AM, wang qin <scpl0000@xxxxxxxxx> 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 majordomo@xxxxxxxxxxxxx with
>> unsubscribe libevent-users    in the body.
>>
>
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.