question on some simple codes in ngx_buf.c

Maxim Dounin mdounin at mdounin.ru
Thu Jan 16 16:50:26 UTC 2014


Hello!

On Thu, Jan 16, 2014 at 02:04:45AM -0500, microwish wrote:

> Hello there,
> 
> code snippet in the definition of ngx_chain_add_copy in ngx_buf.c:
> 
> 
>     ll = chain;
>                                                                             
>                                                                             
>                          
>     for (cl = *chain; cl; cl = cl->next) {
>         ll = &cl->next;
>     }
> 
> 
> Why is ll assigned repeatedly? I'm sorry for failed thinking out any
> necessity.
> 
> And I modified the above as the following. Is it OK?
> 
> 
>     if (*chain) {
>         for (cl = *chain; cl->next; cl = cl->next) { /* void */ }
>         ll = &cl->next;
>     } else {
>         ll = chain;
>     }
> 
> 
> Thank you very much.

The code snippets look equivalent from logical point of view.  
>From performance point of view - they are mostly equivalent too, 
as cl->next address anyway needs to be loaded on each cycle 
iteration and will be available in a register, so assignment is 
essentially a nop.  The code currently used is shorter though, and 
easier to read.

-- 
Maxim Dounin
http://nginx.org/



More information about the nginx mailing list