Nginx 소스 코드 완전 주석 (4) ngxqueue.h / ngx_queue.c
12364 단어 nginx
#include <ngx_config.h> #include <ngx_core.h> #ifndef _NGX_QUEUE_H_INCLUDED_ #define _NGX_QUEUE_H_INCLUDED_ typedef struct ngx_queue_s ngx_queue_t; // , 。 struct ngx_queue_s { ngx_queue_t *prev; ngx_queue_t *next; }; // q ,prev next #define ngx_queue_init(q) \ (q)->prev = q; \ (q)->next = q // h == h , , next #define ngx_queue_empty(h) \ (h == (h)->prev) // h x #define ngx_queue_insert_head(h, x) \ (x)->next = (h)->next; \ (x)->next->prev = x; \ (x)->prev = h; \ (h)->next = x // insert after, insert head #define ngx_queue_insert_after ngx_queue_insert_head // h x #define ngx_queue_insert_tail(h, x) \ (x)->prev = (h)->prev; \ (x)->prev->next = x; \ (x)->next = h; \ (h)->prev = x // h , h->next #define ngx_queue_head(h) \ (h)->next // h ,h #define ngx_queue_last(h) \ (h)->prev #define ngx_queue_sentinel(h) \ (h) // q #define ngx_queue_next(q) \ (q)->next // q #define ngx_queue_prev(q) \ (q)->prev #if (NGX_DEBUG) // debug x prev、next 0,release #define ngx_queue_remove(x) \ (x)->next->prev = (x)->prev; \ (x)->prev->next = (x)->next; \ (x)->prev = NULL; \ (x)->next = NULL #else // #define ngx_queue_remove(x) \ (x)->next->prev = (x)->prev; \ (x)->prev->next = (x)->next #endif // // split : // // ________________________________________________ // ||--------------------------------------------|| // || || // |---| => |---| => … => |---| => |---| => … => |---| |---| // | h | | | | q | | | | | | n | // |---| <= |---| <= … <= |---| <= |---| <= … <= |---| |---| // // __________________________ __________________________________ // ||----------------------|| ||------------------------------|| // || || || || // |---| => |---| => … => |---| |---| => |---| => … => |---| => |---| // | h | | | | | | q | | | | | | n | // |---| <= |---| <= … => |---| |---| <= |---| <= … <= |---| <= |---| // #define ngx_queue_split(h, q, n) \ (n)->prev = (h)->prev; \ (n)->prev->next = n; \ (n)->next = q; \ (h)->prev = (q)->prev; \ (h)->prev->next = h; \ (q)->prev = n; // n (n ) h // // _________________________ _________________________ // ||---------------------|| ||---------------------|| // || || || || // |---| => |---| => … => |---| |---| => |---| => … => |---| // | h | | | | | | n | |n1 | | | // |---| <= |---| <= … <= |---| |---| <= |---| <= … <= |---| // // ________________________________________________________ // ||----------------------------------------------------|| // || || // |---| => |---| => … => |---| =========> |---| => … => |---| // | h | | | | | |n1 | | | // |---| <= |---| <= … <= |---| <========= |---| <= … <= |---| // #define ngx_queue_add(h, n) \ (h)->prev->next = (n)->next; \ (n)->next->prev = (h)->prev; \ (h)->prev = (n)->prev; \ (h)->prev->next = h; // type : // typedef struct { // … // LINK q // } TYPE // q TYPE #define ngx_queue_data(q, type, link) \ (type *) ((u_char *) q - offsetof(type, link)) ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue); void ngx_queue_sort(ngx_queue_t *queue, ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)); #endif /* _NGX_QUEUE_H_INCLUDED_ */
대기 열 원본 파일
#include #include /* * find the middle queue element if the queue has odd number of elements * or the first element of the queue's second part otherwise */ // // , 。 // ngx_queue_t * ngx_queue_middle(ngx_queue_t *queue) { ngx_queue_t *middle, *next; // middle middle = ngx_queue_head(queue); // , if (middle == ngx_queue_last(queue)) { return middle; } // next next = ngx_queue_head(queue); for ( ;; ) { middle = ngx_queue_next(middle); next = ngx_queue_next(next); // if (next == ngx_queue_last(queue)) { return middle; } next = ngx_queue_next(next); // if (next == ngx_queue_last(queue)) { return middle; } } } /* the stable insertion sort */ // // (Stable In-place Sorting)。 ( , , ) // ,quick sort merge sort 。 quick sort ,merge sort O(n) // void ngx_queue_sort(ngx_queue_t *queue, ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)) { ngx_queue_t *q, *prev, *next; q = ngx_queue_head(queue); // if (q == ngx_queue_last(queue)) { return; } for (q = ngx_queue_next(q); q != ngx_queue_sentinel(queue); q = next) { prev = ngx_queue_prev(q); next = ngx_queue_next(q); ngx_queue_remove(q); // , q 。 cmp do { if (cmp(prev, q) <= 0) { break; } prev = ngx_queue_prev(prev); } while (prev != ngx_queue_sentinel(queue)); // prev q , prev ngx_queue_insert_after(prev, q); } }
위 에서 알 수 있 듯 이 create 는 pool 에서 list 구 조 를 정의 하 는 메모리 로 헤더 노드 의 메모 리 를 분배 합 니 다.init 는 기 존 list 를 초기 화 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.