96 lines
2.0 KiB
C
96 lines
2.0 KiB
C
|
|
||
|
/*
|
||
|
* Copyright (C) Igor Sysoev
|
||
|
* Copyright (C) Nginx, Inc.
|
||
|
* thread safe
|
||
|
*/
|
||
|
|
||
|
|
||
|
#ifndef _NGX_SLAB_H_INCLUDED_
|
||
|
#define _NGX_SLAB_H_INCLUDED_
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#include "hmutex.h"
|
||
|
|
||
|
|
||
|
#define ngx_memzero(buf, n) (void) memset(buf, 0, n)
|
||
|
#define ngx_memset(buf, c, n) (void) memset(buf, c, n)
|
||
|
|
||
|
|
||
|
#define ngx_shmtx_t hmutex_t
|
||
|
#define ngx_shmtx_lock hmutex_lock
|
||
|
#define ngx_shmtx_unlock hmutex_unlock
|
||
|
|
||
|
|
||
|
typedef uint8_t u_char;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
typedef intptr_t ngx_int_t;
|
||
|
typedef uintptr_t ngx_uint_t;
|
||
|
typedef intptr_t ngx_flag_t;
|
||
|
|
||
|
#define ngx_align_ptr(p, a) \
|
||
|
(u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
|
||
|
|
||
|
|
||
|
typedef struct ngx_slab_page_s ngx_slab_page_t;
|
||
|
|
||
|
struct ngx_slab_page_s {
|
||
|
uintptr_t slab;
|
||
|
ngx_slab_page_t *next;
|
||
|
uintptr_t prev;
|
||
|
};
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
ngx_uint_t total;
|
||
|
ngx_uint_t used;
|
||
|
|
||
|
ngx_uint_t reqs;
|
||
|
ngx_uint_t fails;
|
||
|
} ngx_slab_stat_t;
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
|
||
|
size_t min_size;
|
||
|
size_t min_shift;
|
||
|
|
||
|
ngx_slab_page_t *pages;
|
||
|
ngx_slab_page_t *last;
|
||
|
ngx_slab_page_t free;
|
||
|
|
||
|
ngx_slab_stat_t *stats;
|
||
|
ngx_uint_t pfree;
|
||
|
|
||
|
u_char *start;
|
||
|
u_char *end;
|
||
|
|
||
|
ngx_shmtx_t mutex;
|
||
|
|
||
|
u_char *log_ctx;
|
||
|
u_char zero;
|
||
|
|
||
|
unsigned log_nomem:1;
|
||
|
|
||
|
void *data;
|
||
|
void *addr;
|
||
|
} ngx_slab_pool_t;
|
||
|
|
||
|
void ngx_slab_test();
|
||
|
|
||
|
ngx_slab_pool_t *ngx_slab_sizes_init(uint32_t pool_size);
|
||
|
void ngx_slab_init(ngx_slab_pool_t *pool);
|
||
|
void *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size);
|
||
|
void *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size);
|
||
|
void *ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size);
|
||
|
void *ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size);
|
||
|
void ngx_slab_free(ngx_slab_pool_t *pool, void *p);
|
||
|
void ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p);
|
||
|
|
||
|
|
||
|
#endif /* _NGX_SLAB_H_INCLUDED_ */
|