b3fe2286c306cce46e840baa51cb1c6f89fcaae1
[sip-router] / mem / f_malloc.h
1 /* $Id$
2  *
3  * simple, very fast, malloc library
4  *
5  * Copyright (C) 2001-2003 FhG Fokus
6  *
7  * This file is part of sip-router, a free SIP server.
8  *
9  * Permission to use, copy, modify, and distribute this software for any
10  * purpose with or without fee is hereby granted, provided that the above
11  * copyright notice and this permission notice appear in all copies.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20  */
21 /*
22  * History:
23  * --------
24  *  2003-05-21  on sparc64 roundto 8 even in debugging mode (so malloc'ed
25  *               long longs will be 64 bit aligned) (andrei)
26  *  2004-07-19  support for 64 bit (2^64 mem. block) and more info
27  *               for the future de-fragmentation support (andrei)
28  *  2004-11-10  support for > 4Gb mem., switched to long (andrei)
29  *  2007-06-23  added hash bitmap (andrei)
30  */
31
32
33 #if !defined(f_malloc_h)
34 #define f_malloc_h
35
36 #ifdef DBG_QM_MALLOC
37 #ifndef DBG_F_MALLOC
38         #define DBG_F_MALLOC
39 #endif /* DBG_F_MALLOC */
40 #endif /* DBG_QM_MALLOC */
41
42 #include "meminfo.h"
43
44 /* defs*/
45
46 /* use a bitmap to quickly find free fragments, should speed up
47  * especially startup (non-warmed-up malloc) */
48 #define F_MALLOC_HASH_BITMAP
49
50 #ifdef DBG_F_MALLOC
51 #if defined(__CPU_sparc64) || defined(__CPU_sparc)
52 /* tricky, on sun in 32 bits mode long long must be 64 bits aligned
53  * but long can be 32 bits aligned => malloc should return long long
54  * aligned memory */
55         #define ROUNDTO         sizeof(long long)
56 #else
57         #define ROUNDTO         sizeof(void*) /* size we round to, must be = 2^n, and
58                       sizeof(fm_frag) must be multiple of ROUNDTO !*/
59 #endif
60 #else /* DBG_F_MALLOC */
61         #define ROUNDTO 8UL
62 #endif
63 #define MIN_FRAG_SIZE   ROUNDTO
64
65
66
67 #define F_MALLOC_OPTIMIZE_FACTOR 14UL /*used below */
68 #define F_MALLOC_OPTIMIZE  (1UL<<F_MALLOC_OPTIMIZE_FACTOR)
69                                                                 /* size to optimize for,
70                                                                         (most allocs <= this size),
71                                                                         must be 2^k */
72
73 #define F_HASH_SIZE (F_MALLOC_OPTIMIZE/ROUNDTO + \
74                 (sizeof(long)*8-F_MALLOC_OPTIMIZE_FACTOR)+1)
75
76 #ifdef F_MALLOC_HASH_BITMAP
77 typedef unsigned long fm_hash_bitmap_t;
78 #define FM_HASH_BMP_BITS  (sizeof(fm_hash_bitmap_t)*8)
79 #define FM_HASH_BMP_SIZE  \
80         ((F_HASH_SIZE+FM_HASH_BMP_BITS-1)/FM_HASH_BMP_BITS)
81 #endif
82
83 /* hash structure:
84  * 0 .... F_MALLOC_OPTIMIZE/ROUNDTO  - small buckets, size increases with
85  *                            ROUNDTO from bucket to bucket
86  * +1 .... end -  size = 2^k, big buckets */
87
88 struct fm_frag{
89         unsigned long size;
90         union{
91                 struct fm_frag* nxt_free;
92                 long reserved;
93         }u;
94 #ifdef DBG_F_MALLOC
95         const char* file;
96         const char* func;
97         unsigned long line;
98         unsigned long check;
99 #endif
100 };
101
102 struct fm_frag_lnk{
103         struct fm_frag* first;
104         unsigned long no;
105 };
106
107 struct fm_block{
108         unsigned long size; /* total size */
109 #if defined(DBG_F_MALLOC) || defined(MALLOC_STATS)
110         unsigned long used; /* alloc'ed size*/
111         unsigned long real_used; /* used+malloc overhead*/
112         unsigned long max_real_used;
113 #endif
114         
115         struct fm_frag* first_frag;
116         struct fm_frag* last_frag;
117 #ifdef F_MALLOC_HASH_BITMAP
118         fm_hash_bitmap_t free_bitmap[FM_HASH_BMP_SIZE];
119 #endif
120         struct fm_frag_lnk free_hash[F_HASH_SIZE];
121 };
122
123
124
125 struct fm_block* fm_malloc_init(char* address, unsigned long size);
126
127 #ifdef DBG_F_MALLOC
128 void* fm_malloc(struct fm_block*, unsigned long size,
129                                         const char* file, const char* func, unsigned int line);
130 #else
131 void* fm_malloc(struct fm_block*, unsigned long size);
132 #endif
133
134 #ifdef DBG_F_MALLOC
135 void  fm_free(struct fm_block*, void* p, const char* file, const char* func, 
136                                 unsigned int line);
137 #else
138 void  fm_free(struct fm_block*, void* p);
139 #endif
140
141 #ifdef DBG_F_MALLOC
142 void*  fm_realloc(struct fm_block*, void* p, unsigned long size, 
143                                         const char* file, const char* func, unsigned int line);
144 #else
145 void*  fm_realloc(struct fm_block*, void* p, unsigned long size);
146 #endif
147
148 void  fm_status(struct fm_block*);
149 void  fm_info(struct fm_block*, struct mem_info*);
150
151 unsigned long fm_available(struct fm_block*);
152
153 #ifdef DBG_F_MALLOC
154 void fm_sums(struct fm_block*);
155 #else
156 #define fm_sums(v) do{}while(0)
157 #endif /* DBG_F_MALLOC */
158
159 #endif