Nginx内存池--pool代码抽取(链表套路)
生活随笔
收集整理的這篇文章主要介紹了
Nginx内存池--pool代码抽取(链表套路)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ngx_palloc.c文件
ngx_palloc_large_hm是自己寫的代碼沒有nginx原版的ngx_palloc_large寫的好,細節要品味才會發現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寫的是 新分配的大內存是緊挨著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;
}
總結
以上是生活随笔為你收集整理的Nginx内存池--pool代码抽取(链表套路)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度分析define预处理指令
- 下一篇: 浅谈无缓存I/O操作和标准I/O文件操作