1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#ifndef _NGX_SLAB_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_SLAB_H_INCLUDED_
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#include <ngx_config.h>
13e18a033bSKonstantin Ananyev#include <ngx_core.h>
14e18a033bSKonstantin Ananyev
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyevtypedef struct ngx_slab_page_s  ngx_slab_page_t;
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyevstruct ngx_slab_page_s {
19e18a033bSKonstantin Ananyev    uintptr_t         slab;
20e18a033bSKonstantin Ananyev    ngx_slab_page_t  *next;
21e18a033bSKonstantin Ananyev    uintptr_t         prev;
22e18a033bSKonstantin Ananyev};
23e18a033bSKonstantin Ananyev
24e18a033bSKonstantin Ananyev
25e18a033bSKonstantin Ananyevtypedef struct {
26e18a033bSKonstantin Ananyev    ngx_uint_t        total;
27e18a033bSKonstantin Ananyev    ngx_uint_t        used;
28e18a033bSKonstantin Ananyev
29e18a033bSKonstantin Ananyev    ngx_uint_t        reqs;
30e18a033bSKonstantin Ananyev    ngx_uint_t        fails;
31e18a033bSKonstantin Ananyev} ngx_slab_stat_t;
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyev
34e18a033bSKonstantin Ananyevtypedef struct {
35e18a033bSKonstantin Ananyev    ngx_shmtx_sh_t    lock;
36e18a033bSKonstantin Ananyev
37e18a033bSKonstantin Ananyev    size_t            min_size;
38e18a033bSKonstantin Ananyev    size_t            min_shift;
39e18a033bSKonstantin Ananyev
40e18a033bSKonstantin Ananyev    ngx_slab_page_t  *pages;
41e18a033bSKonstantin Ananyev    ngx_slab_page_t  *last;
42e18a033bSKonstantin Ananyev    ngx_slab_page_t   free;
43e18a033bSKonstantin Ananyev
44e18a033bSKonstantin Ananyev    ngx_slab_stat_t  *stats;
45e18a033bSKonstantin Ananyev    ngx_uint_t        pfree;
46e18a033bSKonstantin Ananyev
47e18a033bSKonstantin Ananyev    u_char           *start;
48e18a033bSKonstantin Ananyev    u_char           *end;
49e18a033bSKonstantin Ananyev
50e18a033bSKonstantin Ananyev    ngx_shmtx_t       mutex;
51e18a033bSKonstantin Ananyev
52e18a033bSKonstantin Ananyev    u_char           *log_ctx;
53e18a033bSKonstantin Ananyev    u_char            zero;
54e18a033bSKonstantin Ananyev
55e18a033bSKonstantin Ananyev    unsigned          log_nomem:1;
56e18a033bSKonstantin Ananyev
57e18a033bSKonstantin Ananyev    void             *data;
58e18a033bSKonstantin Ananyev    void             *addr;
59e18a033bSKonstantin Ananyev} ngx_slab_pool_t;
60e18a033bSKonstantin Ananyev
61e18a033bSKonstantin Ananyev
62e18a033bSKonstantin Ananyevvoid ngx_slab_init(ngx_slab_pool_t *pool);
63e18a033bSKonstantin Ananyevvoid *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size);
64e18a033bSKonstantin Ananyevvoid *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size);
65e18a033bSKonstantin Ananyevvoid *ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size);
66e18a033bSKonstantin Ananyevvoid *ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size);
67e18a033bSKonstantin Ananyevvoid ngx_slab_free(ngx_slab_pool_t *pool, void *p);
68e18a033bSKonstantin Ananyevvoid ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p);
69e18a033bSKonstantin Ananyev
70e18a033bSKonstantin Ananyev
71e18a033bSKonstantin Ananyev#endif /* _NGX_SLAB_H_INCLUDED_ */
72