annotate mcabber/libjabber/pool.c @ 478:47cfa3779549

MUC: log join/nick/leave/topic if log_muc_conf is set
author Mikael Berthe <mikael@lilotux.net>
date Mon, 03 Oct 2005 22:12:24 +0200
parents c3ae9251c197
children 3df441efb7c2
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
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
64 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
65 * 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
66 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
67 * 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
68 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
69 * @param size size of the memory to allocate
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
70 * @return pointer to the allocated memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
71 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
72 void *_pool__malloc(size_t size)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
73 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
74 pool__total++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
75 return malloc(size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
76 }
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
77
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
78 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
79 * free memory and decrement the pool__total counter
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 * 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
82 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
83 * @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
84 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
85 void _pool__free(void *block)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
86 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
87 pool__total--;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
88 free(block);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
89 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
90 #else
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
91 #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
92 #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
93 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
94
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
95 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
96 * try to allocate memory
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 * 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
99 * If it still fails, we exit the process
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
100 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
101 * @param size how many bytes of memory we allocate
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
102 * @return pointer to the allocated memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
103 */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
104 inline void *_retried__malloc(size_t size) {
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
105 void *allocated_memory;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
106 int malloc_tries = 0;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
107
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
108 while ((allocated_memory=_pool__malloc(size)) == NULL) {
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
109 if (malloc_tries++ > MAX_MALLOC_TRIES) {
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
110 exit(999);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
111 }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
112
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
113 sleep(1); //pth_sleep(1);
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
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
116 return allocated_memory;
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
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 * make an empty pool
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 * 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
123 * macro will create the parameters for you.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
124 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
125 * @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
126 * @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
127 * @return the new allocated memory pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
128 */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
129 pool _pool_new(char *zone, int line)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
130 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
131 // int malloc_tries = 0;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
132 #ifdef POOL_DEBUG
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
133 int old__pool__total;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
134 #endif
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
135
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
136 pool p = _retried__malloc(sizeof(_pool));
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
137
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
138 p->cleanup = NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
139 p->heap = NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
140 p->size = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
141
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
142 #ifdef POOL_DEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
143 p->lsize = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
144 p->zone[0] = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
145 strcat(p->zone,zone);
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
146 snprintf(p->zone, sizeof(p->zone), "%s:%i", zone, line);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
147 snprintf(p->name, sizeof(p->name), "%X", p);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
148
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
149 if(pool__disturbed == NULL)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
150 {
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
151 pool__disturbed = (xht)1; /* reentrancy flag! */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
152 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
153 }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
154 if(pool__disturbed != (xht)1)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
155 ghash_put(pool__disturbed,p->name,p);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
156 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
157
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
158 return p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
159 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
160
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
161 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
162 * free a memory heap (struct pheap)
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 * @param arg which heep should be freed
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
165 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
166 void _pool_heap_free(void *arg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
167 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
168 struct pheap *h = (struct pheap *)arg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
169
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
170 _pool__free(h->block);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
171 _pool__free(h);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
172 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
173
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
174 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
175 * append a pool_cleaner function (callback) to a pool
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 * mem should always be freed last
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 * 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
180 * This might be used to clean logically subpools.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
181 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
182 * @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
183 * @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
184 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
185 void _pool_cleanup_append(pool p, struct pfree *pf)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
186 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
187 struct pfree *cur;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
188
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
189 if(p->cleanup == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
190 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
191 p->cleanup = pf;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
192 return;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
193 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
194
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
195 /* fast forward to end of list */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
196 for(cur = p->cleanup; cur->next != NULL; cur = cur->next);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
197
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
198 cur->next = pf;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
199 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
200
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
201 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
202 * create a cleanup tracker
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 * 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
205 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
206 * @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
207 * @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
208 * @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
209 * @return pointer to the new pfree structure
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
210 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
211 struct pfree *_pool_free(pool p, pool_cleaner f, void *arg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
212 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
213 struct pfree *ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
214
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
215 /* make the storage for the tracker */
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
216 ret = _retried__malloc(sizeof(struct pfree));
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
217 ret->f = f;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
218 ret->arg = arg;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
219 ret->next = NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
220
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
221 return ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
222 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
223
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
224 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
225 * 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
226 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
227 * 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
228 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
229 * @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
230 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
231 * @param p for which pool the heap should be created
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
232 * @param size how big the pool should be
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
233 * @return pointer to the new pheap
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
234 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
235 struct pheap *_pool_heap(pool p, int size)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
236 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
237 struct pheap *ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
238 struct pfree *clean;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
239
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
240 /* make the return heap */
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
241 ret = _retried__malloc(sizeof(struct pheap));
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
242 ret->block = _retried__malloc(size);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
243 ret->size = size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
244 p->size += size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
245 ret->used = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
246
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
247 /* append to the cleanup list */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
248 clean = _pool_free(p, _pool_heap_free, (void *)ret);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
249 clean->heap = ret; /* for future use in finding used mem for pstrdup */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
250 _pool_cleanup_append(p, clean);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
251
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
252 return ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
253 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
254
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
255 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
256 * 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
257 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
258 * @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
259 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
260 * @param size the initial size of the memory pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
261 * @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
262 * @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
263 * @return the new memory pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
264 */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
265 pool _pool_new_heap(int size, char *zone, int line)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
266 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
267 pool p;
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
268 p = _pool_new(zone, line);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
269 p->heap = _pool_heap(p,size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
270 return p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
271 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
272
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
273 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
274 * allocate memory from a memory pool
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 * @param p the pool to use
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
277 * @param size how much memory to allocate
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
278 * @return pointer to the allocated memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
279 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
280 void *pmalloc(pool p, int size)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
281 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
282 void *block;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
283
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
284 if(p == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
285 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
286 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
287 abort();
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
288 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
289
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
290 /* 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
291 if(p->heap == NULL || size > (p->heap->size / 2))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
292 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
293 block = _retried__malloc(size);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
294 p->size += size;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
295 _pool_cleanup_append(p, _pool_free(p, _pool__free, block));
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
296 return block;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
297 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
298
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
299 /* we have to preserve boundaries, long story :) */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
300 if(size >= 4)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
301 while(p->heap->used&7) p->heap->used++;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
302
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
303 /* if we don't fit in the old heap, replace it */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
304 if(size > (p->heap->size - p->heap->used))
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
305 p->heap = _pool_heap(p, p->heap->size);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
306
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
307 /* the current heap has room */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
308 block = (char *)p->heap->block + p->heap->used;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
309 p->heap->used += size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
310 return block;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
311 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
312
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
313 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
314 * 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
315 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
316 * @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
317 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
318 * @param p which pool to use
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
319 * @param size the size of the allocation
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
320 * @param c the initialization character
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
321 * @return pointer to the allocated memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
322 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
323 void *pmalloc_x(pool p, int size, char c)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
324 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
325 void* result = pmalloc(p, size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
326 if (result != NULL)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
327 memset(result, c, size);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
328 return result;
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
329 }
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
330
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
331 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
332 * allocate memory and initialize the memory with zero bytes
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 * easy safety utility (for creating blank mem for structs, etc)
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 * @param p which pool to use
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
337 * @param size the size of the allocation
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
338 * @return pointer to the allocated memory
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
339 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
340 void *pmalloco(pool p, int size)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
341 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
342 void *block = pmalloc(p, size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
343 memset(block, 0, size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
344 return block;
414
ec86d759ed54 Trailing whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
345 }
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
346
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
347 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
348 * duplicate a string and allocate memory for it
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 * @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
351 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
352 * @param p the pool to use
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
353 * @param src the string that should be duplicated
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
354 * @return the duplicated string
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
355 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
356 char *pstrdup(pool p, const char *src)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
357 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
358 char *ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
359
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
360 if(src == NULL)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
361 return NULL;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
362
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
363 ret = pmalloc(p,strlen(src) + 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
364 strcpy(ret,src);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
365
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
366 return ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
367 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
368
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
369 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
370 * 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
371 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
372 char *pstrdupx(pool p, const char *src)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
373 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
374 return pstrdup(p, src);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
375 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
376
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
377 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
378 * get the size of a memory pool
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 * @param p the pool
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
381 * @return the size
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
382 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
383 int pool_size(pool p)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
384 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
385 if(p == NULL) return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
386
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
387 return p->size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
388 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
389
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
390 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
391 * 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
392 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
393 * @param p which pool to free
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
394 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
395 void pool_free(pool p)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
396 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
397 struct pfree *cur, *stub;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
398
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
399 if(p == NULL) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
400
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
401 cur = p->cleanup;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
402 while(cur != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
403 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
404 (*cur->f)(cur->arg);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
405 stub = cur->next;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
406 _pool__free(cur);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
407 cur = stub;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
408 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
409
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
410 #ifdef POOL_DEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
411 ghash_remove(pool__disturbed,p->name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
412 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
413
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
414 _pool__free(p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
415
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
416 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
417
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
418 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
419 * 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
420 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
421 void pool_cleanup(pool p, pool_cleaner f, void *arg)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
422 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
423 struct pfree *clean;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
424
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
425 clean = _pool_free(p, f, arg);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
426 clean->next = p->cleanup;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
427 p->cleanup = clean;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
428 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
429
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
430 #ifdef POOL_DEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
431 void debug_log(char *zone, const char *msgfmt, ...);
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
432 void _pool_stat(xht h, const char *key, void *data, void *arg)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
433 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
434 pool p = (pool)data;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
435
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
436 if(p->lsize == -1)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
437 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
438 else if(p->size > p->lsize)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
439 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
440 else if((int)arg)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
441 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
442 p->lsize = p->size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
443 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
444
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
445 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
446 * print memory pool statistics (for debugging purposes)
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 * @param full make a full report? (0 = no, 1 = yes)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
449 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
450 void pool_stat(int full)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
451 {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
452 if (pool__disturbed == NULL || pool__disturbed == (xht)1)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
453 return;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
454
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
455 ghash_walk(pool__disturbed,_pool_stat,(void *)full);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
456 if(pool__total != pool__ltotal)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
457 debug_log("pool_debug","%d\ttotal missed mallocs",pool__total);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
458 pool__ltotal = pool__total;
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
459
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
460 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
461 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
462 #else
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
463 /**
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
464 * 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
465 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
466 * @param full make a full report? (0 = no, 1 = yes)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 414
diff changeset
467 */
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
468 void pool_stat(int full)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
469 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
470 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
471 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
472 #endif