annotate mcabber/libjabber/pool.c @ 1558:3df441efb7c2

Fix gcc warnings related to inline/static uses
author Mikael Berthe <mikael@lilotux.net>
date Fri, 10 Oct 2008 20:29:15 +0200
parents c3ae9251c197
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1 /*
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
2 * pool.c
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
3 * This code comes from jabberd - Jabber Open Source Server
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
4 * Copyright (c) 2002 Jeremie Miller, Thomas Muldowney,
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
5 * Ryan Eatmon, Robert Norris
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
6 * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
7 *
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
8 * This program is free software; you can redistribute it and/or modify
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
9 * it under the terms of the GNU General Public License as published by
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
11 * (at your option) any later version.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
12 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
13 * This program is distributed in the hope that it will be useful,
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
16 * GNU General Public License for more details.
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
17 *
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
18 * You should have received a copy of the GNU General Public License
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
19 * along with this program; if not, write to the Free Software
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307USA
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
21 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
22 * Copyrights
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
23 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
24 * Portions created by or assigned to Jabber.com, Inc. are
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
25 * Copyright (c) 1999-2002 Jabber.com, Inc. All Rights Reserved. Contact
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
26 * information for Jabber.com, Inc. is available at http://www.jabber.com/.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
27 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
28 * Portions Copyright (c) 1998-1999 Jeremie Miller.
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
29 *
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
30 * Acknowledgements
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
31 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
32 * Special thanks to the Jabber Open Source Contributors for their
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
33 * suggestions and support of Jabber.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
34 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
35 */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
36
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
37 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
38 * @file pool.c
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
39 * @brief Handling of memory pools
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
40 *
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
41 * Jabberd handles its memory allocations in pools. You create a pool, can
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
42 * allocate memory from it and all allocations will be freed if you free
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
43 * the pool. Therefore you don't have to care that each malloc is freed,
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
44 * you only have to take care that the pool is freed.
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
45 *
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
46 * The normal call-flow for pools is:
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
47 *
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
48 * pool p = pool_new();
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
49 * struct mystruct *allocation1 = pmalloc(sizeof(struct mystruct));
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
50 * struct myotherstruct *allocation2 = pmalloc(sizeof(struct myotherstruct));
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
51 * ...
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
52 * pool_free(p);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
53 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
54
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
55 #include "libxode.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
56
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
57 #define MAX_MALLOC_TRIES 10 /**< how many seconds we try to allocate memory */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
58
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
59 #ifdef POOL_DEBUG
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
60 int pool__total = 0; /**< how many memory blocks are allocated */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
61 int pool__ltotal = 0;
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
62 xht pool__disturbed = NULL;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
63
1558
3df441efb7c2 Fix gcc warnings related to inline/static uses
Mikael Berthe <mikael@lilotux.net>
parents: 417
diff changeset
64 inline void *_retried__malloc(size_t size);
3df441efb7c2 Fix gcc warnings related to inline/static uses
Mikael Berthe <mikael@lilotux.net>
parents: 417
diff changeset
65
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
66 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
67 * create a new memory allocation and increment the pool__total counter
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
68 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
69 * only used if POOL_DEBUG is defined, else it is an alias for malloc
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
70 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
71 * @param size size of the memory to allocate
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
72 * @return pointer to the allocated memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
73 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
74 void *_pool__malloc(size_t size)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
75 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
76 pool__total++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
77 return malloc(size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
78 }
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
79
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
80 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
81 * free memory and decrement the pool__total counter
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
82 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
83 * only used if POOL_DEBUG is defined, else it is an alias for free
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
84 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
85 * @param block pointer to the memory allocation that should be freed
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
86 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
87 void _pool__free(void *block)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
88 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
89 pool__total--;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
90 free(block);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
91 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
92 #else
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
93 #define _pool__malloc malloc /**< _pool__malloc updates pool__total counter if POOL_DEBUG is defined */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
94 #define _pool__free free /**< _pool__free updates pool__total counter if POOL_DEBUG is defined */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
95 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
96
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
97 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
98 * try to allocate memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
99 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
100 * If allocation fails, it will be retries for MAX_MALLOC_TRIES seconds.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
101 * If it still fails, we exit the process
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
102 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
103 * @param size how many bytes of memory we allocate
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
104 * @return pointer to the allocated memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
105 */
1558
3df441efb7c2 Fix gcc warnings related to inline/static uses
Mikael Berthe <mikael@lilotux.net>
parents: 417
diff changeset
106 void *_retried__malloc(size_t size) {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
107 void *allocated_memory;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
108 int malloc_tries = 0;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
109
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
110 while ((allocated_memory=_pool__malloc(size)) == NULL) {
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
111 if (malloc_tries++ > MAX_MALLOC_TRIES) {
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
112 exit(999);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
113 }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
114
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
115 sleep(1); //pth_sleep(1);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
116 }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
117
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
118 return allocated_memory;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
119 }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
120
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
121 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
122 * make an empty pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
123 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
124 * Use the macro pool_new() instead of a direct call to this function. The
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
125 * macro will create the parameters for you.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
126 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
127 * @param zone the file in which the pool_new macro is called
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
128 * @param line the line in the file in which the pool_new macro is called
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
129 * @return the new allocated memory pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
130 */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
131 pool _pool_new(char *zone, int line)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
132 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
133 // int malloc_tries = 0;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
134 #ifdef POOL_DEBUG
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
135 int old__pool__total;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
136 #endif
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
137
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
138 pool p = _retried__malloc(sizeof(_pool));
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
139
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
140 p->cleanup = NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
141 p->heap = NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
142 p->size = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
143
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
144 #ifdef POOL_DEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
145 p->lsize = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
146 p->zone[0] = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
147 strcat(p->zone,zone);
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
148 snprintf(p->zone, sizeof(p->zone), "%s:%i", zone, line);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
149 snprintf(p->name, sizeof(p->name), "%X", p);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
150
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
151 if(pool__disturbed == NULL)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
152 {
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
153 pool__disturbed = (xht)1; /* reentrancy flag! */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
154 pool__disturbed = ghash_create(POOL_DEBUG,(KEYHASHFUNC)str_hash_code,(KEYCOMPAREFUNC)j_strcmp);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
155 }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
156 if(pool__disturbed != (xht)1)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
157 ghash_put(pool__disturbed,p->name,p);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
158 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
159
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
160 return p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
161 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
162
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
163 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
164 * free a memory heap (struct pheap)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
165 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
166 * @param arg which heep should be freed
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
167 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
168 void _pool_heap_free(void *arg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
169 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
170 struct pheap *h = (struct pheap *)arg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
171
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
172 _pool__free(h->block);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
173 _pool__free(h);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
174 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
175
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
176 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
177 * append a pool_cleaner function (callback) to a pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
178 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
179 * mem should always be freed last
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
180 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
181 * All appended pool_cleaner functions will be called if a pool is freed.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
182 * This might be used to clean logically subpools.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
183 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
184 * @param p to which pool the pool_cleaner should be added
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
185 * @param pf structure containing the reference to the pool_cleaner and links for the list
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
186 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
187 void _pool_cleanup_append(pool p, struct pfree *pf)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
188 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
189 struct pfree *cur;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
190
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
191 if(p->cleanup == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
192 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
193 p->cleanup = pf;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
194 return;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
195 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
196
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
197 /* fast forward to end of list */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
198 for(cur = p->cleanup; cur->next != NULL; cur = cur->next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
199
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
200 cur->next = pf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
201 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
202
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
203 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
204 * create a cleanup tracker
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
205 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
206 * this function is used to create a pfree structure that can be passed to _pool_cleanup_append()
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
207 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
208 * @param p the pool to which the pool_cleaner should be added
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
209 * @param f the function that should be called if the pool is freed
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
210 * @param arg the parameter that should be passed to the pool_cleaner function
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
211 * @return pointer to the new pfree structure
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
212 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
213 struct pfree *_pool_free(pool p, pool_cleaner f, void *arg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
214 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
215 struct pfree *ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
216
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
217 /* make the storage for the tracker */
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
218 ret = _retried__malloc(sizeof(struct pfree));
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
219 ret->f = f;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
220 ret->arg = arg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
221 ret->next = NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
222
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
223 return ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
224 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
225
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
226 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
227 * create a heap and make sure it get's cleaned up
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
228 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
229 * pheaps are used by memory pools internally to handle the memory allocations
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
230 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
231 * @note the macro pool_heap calls _pool_new_heap and NOT _pool_heap
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
232 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
233 * @param p for which pool the heap should be created
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
234 * @param size how big the pool should be
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
235 * @return pointer to the new pheap
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
236 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
237 struct pheap *_pool_heap(pool p, int size)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
238 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
239 struct pheap *ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
240 struct pfree *clean;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
241
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
242 /* make the return heap */
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
243 ret = _retried__malloc(sizeof(struct pheap));
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
244 ret->block = _retried__malloc(size);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
245 ret->size = size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
246 p->size += size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
247 ret->used = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
248
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
249 /* append to the cleanup list */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
250 clean = _pool_free(p, _pool_heap_free, (void *)ret);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
251 clean->heap = ret; /* for future use in finding used mem for pstrdup */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
252 _pool_cleanup_append(p, clean);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
253
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
254 return ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
255 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
256
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
257 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
258 * create a new memory pool and set the initial heap size
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
259 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
260 * @note you should not call this function but use the macro pool_heap instead which fills zone and line automatically
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
261 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
262 * @param size the initial size of the memory pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
263 * @param zone the file where this function is called (for debugging)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
264 * @param line the line in the file where this function is called
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
265 * @return the new memory pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
266 */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
267 pool _pool_new_heap(int size, char *zone, int line)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
268 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
269 pool p;
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
270 p = _pool_new(zone, line);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
271 p->heap = _pool_heap(p,size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
272 return p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
273 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
274
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
275 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
276 * allocate memory from a memory pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
277 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
278 * @param p the pool to use
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
279 * @param size how much memory to allocate
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
280 * @return pointer to the allocated memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
281 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
282 void *pmalloc(pool p, int size)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
283 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
284 void *block;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
285
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
286 if(p == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
287 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
288 fprintf(stderr,"Memory Leak! [pmalloc received NULL pool, unable to track allocation, exiting]\n");
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
289 abort();
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
290 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
291
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
292 /* if there is no heap for this pool or it's a big request, just raw, I like how we clean this :) */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
293 if(p->heap == NULL || size > (p->heap->size / 2))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
294 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
295 block = _retried__malloc(size);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
296 p->size += size;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
297 _pool_cleanup_append(p, _pool_free(p, _pool__free, block));
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
298 return block;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
299 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
300
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
301 /* we have to preserve boundaries, long story :) */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
302 if(size >= 4)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
303 while(p->heap->used&7) p->heap->used++;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
304
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
305 /* if we don't fit in the old heap, replace it */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
306 if(size > (p->heap->size - p->heap->used))
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
307 p->heap = _pool_heap(p, p->heap->size);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
308
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
309 /* the current heap has room */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
310 block = (char *)p->heap->block + p->heap->used;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
311 p->heap->used += size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
312 return block;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
313 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
314
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
315 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
316 * allocate memory and initialize the memory with the given char c
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
317 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
318 * @deprecated jabberd does use pmalloco instead, this function will be removed
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
319 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
320 * @param p which pool to use
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
321 * @param size the size of the allocation
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
322 * @param c the initialization character
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
323 * @return pointer to the allocated memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
324 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
325 void *pmalloc_x(pool p, int size, char c)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
326 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
327 void* result = pmalloc(p, size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
328 if (result != NULL)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
329 memset(result, c, size);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
330 return result;
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
331 }
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
332
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
333 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
334 * allocate memory and initialize the memory with zero bytes
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
335 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
336 * easy safety utility (for creating blank mem for structs, etc)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
337 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
338 * @param p which pool to use
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
339 * @param size the size of the allocation
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
340 * @return pointer to the allocated memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
341 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
342 void *pmalloco(pool p, int size)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
343 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
344 void *block = pmalloc(p, size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
345 memset(block, 0, size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
346 return block;
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
347 }
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
348
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
349 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
350 * duplicate a string and allocate memory for it
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
351 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
352 * @todo efficient: move this to const char* and then loop through the existing heaps to see if src is within a block in this pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
353 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
354 * @param p the pool to use
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
355 * @param src the string that should be duplicated
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
356 * @return the duplicated string
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
357 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
358 char *pstrdup(pool p, const char *src)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
359 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
360 char *ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
361
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
362 if(src == NULL)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
363 return NULL;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
364
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
365 ret = pmalloc(p,strlen(src) + 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
366 strcpy(ret,src);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
367
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
368 return ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
369 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
370
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
371 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
372 * when pstrdup() is moved to "const char*", this one would actually return a new block
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
373 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
374 char *pstrdupx(pool p, const char *src)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
375 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
376 return pstrdup(p, src);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
377 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
378
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
379 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
380 * get the size of a memory pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
381 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
382 * @param p the pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
383 * @return the size
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
384 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
385 int pool_size(pool p)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
386 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
387 if(p == NULL) return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
388
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
389 return p->size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
390 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
391
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
392 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
393 * free a pool (and all memory that is allocated in it)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
394 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
395 * @param p which pool to free
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
396 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
397 void pool_free(pool p)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
398 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
399 struct pfree *cur, *stub;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
400
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
401 if(p == NULL) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
402
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
403 cur = p->cleanup;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
404 while(cur != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
405 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
406 (*cur->f)(cur->arg);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
407 stub = cur->next;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
408 _pool__free(cur);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
409 cur = stub;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
410 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
411
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
412 #ifdef POOL_DEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
413 ghash_remove(pool__disturbed,p->name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
414 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
415
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
416 _pool__free(p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
417
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
418 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
419
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
420 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
421 * public cleanup utils, insert in a way that they are run FIFO, before mem frees
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
422 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
423 void pool_cleanup(pool p, pool_cleaner f, void *arg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
424 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
425 struct pfree *clean;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
426
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
427 clean = _pool_free(p, f, arg);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
428 clean->next = p->cleanup;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
429 p->cleanup = clean;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
430 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
431
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
432 #ifdef POOL_DEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
433 void debug_log(char *zone, const char *msgfmt, ...);
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
434 void _pool_stat(xht h, const char *key, void *data, void *arg)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
435 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
436 pool p = (pool)data;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
437
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
438 if(p->lsize == -1)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
439 debug_log("pool_debug","%s: %s is a new pool",p->zone, p->name);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
440 else if(p->size > p->lsize)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
441 debug_log("pool_debug","%s: %s grew %d",p->zone, p->name, p->size - p->lsize);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
442 else if((int)arg)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
443 debug_log("pool_debug","%s: %s exists %d",p->zone,p->name, p->size);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
444 p->lsize = p->size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
445 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
446
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
447 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
448 * print memory pool statistics (for debugging purposes)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
449 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
450 * @param full make a full report? (0 = no, 1 = yes)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
451 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
452 void pool_stat(int full)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
453 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
454 if (pool__disturbed == NULL || pool__disturbed == (xht)1)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
455 return;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
456
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
457 ghash_walk(pool__disturbed,_pool_stat,(void *)full);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
458 if(pool__total != pool__ltotal)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
459 debug_log("pool_debug","%d\ttotal missed mallocs",pool__total);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
460 pool__ltotal = pool__total;
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
461
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
462 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
463 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
464 #else
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
465 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
466 * dummy implementation: print memory pool statistics (for debugging purposes, real implementation if POOL_DEBUG is defined)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
467 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
468 * @param full make a full report? (0 = no, 1 = yes)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
469 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
470 void pool_stat(int full)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
471 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
472 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
473 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
474 #endif