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