日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Nginx内存池--pool代码抽取(链表套路)

發(fā)布時(shí)間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nginx内存池--pool代码抽取(链表套路) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ngx_palloc.c文件

ngx_palloc_large_hm是自己寫的代碼沒有nginx原版的ngx_palloc_large寫的好,細(xì)節(jié)要品味才會發(fā)現(xiàn)nginx的美


nginx鏈表的套路,正好是兩種插入“從前插”和“從后插”,有些許差別


#include <stdio.h>
#include <stdlib.h>#define ITEM 20#define u_char unsigned char
#define ngx_free          freetypedef struct ngx_pool_s        ngx_pool_t;
typedef intptr_t        ngx_int_t;
typedef uintptr_t       ngx_uint_t;
typedef struct ngx_pool_large_s  ngx_pool_large_t;struct ngx_pool_large_s {ngx_pool_large_t     *next;void                 *alloc;
};typedef struct {u_char *last;u_char *end;ngx_pool_t *next;ngx_uint_t   failed;
}ngx_pool_data_t;struct ngx_pool_s{ngx_pool_data_t d;size_t max;ngx_pool_t *current;ngx_pool_large_t     *large;
};typedef struct  
{  int a[10];  
} data_t; 
typedef struct  
{  int a[200];  
} data_s; ngx_pool_t *ngx_create_pool(size_t size);
void *ngx_palloc(ngx_pool_t *pool,size_t size);
static void *ngx_palloc_block(ngx_pool_t *pool,size_t size);
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
static void *ngx_palloc_large_hm(ngx_pool_t *pool, size_t size);
ngx_pool_t *ngx_create_pool(size_t size)
{ngx_pool_t *p;p=(ngx_pool_t*)malloc(size);p->d.last=(u_char *)p+sizeof(ngx_pool_t);p->d.end=(u_char *)p+size;p->d.next = NULL;p->d.failed = 0;size = size - sizeof(ngx_pool_t);p->max =size;p->current = p;p->large = NULL;return p;
}void *ngx_palloc(ngx_pool_t *pool,size_t size)
{u_char      *m;ngx_pool_t  *p;if (size <= pool->max){p = pool->current;do{m = p->d.last;if ((size_t) (p->d.end - m) >= size) {p->d.last=m+size;return m;}p = p->d.next;}while(p);return ngx_palloc_block(pool,size);}return ngx_palloc_large(pool,size);
}static void* ngx_palloc_block(ngx_pool_t *pool,size_t size)
{u_char     *m;size_t       psize;ngx_pool_t *p,*neww, *current;psize = (size_t)(pool->d.end - (u_char *) pool);m=(u_char*)malloc(psize);neww=(ngx_pool_t *)m;neww->d.end=m+psize;neww->d.next = NULL;neww->d.failed = 0;m += sizeof(ngx_pool_data_t);neww->d.last=m+size;current = pool->current;for (p = current; p->d.next; p = p->d.next) {if (p->d.failed++ > 4) {current = p->d.next;}}p->d.next = neww;pool->current = current ? current : neww;return m;
}//自己寫的ngx_palloc_large  感覺沒有nginx原版寫的好 nginx寫的是 新分配的大內(nèi)存是緊挨著pool的
static void* ngx_palloc_large_hm(ngx_pool_t *pool, size_t size){ngx_pool_large_t *large,*neww;void     *m;large=pool->large;if(!large){large=malloc(sizeof(ngx_pool_large_t)+size);large->alloc=large+sizeof(ngx_pool_large_t);large->next=NULL;m=large->alloc;pool->large = large;return m;}while(large->next){large=large->next;}neww=malloc(sizeof(ngx_pool_large_t)+size);neww->alloc=neww+sizeof(ngx_pool_large_t);neww->next=NULL;m=neww->alloc;large->next=neww;return m;
}static void *
ngx_palloc_large(ngx_pool_t *pool, size_t size)
{void              *p;ngx_uint_t         n;ngx_pool_large_t  *large;p = malloc(size);if (p == NULL) {return NULL;}n = 0;for (large = pool->large; large; large = large->next) {if (large->alloc == NULL) {large->alloc = p;return p;}if (n++ > 3) {break;}}large = ngx_palloc(pool, sizeof(ngx_pool_large_t));if (large == NULL) {ngx_free(p);return NULL;}large->alloc = p;large->next = pool->large;pool->large = large;return p;
}
int main()  {   data_t *p[ITEM]; data_s *big1,*big2,*big3;ngx_pool_t *pool;int i;int k=257;pool=ngx_create_pool(128);for(i = 0; i < ITEM ;i++){p[i]=ngx_palloc(pool,sizeof(data_t));p[i]->a[0] = i; }big1=ngx_palloc(pool,sizeof(data_s));big1->a[1]=1;big2=ngx_palloc(pool,sizeof(data_s));big2->a[2]=2;big3=ngx_palloc(pool,sizeof(data_s));big3->a[3]=3;
}



總結(jié)

以上是生活随笔為你收集整理的Nginx内存池--pool代码抽取(链表套路)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。