mem: initial doxygen documentation for MM, small whitespace changes
[sip-router] / mem / mem.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-03-10  __FUNCTION__ is a gcc-ism, defined it to "" for sun cc
23  *               (andrei)
24  *  2003-03-07  split init_malloc into init_pkg_mallocs & init_shm_mallocs 
25  *               (andrei)
26  *  2007-02-23   added pkg_info() and pkg_available() (andrei)
27  */
28
29 /**
30  * \defgroup mem SIP-router memory manager
31  * \brief  SIP-router internal memory manager
32  * 
33  * SIP-router internal memory manager for private (per process) and shared
34  * memory pools. It provides several different strategies for the memory
35  * management, like really fast, with extended debugging and also plain system
36  * memory management.
37  */
38
39 /**
40  * \file
41  * \brief Main definitions for memory manager
42  * 
43  * \brief Main definitions for memory manager, like malloc, free and realloc
44  * \ingroup mem
45  */
46
47
48 #ifndef mem_h
49 #define mem_h
50 #include "../config.h"
51 #include "../dprint.h"
52
53 /* fix debug defines, DBG_F_MALLOC <=> DBG_QM_MALLOC */
54 #ifdef F_MALLOC
55         #ifdef DBG_F_MALLOC
56                 #ifndef DBG_QM_MALLOC
57                         #define DBG_QM_MALLOC
58                 #endif
59         #elif defined(DBG_QM_MALLOC)
60                 #define DBG_F_MALLOC
61         #endif
62 #endif
63
64 #ifdef PKG_MALLOC
65 #       ifdef F_MALLOC
66 #               include "f_malloc.h"
67                 extern struct fm_block* mem_block;
68 #       elif defined DL_MALLOC
69 #               include "dl_malloc.h"
70 #   else
71 #               include "q_malloc.h"
72                 extern struct qm_block* mem_block;
73 #       endif
74
75         extern char* mem_pool;
76
77
78 #       ifdef DBG_QM_MALLOC
79
80 #       include "src_loc.h" /* src location macros: _SRC_* */
81 #               ifdef F_MALLOC
82 #                       define pkg_malloc(s) fm_malloc(mem_block, (s), _SRC_LOC_, \
83                                 _SRC_FUNCTION_, _SRC_LINE_)
84 #                       define pkg_free(p)   fm_free(mem_block, (p), _SRC_LOC_,  \
85                                 _SRC_FUNCTION_, _SRC_LINE_)
86 #                       define pkg_realloc(p, s) fm_realloc(mem_block, (p), (s), \
87                                         _SRC_LOC_, _SRC_FUNCTION_, _SRC_LINE_)
88 #               else
89 #                       define pkg_malloc(s) qm_malloc(mem_block, (s),_SRC_LOC_, \
90                                 _SRC_FUNCTION_, _SRC_LINE_)
91 #                       define pkg_realloc(p, s) qm_realloc(mem_block, (p), (s), \
92                                 _SRC_LOC_, _SRC_FUNCTION_, _SRC_LINE_)
93 #                       define pkg_free(p)   qm_free(mem_block, (p), _SRC_LOC_,  \
94                                 _SRC_FUNCTION_, _SRC_LINE_)
95 #               endif
96 #       else
97 #               ifdef F_MALLOC
98 #                       define pkg_malloc(s) fm_malloc(mem_block, (s))
99 #                       define pkg_realloc(p, s) fm_realloc(mem_block, (p), (s))
100 #                       define pkg_free(p)   fm_free(mem_block, (p))
101 #               elif defined DL_MALLOC
102 #                       define pkg_malloc(s) dlmalloc((s))
103 #                       define pkg_realloc(p, s) dlrealloc((p), (s))
104 #                       define pkg_free(p)   dlfree((p))
105 #               else
106 #                       define pkg_malloc(s) qm_malloc(mem_block, (s))
107 #                       define pkg_realloc(p, s) qm_realloc(mem_block, (p), (s))
108 #                       define pkg_free(p)   qm_free(mem_block, (p))
109 #               endif
110 #       endif
111 #       ifdef F_MALLOC
112 #               define pkg_status()    fm_status(mem_block)
113 #               define pkg_info(mi)    fm_info(mem_block, mi)
114 #               define pkg_available() fm_available(mem_block)
115 #               define pkg_sums()      fm_sums(mem_block)
116 #       elif defined DL_MALLOC
117 #               define pkg_status()  0
118 #               define pkg_info(mi)  0
119 #               define pkg_available()  0
120 #               define pkg_sums()  0
121 #       else
122 #               define pkg_status()    qm_status(mem_block)
123 #               define pkg_info(mi)    qm_info(mem_block, mi)
124 #               define pkg_available() qm_available(mem_block)
125 #               define pkg_sums()      qm_sums(mem_block)
126 #       endif
127 #elif defined(SHM_MEM) && defined(USE_SHM_MEM)
128 #       include "shm_mem.h"
129 #       define pkg_malloc(s) shm_malloc((s))
130 #       define pkg_free(p)   shm_free((p))
131 #       define pkg_status()  shm_status()
132 #       define pkg_sums()    shm_sums()
133 #else
134 #       include <stdlib.h>
135 #       include "memdbg.h"
136 #       define pkg_malloc(s) \
137         (  { void *____v123; ____v123=malloc((s)); \
138            MDBG("malloc %p size %lu end %p\n", ____v123, (unsigned long)(s), (char*)____v123+(s));\
139            ____v123; } )
140 #       define pkg_realloc(p, s) \
141         (  { void *____v123; ____v123=realloc(p, s); \
142            MDBG("realloc %p size %lu end %p\n", ____v123, (unsigned long)(s), (char*)____v123+(s));\
143             ____v123; } )
144 #       define pkg_free(p)  do{ MDBG("free %p\n", (p)); free((p)); }while(0);
145 #       define pkg_status()
146 #       define pkg_sums()
147 #endif
148
149 /**
150  * \brief Initialize private memory pool
151  * \return 0 if the memory allocation was successful, -1 otherwise
152  */
153 int init_pkg_mallocs();
154
155 /**
156  * \brief Destroy private memory pool
157  */
158 void destroy_pkg_mallocs();
159
160 /**
161  * \brief Initialize shared memory pool
162  * \param force_alloc Force allocation of memory, e.g. initialize complete block with zero
163  * \return 0 if the memory allocation was successful, -1 otherwise
164  */
165 int init_shm_mallocs(int force_alloc);
166
167 /** generic logging helper for allocation errors in private memory pool/ system */
168 #ifdef SYSTEM_MALLOC
169 #define PKG_MEM_ERROR LM_ERR("could not allocate private memory from system")
170 #else
171 #define PKG_MEM_ERROR LM_ERR("could not allocate private memory from available pool")
172 #endif
173 /** generic logging helper for allocation errors in shared memory pool */
174 #define SHM_MEM_ERROR LM_ERR("could not allocate shared memory from available pool")
175
176 #endif