ngx_pool_t(100%)
ngx_pool_tÊÇÒ»¸ö·Ç³£ÖØÒªµÄÊý¾Ý½á¹¹£¬ÔںܶàÖØÒªµÄ³¡ºÏ¶¼ÓÐʹÓ㬺ܶàÖØÒªµÄÊý¾Ý½á¹¹Ò²¶¼ÔÚʹÓÃËü¡£ÄÇôËü¾¿¾¹ÊÇÒ»¸öʲô¶«Î÷ÄØ£¿¼òµ¥µÄ˵£¬ËüÌṩÁËÒ»ÖÖ»úÖÆ£¬°ïÖú¹ÜÀíһϵÁеÄ×ÊÔ´£¨ÈçÄڴ棬ÎļþµÈ£©£¬Ê¹µÃ¶ÔÕâЩ×ÊÔ´µÄʹÓúÍÊÍ·Åͳһ½øÐУ¬Ãâ³ýÁËʹÓùý³ÌÖп¼Âǵ½¶Ô¸÷ÖÖ¸÷Ñù×ÊÔ´µÄʲôʱºòÊÍ·Å£¬ÊÇ·ñÒÅ©ÁËÊͷŵĵ£ÐÄ¡£
ÀýÈç¶ÔÓÚÄÚ´æµÄ¹ÜÀí£¬Èç¹ûÎÒÃÇÐèҪʹÓÃÄڴ棬ÄÇô×ÜÊÇ´ÓÒ»¸öngx_pool_tµÄ¶ÔÏóÖлñÈ¡Äڴ棬ÔÚ×îÖÕµÄij¸öʱ¿Ì£¬ÎÒÃÇÏú»ÙÕâ¸öngx_pool_t¶ÔÏó£¬ËùÓÐÕâЩÄÚ´æ¶¼±»ÊÍ·ÅÁË¡£ÕâÑùÎÒÃǾͲ»±ØÒª¶Ô¶ÔÕâЩÄÚ´æ½øÐÐmallocºÍfreeµÄ²Ù×÷£¬²»Óõ£ÐÄÊÇ·ñij¿é±»malloc³öÀ´µÄÄÚ´æÃ»Óб»ÊÍ·Å¡£ÒòΪµ±ngx_pool_t¶ÔÏó±»Ïú»ÙµÄʱºò£¬ËùÓдÓÕâ¸ö¶ÔÏóÖзÖÅä³öÀ´µÄÄÚ´æ¶¼»á±»Í³Ò»Êͷŵô¡£
ÔÙ±ÈÈçÎÒÃÇҪʹÓÃһϵÁеÄÎļþ£¬µ«ÊÇÎÒÃÇ´ò¿ªÒÔºó£¬×îÖÕÐèÒª¶¼¹Ø±Õ£¬ÄÇôÎÒÃǾͰÑÕâЩÎļþͳһµÇ¼Çµ½Ò»¸öngx_pool_t¶ÔÏóÖУ¬µ±Õâ¸öngx_pool_t¶ÔÏó±»Ïú»ÙµÄʱºò£¬ËùÓÐÕâЩÎļþ¶¼½«»á±»¹Ø±Õ¡£
´ÓÉÏÃæ¾ÙµÄÁ½¸öÀý×ÓÖÐÎÒÃÇ¿ÉÒÔ¿´³ö£¬Ê¹ÓÃngx_pool_tÕâ¸öÊý¾Ý½á¹¹µÄʱºò£¬ËùÓеÄ×ÊÔ´µÄÊͷŶ¼ÔÚÕâ¸ö¶ÔÏó±»Ïú»ÙµÄʱ¿Ì£¬Í³Ò»½øÐÐÁËÊÍ·Å£¬ÄÇô¾Í»á´øÀ´Ò»¸öÎÊÌ⣬¾ÍÊÇÕâЩ×ÊÔ´µÄÉú´æÖÜÆÚ£¨»òÕß˵±»Õ¼ÓõÄʱ¼ä£©ÊǸúngx_pool_tµÄÉú´æÖÜÆÚ»ù±¾Ò»Ö£¨ngx_pool_tÒ²ÌṩÁËÉÙÁ¿²Ù×÷¿ÉÒÔÌáǰÊÍ·Å×ÊÔ´£©¡£´Ó×î¸ßЧµÄ½Ç¶ÈÀ´Ëµ£¬Õâ²¢²»ÊÇ×îºÃµÄ¡£±ÈÈ磬ÎÒÃÇÐèÒªÒÀ´ÎʹÓÃA£¬B£¬CÈý¸ö×ÊÔ´£¬ÇÒʹÓÃÍêBµÄʱºò£¬A¾Í²»»áÔÙ±»Ê¹ÓÃÁË£¬Ê¹ÓÃCµÄʱºòAºÍB¶¼²»»á±»Ê¹Óõ½¡£Èç¹û²»Ê¹ÓÃngx_pool_tÀ´¹ÜÀíÕâÈý¸ö×ÊÔ´£¬ÄÇÎÒÃÇ¿ÉÄÜ´ÓϵͳÀïÃæÉêÇëA£¬Ê¹ÓÃA£¬È»ºóÔÚÊÍ·ÅA¡£½Ó×ÅÉêÇëB£¬Ê¹ÓÃB£¬ÔÙÊÍ·ÅB¡£×îºóÉêÇëC£¬Ê¹ÓÃC£¬È»ºóÊÍ·ÅC¡£µ«Êǵ±ÎÒÃÇʹÓÃÒ»¸öngx_pool_t¶ÔÏóÀ´¹ÜÀíÕâÈý¸ö×ÊÔ´µÄʱºò£¬A£¬BºÍCµÄÊÍ·ÅÊÇÔÚ×îºóÒ»Æð·¢ÉúµÄ£¬Ò²¾ÍÊÇÔÚʹÓÃÍêCÒÔºó¡£³ÏÈ»£¬ÕâÔڿ͹ÛÉÏÔö¼ÓÁ˳ÌÐòÔÚÒ»¶Îʱ¼äµÄ×ÊԴʹÓÃÁ¿¡£µ«ÊÇÕâÒ²¼õÇáÁ˳ÌÐòÔ±·Ö±ð¹ÜÀíÈý¸ö×ÊÔ´µÄÉúÃüÖÜÆÚµÄ¹¤×÷¡£ÕâÒ²¾ÍÊÇÓÐËùµÃ£¬±ØÓÐËùʧµÄµÀÀí¡£Êµ¼ÊÉÏÊÇÒ»¸öÈ¡ÉáµÄÎÊÌ⣬Ҫ¿´ÔÚ¾ßÌåµÄÇé¿öÏ£¬Äã¸üÔÚºõµÄÊÇÄĸö¡£
¿ÉÒÔ¿´Ò»ÏÂÔÚnginxÀïÃæÒ»¸öµäÐ͵ÄʹÓÃngx_pool_tµÄ³¡¾°£¬¶ÔÓÚnginx´¦ÀíµÄÿ¸öhttp
request, nginx»áÉú³ÉÒ»¸öngx_pool_t¶ÔÏóÓëÕâ¸öhttp request¹ØÁª£¬ËùÓд¦Àí¹ý³ÌÖÐÐèÒªÉêÇëµÄ×ÊÔ´¶¼´ÓÕâ¸öngx_pool_t¶ÔÏóÖлñÈ¡£¬µ±Õâ¸öhttp
request´¦ÀíÍê³ÉÒÔºó£¬ËùÓÐÔÚ´¦Àí¹ý³ÌÖÐÉêÇëµÄ×ÊÔ´£¬¶¼½«Ëæ×ÅÕâ¸ö¹ØÁªµÄngx_pool_t¶ÔÏóµÄÏú»Ù¶øÊÍ·Å¡£
ngx_pool_tÏà¹Ø½á¹¹¼°²Ù×÷±»¶¨ÒåÔÚÎļþsrc/core/ngx_palloc.h|cÖС£
typedef struct ngx_pool_s ngx_pool_t;
struct ngx_pool_s { ngx_pool_data_t d; size_t max; ngx_pool_t *current; ngx_chain_t *chain; ngx_pool_large_t *large; ngx_pool_cleanup_t *cleanup; ngx_log_t *log; };
|
´Óngx_pool_tµÄÒ»°ãʹÓÃÕߵĽǶÈÀ´Ëµ£¬¿É²»ÓùØ×¢ngx_pool_t½á¹¹Öи÷×Ö¶Î×÷Óá£ËùÒÔÕâÀïÒ²²»»á½øÐÐÏêϸµÄ½âÊÍ£¬µ±È»ÔÚ˵Ã÷ijЩ²Ù×÷º¯ÊýµÄʹÓõÄʱºò£¬ÈçÓбØÒª£¬»á½øÐÐ˵Ã÷¡£
ÏÂÃæÎÒÃÇÀ´·Ö±ð½âÊÍÏÂngx_pool_tµÄÏà¹Ø²Ù×÷¡£
ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log); |
´´½¨Ò»¸ö³õʼ½Úµã´óСΪsizeµÄpool£¬logΪºóÐøÔÚ¸ÃpoolÉϽøÐвÙ×÷ʱÊä³öÈÕÖ¾µÄ¶ÔÏó¡£
ÐèҪ˵Ã÷µÄÊÇsizeµÄÑ¡Ôñ£¬sizeµÄ´óС±ØÐëСÓÚµÈÓÚNGX_MAX_ALLOC_FROM_POOL£¬ÇÒ±ØÐë´óÓÚsizeof(ngx_pool_t)¡£
Ñ¡Ôñ´óÓÚNGX_MAX_ALLOC_FROM_POOLµÄÖµ»áÔì³ÉÀË·Ñ£¬ÒòΪ´óÓÚ¸ÃÏÞÖÆµÄ¿Õ¼ä²»»á±»Óõ½£¨Ö»ÊÇ˵ÔÚµÚÒ»¸öÓÉngx_pool_t¶ÔÏó¹ÜÀíµÄÄÚ´æ¿éÉϵÄÄڴ棬ºóÐøµÄ·ÖÅäÈç¹ûµÚÒ»¸öÄÚ´æ¿éÉϵĿÕÏв¿·ÖÒÑÓÃÍ꣬»áÔÙ·ÖÅäµÄ£©¡£
Ñ¡ÔñСÓÚsizeof(ngx_pool_t)µÄÖµ»áÔì³É³ÌÐò±ÀÀ£¡£ÓÉÓÚ³õʼ´óСµÄÄÚ´æ¿éÖÐÒªÓÃÒ»²¿·ÖÀ´´æ´¢ngx_pool_tÕâ¸öÐÅÏ¢±¾Éí¡£
µ±Ò»¸öngx_pool_t¶ÔÏó±»´´½¨ÒԺ󣬸öÔÏóµÄmax×ֶα»¸³ÖµÎªsize-sizeof(ngx_pool_t)ºÍNGX_MAX_ALLOC_FROM_POOLÕâÁ½ÕßÖбȽÏСµÄ¡£ºóÐøµÄ´ÓÕâ¸öpoolÖзÖÅäµÄÄÚ´æ¿é£¬ÔÚµÚÒ»¿éÄÚ´æÊ¹ÓÃÍê³ÉÒÔºó£¬Èç¹ûÒª¼ÌÐø·ÖÅäµÄ»°£¬¾ÍÐèÒª¼ÌÐø´Ó²Ù×÷ϵͳÉêÇëÄÚ´æ¡£µ±ÄÚ´æµÄ´óССÓÚµÈÓÚmax×ֶεÄʱºò£¬Ôò·ÖÅäеÄÄÚ´æ¿é£¬Á´½ÓÔÚdÕâ¸ö×ֶΣ¨Êµ¼ÊÉÏÊÇd.next×ֶΣ©¹ÜÀíµÄÒ»ÌõÁ´±íÉÏ¡£µ±Òª·ÖÅäµÄÄÚ´æ¿éÊDZÈmax´óµÄ£¬ÄÇô´ÓϵͳÖÐÉêÇëµÄÄÚ´æÊDZ»¹Ò½ÓÔÚlarge×ֶιÜÀíµÄÒ»ÌõÁ´±íÉÏ¡£ÎÒÃÇÔÝÇÒ°ÑÕâ¸ö³ÆÖ®Îª´ó¿éÄÚ´æÁ´ºÍС¿éÄÚ´æÁ´¡£
void *ngx_palloc(ngx_pool_t *pool, size_t size); |
´ÓÕâ¸öpoolÖзÖÅäÒ»¿éΪsize´óСµÄÄÚ´æ¡£×¢Ò⣬´Ëº¯Êý·ÖÅäµÄÄÚ´æµÄÆðʼµØÖ·°´ÕÕNGX_ALIGNMENT½øÐÐÁË¶ÔÆë¡£¶ÔÆë²Ù×÷»áÌá¸ßϵͳ´¦ÀíµÄËÙ¶È£¬µ«»áÔì³ÉÉÙÁ¿ÄÚ´æµÄÀË·Ñ¡£
void *ngx_pnalloc(ngx_pool_t *pool, size_t size); |
´ÓÕâ¸öpoolÖзÖÅäÒ»¿éΪsize´óСµÄÄÚ´æ¡£µ«ÊǴ˺¯Êý·ÖÅäµÄÄڴ沢ûÓÐÏñÉÏÃæµÄº¯ÊýÄÇÑù½øÐйý¶ÔÆë¡£
void *ngx_pcalloc(ngx_pool_t *pool, size_t size); |
¸Ãº¯ÊýÒ²ÊÇ·ÖÅäsize´óСµÄÄڴ棬²¢ÇÒ¶Ô·ÖÅäµÄÄÚ´æ¿é½øÐÐÁËÇåÁã¡£ÄÚ²¿Êµ¼ÊÉÏÊÇתµ÷ÓÃngx_pallocʵÏֵġ£
void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment); |
°´ÕÕÖ¸¶¨¶ÔÆë´óСalignmentÀ´ÉêÇëÒ»¿é´óСΪsizeµÄÄÚ´æ¡£´Ë´¦»ñÈ¡µÄÄÚ´æ²»¹Ü´óС¶¼½«±»ÖÃÓÚ´óÄÚ´æ¿éÁ´ÖйÜÀí¡£
ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p); |
¶ÔÓÚ±»ÖÃÓÚ´ó¿éÄÚ´æÁ´£¬Ò²¾ÍÊDZ»large×ֶιÜÀíµÄÒ»ÁÐÄÚ´æÖеÄij¿é½øÐÐÊÍ·Å¡£¸Ãº¯ÊýµÄʵÏÖÊÇ˳Ðò±éÀúlarge¹ÜÀíµÄ´ó¿éÄÚ´æÁ´±í¡£ËùÒÔЧÂʱȽϵÍÏ¡£Èç¹ûÔÚÕâ¸öÁ´±íÖÐÕÒµ½ÁËÕâ¿éÄڴ棬ÔòÊÍ·Å£¬²¢·µ»ØNGX_OK¡£·ñÔò·µ»ØNGX_DECLINED¡£
ÓÉÓÚÕâ¸ö²Ù×÷ЧÂʱȽϵÍÏ£¬³ý·Ç±ØÒª£¬Ò²¾ÍÊÇ˵Õâ¿éÄÚ´æ·Ç³£´ó£¬È·Ó¦¼°Ê±ÊÍ·Å£¬·ñÔòÒ»°ã²»ÐèÒªµ÷Ó᣷´ÕýÄÚ´æÔÚÕâ¸öpool±»Ïú»ÙµÄʱºò£¬×ܹé»á¶¼ÊͷŵôµÄÂ
ngx_pool_cleanup_t *ngx_pool_cleanup_add(ngx_pool_t *p, size_t size); |
ngx_pool_tÖеÄcleanup×ֶιÜÀí×ÅÒ»¸öÌØÊâµÄÁ´±í£¬¸ÃÁ´±íµÄÿһÏî¶¼¼Ç¼×ÅÒ»¸öÌØÊâµÄÐèÒªÊͷŵÄ×ÊÔ´¡£¶ÔÓÚÕâ¸öÁ´±íÖÐÿ¸ö½ÚµãËù°üº¬µÄ×ÊÔ´ÈçºÎÈ¥ÊÍ·Å£¬ÊÇ×Ô˵Ã÷µÄ¡£ÕâÒ²¾ÍÌṩÁ˷dz£´óµÄÁé»îÐÔ¡£Òâζ×Å£¬ngx_pool_t²»½ö½ö¿ÉÒÔ¹ÜÀíÄڴ棬ͨ¹ýÕâ¸ö»úÖÆ£¬Ò²¿ÉÒÔ¹ÜÀíÈκÎÐèÒªÊͷŵÄ×ÊÔ´£¬ÀýÈ磬¹Ø±ÕÎļþ£¬»òÕßɾ³ýÎļþµÈµÈ¡£ÏÂÃæÎÒÃÇ¿´Ò»ÏÂÕâ¸öÁ´±íÿ¸ö½ÚµãµÄÀàÐÍ:
typedef struct ngx_pool_cleanup_s ngx_pool_cleanup_t; typedef void (*ngx_pool_cleanup_pt)(void *data);
struct ngx_pool_cleanup_s {
ngx_pool_cleanup_pt handler;
void *data;
ngx_pool_cleanup_t *next;
}; |
data: Ö¸Ã÷Á˸ýڵãËù¶ÔÓ¦µÄ×ÊÔ´¡£
handler: ÊÇÒ»¸öº¯ÊýÖ¸Õ룬ָÏòÒ»¸ö¿ÉÒÔÊÍ·ÅdataËù¶ÔÓ¦×ÊÔ´µÄº¯Êý¡£¸Ãº¯ÊýÖ»ÓÐÒ»¸ö²ÎÊý£¬¾ÍÊÇdata¡£
next: Ö¸Ïò¸ÃÁ´±íÖÐÏÂÒ»¸öÔªËØ¡£
¿´µ½ÕâÀngx_pool_cleanup_addÕâ¸öº¯ÊýµÄÓ÷¨£¬ÎÒÏàÐÅ´ó¼Ò¶¼Ó¦¸ÃÓÐһЩÃ÷°×ÁË¡£µ«ÊÇÕâ¸ö²ÎÊýsizeÊÇÆðʲô×÷ÓõÄÄØ£¿Õâ¸ö
size¾ÍÊÇÒª´æ´¢Õâ¸ödata×Ö¶ÎËùÖ¸ÏòµÄ×ÊÔ´µÄ´óС£¬¸Ãº¯Êý»áΪdata·ÖÅäsize´óСµÄ¿Õ¼ä¡£
±ÈÈçÎÒÃÇÐèÒª×îºóɾ³ýÒ»¸öÎļþ¡£ÄÇÎÒÃÇÔÚµ÷ÓÃÕâ¸öº¯ÊýµÄʱºò£¬°ÑsizeÖ¸¶¨Îª´æ´¢ÎļþÃûµÄ×Ö·û´®µÄ´óС£¬È»ºóµ÷ÓÃÕâ¸öº¯Êý¸øcleanupÁ´±íÖÐÔö¼ÓÒ»Ïî¡£¸Ãº¯Êý»á·µ»ØÐÂÌí¼ÓµÄÕâ¸ö½Úµã¡£ÎÒÃÇÈ»ºó°ÑÕâ¸ö½ÚµãÖеÄdata×ֶο½±´ÎªÎļþÃû¡£°Ñhander×ֶθ³ÖµÎªÒ»¸öɾ³ýÎļþµÄº¯Êý£¨µ±È»¸Ãº¯ÊýµÄÔÐÍÒª°´ÕÕvoid
(*ngx_pool_cleanup_pt)(void *data)£©¡£
void ngx_destroy_pool(ngx_pool_t *pool); |
¸Ãº¯Êý¾ÍÊÇÊÍ·ÅpoolÖгÖÓеÄËùÓÐÄڴ棬ÒÔ¼°ÒÀ´Îµ÷ÓÃcleanup×Ö¶ÎËù¹ÜÀíµÄÁ´±íÖÐÿ¸öÔªËØµÄhandler×Ö¶ÎËùÖ¸ÏòµÄº¯Êý£¬À´ÊͷŵôËùÓиÃpool¹ÜÀíµÄ×ÊÔ´¡£²¢ÇÒ°ÑpoolÖ¸ÏòµÄngx_pool_tÒ²ÊͷŵôÁË£¬ÍêÈ«²»¿ÉÓÃÁË¡£
void ngx_reset_pool(ngx_pool_t *pool); |
¸Ãº¯ÊýÊÍ·ÅpoolÖÐËùÓдó¿éÄÚ´æÁ´±íÉϵÄÄڴ棬С¿éÄÚ´æÁ´ÉϵÄÄÚ´æ¿é¶¼ÐÞ¸ÄΪ¿ÉÓᣵ«ÊDz»»áÈ¥´¦ÀícleanupÁ´±íÉϵÄÏîÄ¿¡£
ngx_array_t(100%)
ngx_array_tÊÇnginxÄÚ²¿Ê¹ÓõÄÊý×é½á¹¹¡£nginxµÄÊý×é½á¹¹ÔÚ´æ´¢ÉÏÓë´ó¼ÒÈÏÖªµÄCÓïÑÔÄÚÖõÄÊý×éÓÐÏàËÆÐÔ£¬±ÈÈçʵ¼ÊÉÏ´æ´¢Êý¾ÝµÄÇøÓòÒ²ÊÇÒ»´ó¿éÁ¬ÐøµÄÄÚ´æ¡£µ«ÊÇÊý×é³ýÁË´æ´¢Êý¾ÝµÄÄÚ´æÒÔÍ⻹°üº¬Ò»Ð©ÔªÐÅÏ¢À´ÃèÊöÏà¹ØµÄһЩÐÅÏ¢¡£ÏÂÃæÎÒÃÇ´ÓÊý×éµÄ¶¨ÒåÉÏÀ´ÏêϸµÄÁ˽âһϡ£ngx_array_tµÄ¶¨ÒåλÓÚsrc/core/ngx_array.c|hÀïÃæ¡£
typedef struct ngx_array_s ngx_array_t; struct ngx_array_s { void *elts; ngx_uint_t nelts; size_t size; ngx_uint_t nalloc; ngx_pool_t *pool; }; |
elts: Ö¸Ïòʵ¼ÊµÄÊý¾Ý´æ´¢ÇøÓò¡£
nelts: Êý×éʵ¼ÊÔªËØ¸öÊý¡£
size: Êý×éµ¥¸öÔªËØµÄ´óС£¬µ¥Î»ÊÇ×Ö½Ú¡£
nalloc: Êý×éµÄÈÝÁ¿¡£±íʾ¸ÃÊý×éÔÚ²»Òý·¢À©ÈݵÄǰÌáÏ£¬¿ÉÒÔ×î¶à´æ´¢µÄÔªËØµÄ¸öÊý¡£µ±neltsÔö³¤µ½´ïnalloc
ʱ£¬Èç¹ûÔÙÍù´ËÊý×éÖÐ´æ´¢ÔªËØ£¬Ôò»áÒý·¢Êý×éµÄÀ©ÈÝ¡£Êý×éµÄÈÝÁ¿½«»áÀ©Õ¹µ½ÔÓÐÈÝÁ¿µÄ2±¶´óС¡£Êµ¼ÊÉÏÊÇ·ÖÅäеÄÒ»¿éÄڴ棬еÄÒ»¿éÄÚ´æµÄ´óСÊÇÔÓÐÄÚ´æ´óСµÄ2±¶¡£ÔÓеÄÊý¾Ý»á±»¿½±´µ½ÐµÄÒ»¿éÄÚ´æÖС£
pool: ¸ÃÊý×éÓÃÀ´·ÖÅäÄÚ´æµÄÄÚ´æ³Ø¡£
ÏÂÃæ½éÉÜngx_array_tÏà¹Ø²Ù×÷º¯Êý¡£
ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size); |
´´½¨Ò»¸öеÄÊý×é¶ÔÏ󣬲¢·µ»ØÕâ¸ö¶ÔÏó¡£
p: Êý×é·ÖÅäÄÚ´æÊ¹ÓõÄÄÚ´æ³Ø£»
n: Êý×éµÄ³õʼÈÝÁ¿´óС£¬¼´ÔÚ²»À©ÈݵÄÇé¿öÏÂ×î¶à¿ÉÒÔÈÝÄɵÄÔªËØ¸öÊý¡£
size: µ¥¸öÔªËØµÄ´óС£¬µ¥Î»ÊÇ×Ö½Ú¡£
void ngx_array_destroy(ngx_array_t *a); |
Ïú»Ù¸ÃÊý×é¶ÔÏ󣬲¢ÊÍ·ÅÆä·ÖÅäµÄÄÚ´æ»ØÄÚ´æ³Ø¡£
void *ngx_array_push(ngx_array_t *a); |
ÔÚÊý×éaÉÏÐÂ×·¼ÓÒ»¸öÔªËØ£¬²¢·µ»ØÖ¸ÏòÐÂÔªËØµÄÖ¸Õë¡£ÐèÒª°Ñ·µ»ØµÄÖ¸ÕëʹÓÃÀàÐÍת»»£¬×ª»»Îª¾ßÌåµÄÀàÐÍ£¬È»ºóÔÙ¸øÐÂÔªËØ±¾Éí»òÕßÊǸ÷×ֶΣ¨Èç¹ûÊý×éµÄÔªËØÊǸ´ÔÓÀàÐÍ£©¸³Öµ¡£
void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n); |
ÔÚÊý×éaÉÏ×·¼Ón¸öÔªËØ£¬²¢·µ»ØÖ¸ÏòÕâЩ׷¼ÓÔªËØµÄÊ׸öÔªËØµÄλÖõÄÖ¸Õë¡£
static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size); |
Èç¹ûÒ»¸öÊý×é¶ÔÏóÊDZ»·ÖÅäÔÚ¶ÑÉϵģ¬ÄÇôµ±µ÷ÓÃngx_array_destroyÏú»ÙÒÔºó£¬Èç¹ûÏëÔÙ´ÎʹÓ㬾ͿÉÒÔµ÷Óô˺¯Êý¡£
Èç¹ûÒ»¸öÊý×é¶ÔÏóÊDZ»·ÖÅäÔÚÕ»Éϵģ¬ÄÇô¾ÍÐèÒªµ÷Óô˺¯Êý£¬½øÐгõʼ»¯µÄ¹¤×÷ÒԺ󣬲ſÉÒÔʹÓá£
×¢ÒâÊÂÏî: ÓÉÓÚʹÓÃngx_palloc·ÖÅäÄڴ棬Êý×éÔÚÀ©ÈÝʱ£¬¾ÉµÄÄÚ´æ²»»á±»ÊÍ·Å£¬»áÔì³ÉÄÚ´æµÄÀË·Ñ¡£Òò´Ë£¬×îºÃÄÜÌáǰ¹æ»®ºÃÊý×éµÄÈÝÁ¿£¬ÔÚ´´½¨»òÕß³õʼ»¯µÄʱºòÒ»´Î¸ã¶¨£¬±ÜÃâ¶à´ÎÀ©ÈÝ£¬Ôì³ÉÄÚ´æÀË·Ñ¡£
ngx_hash_t(100%)
ngx_hash_tÊÇnginx×Ô¼ºµÄhash±íµÄʵÏÖ¡£¶¨ÒåºÍʵÏÖλÓÚsrc/core/ngx_hash.h|cÖС£ngx_hash_tµÄʵÏÖÒ²ÓëÊý¾Ý½á¹¹½Ì¿ÆÊéÉÏËùÃèÊöµÄhash±íµÄʵÏÖÊÇ´óͬСÒì¡£¶ÔÓÚ³£ÓõĽâ¾ö³åÍ»µÄ·½·¨ÓÐÏßÐÔ̽²â£¬¶þ´Î̽²âºÍ¿ªÁ´·¨µÈ¡£ngx_hash_tʹÓõÄÊÇ×î³£ÓõÄÒ»ÖÖ£¬Ò²¾ÍÊÇ¿ªÁ´·¨£¬ÕâÒ²ÊÇSTLÖеÄhash±íʹÓõķ½·¨¡£
µ«ÊÇngx_hash_tµÄʵÏÖÓÖÓÐÆä¼¸¸öÏÔÖøµÄÌØµã:
ngx_hash_t²»ÏñÆäËûµÄhash±íµÄʵÏÖ£¬¿ÉÒÔ²åÈëɾ³ýÔªËØ£¬ËüÖ»ÄÜÒ»´Î³õʼ»¯£¬¾Í¹¹½¨ÆðÕû¸öhash±íÒԺ󣬼Ȳ»ÄÜÔÙɾ³ý£¬Ò²²»ÄÜÔÚ²åÈëÔªËØÁË¡£
ngx_hash_tµÄ¿ªÁ´²¢²»ÊÇÕæµÄ¿ªÁËÒ»¸öÁ´±í£¬Êµ¼ÊÉÏÊÇ¿ªÁËÒ»¶ÎÁ¬ÐøµÄ´æ´¢¿Õ¼ä£¬¼¸ºõ¿ÉÒÔ¿´×öÊÇÒ»¸öÊý×é¡£ÕâÊÇÒòΪngx_hash_tÔÚ³õʼ»¯µÄʱºò£¬»á¾ÀúÒ»´ÎÔ¤¼ÆËãµÄ¹ý³Ì£¬Ìáǰ°Ñÿ¸öͰÀïÃæ»áÓжàÉÙÔªËØ·Å½øÈ¥¸ø¼ÆËã³öÀ´£¬ÕâÑù¾ÍÌáǰ֪µÀÿ¸öͰµÄ´óСÁË¡£ÄÇô¾Í²»ÐèҪʹÓÃÁ´±í£¬Ò»¶ÎÁ¬ÐøµÄ´æ´¢¿Õ¼ä¾Í×ã¹»ÁË¡£ÕâÒ²´ÓÒ»¶¨³Ì¶ÈÉϽÚÊ¡ÁËÄÚ´æµÄʹÓá£
´ÓÉÏÃæµÄÃèÊö£¬ÎÒÃÇ¿ÉÒÔ¿´³öÀ´£¬Õâ¸öÖµÔ½´ó£¬Ô½Ôì³ÉÄÚ´æµÄÀË·Ñ¡£¾ÍÁ½²½£¬Ê×ÏÈÊdzõʼ»¯£¬È»ºó¾Í¿ÉÒÔÔÚÀïÃæ½øÐвéÕÒÁË¡£ÏÂÃæÎÒÃÇÏêϸÀ´¿´Ò»Ï¡£
ngx_hash_tµÄ³õʼ»¯¡£
ngx_int_t ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts); |
Ê×ÏÈÎÒÃÇÀ´¿´Ò»Ï³õʼ»¯º¯Êý¡£¸Ãº¯ÊýµÄµÚÒ»¸ö²ÎÊýhinitÊdzõʼ»¯µÄһЩ²ÎÊýµÄÒ»¸ö¼¯ºÏ¡£
namesÊdzõʼ»¯Ò»¸öngx_hash_tËùÐèÒªµÄËùÓÐkeyµÄÒ»¸öÊý×é¡£¶ønelts¾ÍÊÇkeyµÄ¸öÊý¡£ÏÂÃæÏÈ¿´Ò»ÏÂngx_hash_init_tÀàÐÍ£¬¸ÃÀàÐÍÌṩÁ˳õʼ»¯Ò»¸öhash±íËùÐèÒªµÄһЩ»ù±¾ÐÅÏ¢¡£
typedef struct { ngx_hash_t *hash; ngx_hash_key_pt key;
ngx_uint_t max_size;
ngx_uint_t bucket_size;
char *name;
ngx_pool_t *pool;
ngx_pool_t *temp_pool;
} ngx_hash_init_t; |
hash: ¸Ã×Ö¶ÎÈç¹ûΪNULL£¬ÄÇôµ÷ÓÃÍê³õʼ»¯º¯Êýºó£¬¸Ã×Ö¶ÎÖ¸Ïòд´½¨³öÀ´µÄhash±í¡£Èç¹û¸Ã×ֶβ»ÎªNULL£¬ÄÇôÔÚ³õʼµÄʱºò£¬ËùÓеÄÊý¾Ý±»²åÈëÁËÕâ¸ö×Ö¶ÎËùÖ¸µÄhash±íÖС£
key: Ö¸Ïò´Ó×Ö·û´®Éú³ÉhashÖµµÄhashº¯Êý¡£nginxµÄÔ´´úÂëÖÐÌṩÁËĬÈϵÄʵÏÖº¯Êýngx_hash_key_lc¡£
max_size: hash±íÖеÄͰµÄ¸öÊý¡£¸Ã×Ö¶ÎÔ½´ó£¬ÔªËش洢ʱ³åÍ»µÄ¿ÉÄÜÐÔԽС£¬Ã¿¸öͰÖд洢µÄÔªËØ»á¸üÉÙ£¬Ôò²éѯÆðÀ´µÄËٶȸü¿ì¡£µ±È»£¬Õâ¸öÖµÔ½´ó£¬Ô½Ôì³ÉÄÚ´æµÄÀË·ÑÒ²Ô½´ó£¬(ʵ¼ÊÉÏÒ²À˷Ѳ»Á˶àÉÙ)¡£
bucket_size: ÿ¸öͰµÄ×î´óÏÞÖÆ´óС£¬µ¥Î»ÊÇ×Ö½Ú¡£Èç¹ûÔÚ³õʼ»¯Ò»¸öhash±íµÄʱºò£¬·¢ÏÖij¸öͰÀïÃæÎÞ·¨´æµÄÏÂËùÓÐÊôÓÚ¸ÃͰµÄÔªËØ£¬Ôòhash±í³õʼ»¯Ê§°Ü¡£
name: ¸Ãhash±íµÄÃû×Ö¡£
pool: ¸Ãhash±í·ÖÅäÄÚ´æÊ¹ÓõÄpool¡£
temp_pool: ¸Ãhash±íʹÓõÄÁÙʱpool£¬ÔÚ³õʼ»¯Íê³ÉÒԺ󣬸Ãpool¿ÉÒÔ±»ÊͷźÍÏú»Ùµô¡£
ÏÂÃæÀ´¿´Ò»Ï´洢hash±íkeyµÄÊý×éµÄ½á¹¹¡£
typedef struct { ngx_str_t key; ngx_uint_t key_hash; void *value; } ngx_hash_key_t; |
keyºÍvalueµÄº¬ÒåÏÔ¶øÒ×¼û£¬¾Í²»ÓýâÊÍÁË¡£key_hashÊǶÔkeyʹÓÃhashº¯Êý¼ÆËã³öÀ´µÄÖµ¡£
¶ÔÕâÁ½¸ö½á¹¹·ÖÎöÍê³ÉÒÔºó£¬ÎÒÏë´ó¼ÒÓ¦¸Ã¶¼ÒѾÃ÷°×Õâ¸öº¯ÊýÓ¦¸ÃÊÇÈçºÎʹÓÃÁ˰ɡ£¸Ãº¯Êý³É¹¦³õʼ»¯Ò»¸öhash±íÒԺ󣬷µ»ØNGX_OK£¬·ñÔò·µ»ØNGX_ERROR¡£
void *ngx_hash_find(ngx_hash_t *hash, ngx_uint_t key, u_char *name, size_t len); |
ÔÚhashÀïÃæ²éÕÒkey¶ÔÓ¦µÄvalue¡£Êµ¼ÊÉÏÕâÀïµÄkeyÊǶÔÕæÕýµÄkey£¨Ò²¾ÍÊÇname£©¼ÆËã³öµÄhashÖµ¡£lenÊÇnameµÄ³¤¶È¡£
Èç¹û²éÕҳɹ¦£¬Ôò·µ»ØÖ¸ÏòvalueµÄÖ¸Õ룬·ñÔò·µ»ØNULL¡£
ngx_hash_wildcard_t(100%)
nginxΪÁË´¦Àí´øÓÐͨÅä·ûµÄÓòÃûµÄÆ¥ÅäÎÊÌ⣬ʵÏÖÁËngx_hash_wildcard_tÕâÑùµÄhash±í¡£Ëû¿ÉÒÔÖ§³ÖÁ½ÖÖÀàÐ͵ĴøÓÐͨÅä·ûµÄÓòÃû¡£Ò»ÖÖÊÇͨÅä·ûÔÚǰµÄ£¬ÀýÈ磺¡°*.abc.com¡±£¬Ò²¿ÉÒÔÊ¡ÂÔµôÐǺţ¬Ö±½Óд³É¡±.abc.com¡±¡£ÕâÑùµÄkey£¬¿ÉÒÔÆ¥Åäwww.abc.com£¬qqq.www.abc.comÖ®ÀàµÄ¡£ÁíÍâÒ»ÖÖÊÇͨÅä·ûÔÚĩβµÄ£¬ÀýÈ磺¡°mail.xxx.*¡±£¬ÇëÌØ±ð×¢ÒâͨÅä·ûÔÚĩβµÄ²»ÏñλÓÚ¿ªÊ¼µÄͨÅä·û¿ÉÒÔ±»Ê¡ÂÔµô¡£ÕâÑùµÄͨÅä·û£¬¿ÉÒÔÆ¥Åämail.xxx.com¡¢mail.xxx.com.cn¡¢mail.xxx.netÖ®ÀàµÄÓòÃû¡£
ÓÐÒ»µã±ØÐë˵Ã÷£¬¾ÍÊÇÒ»¸öngx_hash_wildcard_tÀàÐ͵Ähash±íÖ»Äܰüº¬Í¨Åä·ûÔÚǰµÄkey»òÕßÊÇͨÅä·ûÔÚºóµÄkey¡£²»ÄÜͬʱ°üº¬Á½ÖÖÀàÐ͵ÄͨÅä·ûµÄkey¡£ngx_hash_wildcard_tÀàÐͱäÁ¿µÄ¹¹½¨ÊÇͨ¹ýº¯Êýngx_hash_wildcard_initÍê³ÉµÄ£¬¶ø²éѯÊÇͨ¹ýº¯Êýngx_hash_find_wc_head»òÕßngx_hash_find_wc_tailÀ´×öµÄ¡£ngx_hash_find_wc_headÊDzéѯ°üº¬Í¨Åä·ûÔÚǰµÄkeyµÄhash±íµÄ£¬¶øngx_hash_find_wc_tailÊDzéѯ°üº¬Í¨Åä·ûÔÚºóµÄkeyµÄhash±íµÄ¡£
ÏÂÃæÏêϸ˵Ã÷Õ⼸¸öº¯ÊýµÄÓ÷¨¡£
ngx_int_t ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts); |
¸Ãº¯ÊýÓÀ´¹¹½¨Ò»¸ö¿ÉÒÔ°üº¬Í¨Åä·ûkeyµÄhash±í¡£
hinit: ¹¹ÔìÒ»¸öͨÅä·ûhash±íµÄһЩ²ÎÊýµÄÒ»¸ö¼¯ºÏ¡£¹ØÓڸòÎÊý¶ÔÓ¦µÄÀàÐ͵Ä˵Ã÷£¬Çë²Î¼ûngx_hash_tÀàÐÍÖÐngx_hash_initº¯ÊýµÄ˵Ã÷¡£
names: ¹¹Ôì´Ëhash±íµÄËùÓеÄͨÅä·ûkeyµÄÊý×é¡£ÌØ±ðҪעÒâµÄÊÇÕâÀïµÄkeyÒѾ¶¼ÊDZ»Ô¤´¦Àí¹ýµÄ¡£ÀýÈ磺¡°*.abc.com¡±»òÕß¡°.abc.com¡±±»Ô¤´¦ÀíÍê³ÉÒԺ󣬱ä³ÉÁË¡°com.abc.¡±¡£¶ø¡°mail.xxx.*¡±Ôò±»Ô¤´¦ÀíΪ¡°mail.xxx.¡±¡£ÎªÊ²Ã´»á±»´¦ÀíÕâÑù£¿ÕâÀï²»µÃ²»¼òµ¥µØÃèÊöÒ»ÏÂͨÅä·ûhash±íµÄʵÏÖÔÀí¡£µ±¹¹Ôì´ËÀàÐ͵Ähash±íµÄʱºò£¬Êµ¼ÊÉÏÊǹ¹ÔìÁËÒ»¸öhash±íµÄÒ»¸ö¡°Á´±í¡±£¬ÊÇͨ¹ýhash±íÖеÄkey¡°Á´½Ó¡±ÆðÀ´µÄ¡£±ÈÈ磺¶ÔÓÚ¡°*.abc.com¡±½«»á¹¹Ôì³ö2¸öhash±í£¬µÚÒ»¸öhash±íÖÐÓÐÒ»¸ökeyΪcomµÄ±íÏ¸Ã±íÏîµÄvalue°üº¬ÓÐÖ¸ÏòµÚ¶þ¸öhash±íµÄÖ¸Õ룬¶øµÚ¶þ¸öhash±íÖÐÓÐÒ»¸ö±íÏîabc£¬¸Ã±íÏîµÄvalue°üº¬ÓÐÖ¸Ïò*.abc.com¶ÔÓ¦µÄvalueµÄÖ¸Õë¡£ÄÇô²éѯµÄʱºò£¬±ÈÈç²éѯwww.abc.comµÄʱºò£¬ÏȲécom£¬Í¨¹ý²écom¿ÉÒÔÕÒµ½µÚ¶þ¼¶µÄhash±í£¬ÔÚµÚ¶þ¼¶hash±íÖУ¬ÔÙ²éÕÒabc£¬ÒÀ´ÎÀàÍÆ£¬Ö±µ½ÔÚijһ¼¶µÄhash±íÖв鵽µÄ±íÏî¶ÔÓ¦µÄvalue¶ÔÓ¦Ò»¸öÕæÕýµÄÖµ¶ø·ÇÒ»¸öÖ¸ÏòÏÂÒ»¼¶hash±íµÄÖ¸ÕëµÄʱºò£¬²éѯ¹ý³Ì½áÊø¡£ÕâÀïÓÐÒ»µãÐèÒªÌØ±ð×¢ÒâµÄ£¬¾ÍÊÇnamesÊý×éÖÐÔªËØµÄvalueÖµµÍÁ½Î»bit±ØÐëΪ0£¨ÓÐÌØÊâÓÃ;£©¡£Èç¹û²»Âú×ãÕâ¸öÌõ¼þ£¬Õâ¸öhash±í²éѯ²»³öÕýÈ·½á¹û¡£
nelts: namesÊý×éÔªËØµÄ¸öÊý¡£
¸Ãº¯ÊýÖ´Ðгɹ¦·µ»ØNGX_OK£¬·ñÔòNGX_ERROR¡£
void *ngx_hash_find_wc_head(ngx_hash_wildcard_t *hwc, u_char *name, size_t len); |
¸Ãº¯Êý²éѯ°üº¬Í¨Åä·ûÔÚǰµÄkeyµÄhash±íµÄ¡£
hwc: hash±í¶ÔÏóµÄÖ¸Õë¡£
name: ÐèÒª²éѯµÄÓòÃû£¬ÀýÈç: www.abc.com¡£
len: nameµÄ³¤¶È¡£
¸Ãº¯Êý·µ»ØÆ¥ÅäµÄͨÅä·û¶ÔÓ¦value¡£Èç¹ûûÓв鵽£¬·µ»ØNULL¡£
void *ngx_hash_find_wc_tail(ngx_hash_wildcard_t *hwc, u_char *name, size_t len); |
¸Ãº¯Êý²éѯ°üº¬Í¨Åä·ûÔÚĩβµÄkeyµÄhash±íµÄ¡£ ²ÎÊý¼°·µ»ØÖµÇë²Î¼ÓÉϸöº¯ÊýµÄ˵Ã÷¡£
ngx_hash_combined_t(100%)
×éºÏÀàÐÍhash±í£¬¸Ãhash±íµÄ¶¨ÒåÈçÏ£º
typedef struct { ngx_hash_t hash; ngx_hash_wildcard_t *wc_head; ngx_hash_wildcard_t *wc_tail; } ngx_hash_combined_t; |
´ÓÆä¶¨ÒåÏÔ¼û£¬¸ÃÀàÐÍʵ¼ÊÉϰüº¬ÁËÈý¸öhash±í£¬Ò»¸öÆÕͨhash±í£¬Ò»¸ö°üº¬Ç°ÏòͨÅä·ûµÄhash±íºÍÒ»¸ö°üº¬ºóÏòͨÅä·ûµÄhash±í¡£
nginxÌṩ¸ÃÀàÐ͵Ä×÷Óã¬ÔÚÓÚÌṩһ¸ö·½±ãµÄÈÝÆ÷°üº¬Èý¸öÀàÐ͵Ähash±í£¬µ±Óаüº¬Í¨Åä·ûµÄºÍ²»°üº¬Í¨Åä·ûµÄÒ»×ékey¹¹½¨hash±íÒÔºó£¬ÒÔÒ»ÖÖ·½±ãµÄ·½Ê½À´²éѯ£¬Äã²»ÐèÒªÔÙ¿¼ÂÇÒ»¸ökeyµ½µ×ÊÇÓ¦¸Ãµ½ÄĸöÀàÐ͵Ähash±íÀïÈ¥²éÁË¡£
¹¹ÔìÕâÑùÒ»×éºÏhash±íµÄʱºò£¬Ê×Ïȶ¨ÒåÒ»¸ö¸ÃÀàÐ͵ıäÁ¿£¬ÔÙ·Ö±ð¹¹ÔìÆä°üº¬µÄÈý¸ö×Óhash±í¼´¿É¡£
¶ÔÓÚ¸ÃÀàÐÍhash±íµÄ²éѯ£¬nginxÌṩÁËÒ»¸ö·½±ãµÄº¯Êýngx_hash_find_combined¡£
void *ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key, u_char *name, size_t len); |
¸Ãº¯ÊýÔÚ´Ë×éºÏhash±íÖУ¬ÒÀ´Î²éѯÆäÈý¸ö×Óhash±í£¬¿´ÊÇ·ñÆ¥Å䣬һµ©ÕÒµ½£¬Á¢¼´·µ»Ø²éÕÒ½á¹û£¬Ò²¾ÍÊÇ˵Èç¹ûÓжà¸ö¿ÉÄÜÆ¥Å䣬ÔòÖ»·µ»ØµÚÒ»¸öÆ¥ÅäµÄ½á¹û¡£
hash: ´Ë×éºÏhash±í¶ÔÏó¡£
key: ¸ù¾Ýname¼ÆËã³öµÄhashÖµ¡£
name: keyµÄ¾ßÌåÄÚÈÝ¡£
len: nameµÄ³¤¶È¡£
·µ»Ø²éѯµÄ½á¹û£¬Î´²éµ½Ôò·µ»ØNULL¡£
ngx_hash_keys_arrays_t(100%)
´ó¼Ò¿´µ½ÔÚ¹¹½¨Ò»¸öngx_hash_wildcard_tµÄʱºò£¬ÐèÒª¶ÔͨÅä·ûµÄÄÄЩkey½øÐÐÔ¤´¦Àí¡£Õâ¸ö´¦ÀíÆðÀ´±È½ÏÂé·³¡£¶øµ±ÓÐÒ»×ékey£¬ÕâЩÀïÃæ¼ÈÓÐÎÞͨÅä·ûµÄkey£¬Ò²Óаüº¬Í¨Åä·ûµÄkeyµÄʱºò¡£ÎÒÃǾÍÐèÒª¹¹½¨Èý¸öhash±í£¬Ò»¸ö°üº¬ÆÕͨµÄkeyµÄhash±í£¬Ò»¸ö°üº¬Ç°ÏòͨÅä·ûµÄhash±í£¬Ò»¸ö°üº¬ºóÏòͨÅä·ûµÄhash±í£¨»òÕßÒ²¿ÉÒÔ°ÑÕâÈý¸öhash±í×éºÏ³ÉÒ»¸öngx_hash_combined_t£©¡£ÔÚÕâÖÖÇé¿öÏ£¬ÎªÁËÈôó¼Ò·½±ãµÄ¹¹ÔìÕâЩhash±í£¬nginxÌṩ¸øÁ˴˸¨ÖúÀàÐÍ¡£
¸ÃÀàÐÍÒÔ¼°Ïà¹ØµÄ²Ù×÷º¯ÊýÒ²¶¨ÒåÔÚsrc/core/ngx_hash.h|cÀï¡£ÎÒÃÇÏÈÀ´¿´Ò»Ï¸ÃÀàÐ͵͍Òå¡£
typedef struct {
ngx_uint_t hsize;
ngx_pool_t *pool;
ngx_pool_t *temp_pool;
ngx_array_t keys;
ngx_array_t *keys_hash;
ngx_array_t dns_wc_head;
ngx_array_t *dns_wc_head_hash;
ngx_array_t dns_wc_tail;
ngx_array_t *dns_wc_tail_hash;
} ngx_hash_keys_arrays_t; |
hsize: ½«Òª¹¹½¨µÄhash±íµÄͰµÄ¸öÊý¡£¶ÔÓÚʹÓÃÕâ¸ö½á¹¹Öаüº¬µÄÐÅÏ¢¹¹½¨µÄÈýÖÖÀàÐ͵Ähash±í¶¼»áʹÓô˲ÎÊý¡£
pool: ¹¹½¨ÕâЩhash±íʹÓõÄpool¡£
temp_pool: ÔÚ¹¹½¨Õâ¸öÀàÐÍÒÔ¼°×îÖÕµÄÈý¸öhash±í¹ý³ÌÖпÉÄÜÓõ½ÁÙʱpool¡£¸Ãtemp_pool¿ÉÒÔÔÚ¹¹½¨Íê³ÉÒԺ󣬱»Ïú»Ùµô¡£ÕâÀïÖ»ÊÇ´æ·ÅÁÙʱµÄһЩÄÚ´æÏûºÄ¡£
keys: ´æ·ÅËùÓзÇͨÅä·ûkeyµÄÊý×é¡£
keys_hash: ÕâÊǸö¶þάÊý×飬µÚÒ»¸öά¶È´ú±íµÄÊÇbucketµÄ±àºÅ£¬ÄÇôkeys_hash[i]Öдæ·ÅµÄÊÇËùÓеÄkeyËã³öÀ´µÄhashÖµ¶ÔhsizeȡģÒÔºóµÄֵΪiµÄkey¡£¼ÙÉèÓÐ3¸ökey,·Ö±ðÊÇkey1,key2ºÍkey3¼ÙÉèhashÖµËã³öÀ´ÒÔºó¶ÔhsizeȡģµÄÖµ¶¼ÊÇi£¬ÄÇôÕâÈý¸ökeyµÄÖµ¾Í˳Ðò´æ·ÅÔÚkeys_hash[i][0],keys_hash[i][1],
keys_hash[i][2]¡£¸ÃÖµÔÚµ÷ÓõĹý³ÌÖÐÓÃÀ´±£´æºÍ¼ì²âÊÇ·ñÓгåÍ»µÄkeyÖµ£¬Ò²¾ÍÊÇÊÇ·ñÓÐÖØ¸´¡£
dns_wc_head: ·ÅǰÏòͨÅä·ûkey±»´¦ÀíÍê³ÉÒÔºóµÄÖµ¡£±ÈÈ磺¡°*.abc.com¡±
±»´¦ÀíÍê³ÉÒԺ󣬱ä³É ¡°com.abc.¡± ±»´æ·ÅÔÚ´ËÊý×éÖС£
dns_wc_tail: ´æ·ÅºóÏòͨÅä·ûkey±»´¦ÀíÍê³ÉÒÔºóµÄÖµ¡£±ÈÈ磺¡°mail.xxx.*¡±
±»´¦ÀíÍê³ÉÒԺ󣬱ä³É ¡°mail.xxx.¡± ±»´æ·ÅÔÚ´ËÊý×éÖС£
dns_wc_head_hash:
¸ÃÖµÔÚµ÷ÓõĹý³ÌÖÐÓÃÀ´±£´æºÍ¼ì²âÊÇ·ñÓгåÍ»µÄǰÏòͨÅä·ûµÄkeyÖµ£¬Ò²¾ÍÊÇÊÇ·ñÓÐÖØ¸´¡£
dns_wc_tail_hash:
¸ÃÖµÔÚµ÷ÓõĹý³ÌÖÐÓÃÀ´±£´æºÍ¼ì²âÊÇ·ñÓгåÍ»µÄºóÏòͨÅä·ûµÄkeyÖµ£¬Ò²¾ÍÊÇÊÇ·ñÓÐÖØ¸´¡£
ÔÚ¶¨ÒåÒ»¸öÕâ¸öÀàÐ͵ıäÁ¿£¬²¢¶Ô×Ö¶ÎpoolºÍtemp_pool¸³ÖµÒԺ󣬾ͿÉÒÔµ÷Óú¯Êýngx_hash_add_key°ÑËùÓеÄkey¼ÓÈëµ½Õâ¸ö½á¹¹ÖÐÁË£¬¸Ãº¯Êý»á×Ô¶¯ÊµÏÖÆÕͨkey£¬´øÇ°ÏòͨÅä·ûµÄkeyºÍ´øºóÏòͨÅä·ûµÄkeyµÄ·ÖÀàºÍ¼ì²é£¬²¢½«Õâ¸öЩֵ´æ·Åµ½¶ÔÓ¦µÄ×Ö¶ÎÖÐÈ¥£¬
È»ºó¾Í¿ÉÒÔͨ¹ý¼ì²éÕâ¸ö½á¹¹ÌåÖеÄkeys¡¢dns_wc_head¡¢dns_wc_tailÈý¸öÊý×éÊÇ·ñΪ¿Õ£¬À´¾ö¶¨ÊÇ·ñ¹¹½¨ÆÕͨhash±í£¬Ç°ÏòͨÅä·ûhash±íºÍºóÏòͨÅä·ûhash±íÁË£¨ÔÚ¹¹½¨ÕâÈý¸öÀàÐ͵Ähash±íµÄʱºò£¬¿ÉÒÔ·Ö±ðʹÓÃkeys¡¢dns_wc_head¡¢dns_wc_tailÈý¸öÊý×飩¡£
¹¹½¨³öÕâÈý¸öhash±íÒԺ󣬿ÉÒÔ×éºÏÔÚÒ»¸öngx_hash_combined_t¶ÔÏóÖУ¬Ê¹ÓÃngx_hash_find_combined½øÐвéÕÒ¡£»òÕßÊÇÈÔÈ»±£³ÖÈý¸ö¶ÀÁ¢µÄ±äÁ¿¶ÔÓ¦ÕâÈý¸öhash±í£¬×Ô¼º¾ö¶¨ºÎʱÒÔ¼°ÔÚÄĸöhash±íÖнøÐвéѯ¡£
ngx_int_t ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type); |
³õʼ»¯Õâ¸ö½á¹¹£¬Ö÷ÒªÊǶÔÕâ¸ö½á¹¹ÖеÄngx_array_tÀàÐ͵Ä×ֶνøÐгõʼ»¯£¬³É¹¦·µ»ØNGX_OK¡£
ha: ¸Ã½á¹¹µÄ¶ÔÏóÖ¸Õë¡£
type: ¸Ã×Ö¶ÎÓÐ2¸öÖµ¿ÉÑ¡Ôñ£¬¼´NGX_HASH_SMALLºÍNGX_HASH_LARGE¡£ÓÃÀ´Ö¸Ã÷½«Òª½¨Á¢µÄhash±íµÄÀàÐÍ£¬Èç¹ûÊÇNGX_HASH_SMALL£¬ÔòÓбȽÏСµÄͰµÄ¸öÊýºÍÊý×éÔªËØ´óС¡£NGX_HASH_LARGEÔòÏà·´¡£
ngx_int_t ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key, void *value, ngx_uint_t flags); |
Ò»°ãÊÇÑ»·µ÷ÓÃÕâ¸öº¯Êý£¬°ÑÒ»×é¼üÖµ¶Ô¼ÓÈëµ½Õâ¸ö½á¹¹ÌåÖС£·µ»ØNGX_OKÊǼÓÈë³É¹¦¡£·µ»ØNGX_BUSYÒâζ×ÅkeyÖµÖØ¸´¡£
ha: ¸Ã½á¹¹µÄ¶ÔÏóÖ¸Õë¡£
key: ²ÎÊýÃû×Ô½âÊÍÁË¡£
value: ²ÎÊýÃû×Ô½âÊÍÁË¡£
flags: ÓÐÁ½¸ö±ê־λ¿ÉÒÔÉèÖã¬NGX_HASH_WILDCARD_KEYºÍNGX_HASH_READONLY_KEY¡£Í¬Ê±ÒªÉèÖõÄʹÓÃÂß¼Óë²Ù×÷·û¾Í¿ÉÒÔÁË¡£NGX_HASH_READONLY_KEY±»ÉèÖõÄʱºò£¬ÔÚ¼ÆËãhashÖµµÄʱºò£¬keyµÄÖµ²»»á±»×ª³ÉСд×Ö·û£¬·ñÔò»á¡£NGX_HASH_WILDCARD_KEY±»ÉèÖõÄʱºò£¬ËµÃ÷keyÀïÃæ¿ÉÄܺ¬ÓÐͨÅä·û£¬»á½øÐÐÏàÓ¦µÄ´¦Àí¡£Èç¹ûÁ½¸ö±ê־λ¶¼²»ÉèÖ㬴«0¡£
ÓйØÓÚÕâ¸öÊý¾Ý½á¹¹µÄʹÓ㬿ÉÒԲο¼src/http/ngx_http.cÖеÄngx_http_server_namesº¯Êý¡£
|