As I discovered when reading the HTTP parser code, nginx relies heavily on macros. Perhaps this has something to do with the “uncertainty” of the inline keyword - it is not an “obligation”, more like a compiler “hint”. Which doesn’t give guarantees that the code will get inlined.

Another example of heavy macro usage is the queue implementation (ngx_queue.h). For example, some of the utilities are:

#define ngx_queue_init(q)                                                     \
    (q)->prev = q;                                                            \
    (q)->next = q

#define ngx_queue_empty(h)                                                    \
    (h == (h)->prev)

#define ngx_queue_insert_head(h, x)                                           \
    (x)->next = (h)->next;                                                    \
    (x)->next->prev = x;                                                      \
    (x)->prev = h;                                                            \
    (h)->next = x

#define ngx_queue_insert_tail(h, x)                                           \
    (x)->prev = (h)->prev;                                                    \
    (x)->prev->next = x;                                                      \
    (x)->next = h;                                                            \
    (h)->prev = x

The whole ngx_queue.h is pretty awesome. ngx_queue.c also contains a pretty succinct implementation of an insertion sort.