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