annotate src/lib/mempool-system-clean.c @ 9354:687ac828b964 HEAD

lib-index: modseqs weren't tracked properly within session when changes were done.
author Timo Sirainen <tss@iki.fi>
date Tue, 01 Sep 2009 13:05:03 -0400
parents d6fcb6d050ba
children 00cd9aacd03c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 8206
diff changeset
1 /* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 /* @UNSAFE: whole file */
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "lib.h"
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "safe-memset.h"
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "mempool.h"
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8
9254
d6fcb6d050ba Don't include malloc.h if it doesn't have malloc_usable_size().
Timo Sirainen <tss@iki.fi>
parents: 8639
diff changeset
9 #include <stdlib.h>
d6fcb6d050ba Don't include malloc.h if it doesn't have malloc_usable_size().
Timo Sirainen <tss@iki.fi>
parents: 8639
diff changeset
10 #ifndef HAVE_MALLOC_USABLE_SIZE
d6fcb6d050ba Don't include malloc.h if it doesn't have malloc_usable_size().
Timo Sirainen <tss@iki.fi>
parents: 8639
diff changeset
11 /* no extra includes needed */
d6fcb6d050ba Don't include malloc.h if it doesn't have malloc_usable_size().
Timo Sirainen <tss@iki.fi>
parents: 8639
diff changeset
12 #elif defined (HAVE_MALLOC_NP_H)
d6fcb6d050ba Don't include malloc.h if it doesn't have malloc_usable_size().
Timo Sirainen <tss@iki.fi>
parents: 8639
diff changeset
13 # include <malloc_np.h> /* FreeBSD */
d6fcb6d050ba Don't include malloc.h if it doesn't have malloc_usable_size().
Timo Sirainen <tss@iki.fi>
parents: 8639
diff changeset
14 #elif defined (HAVE_MALLOC_H)
d6fcb6d050ba Don't include malloc.h if it doesn't have malloc_usable_size().
Timo Sirainen <tss@iki.fi>
parents: 8639
diff changeset
15 # include <malloc.h> /* Linux */
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #endif
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #ifdef HAVE_GC_GC_H
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 # include <gc/gc.h>
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #elif defined (HAVE_GC_H)
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 # include <gc.h>
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #endif
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
5378
61255eb991c3 Actually use MEM_ALIGN_SIZE to get the alignment right
Timo Sirainen <tss@iki.fi>
parents: 5377
diff changeset
24 /* use the maximum of required memory alignment and sizeof(void *)
61255eb991c3 Actually use MEM_ALIGN_SIZE to get the alignment right
Timo Sirainen <tss@iki.fi>
parents: 5377
diff changeset
25 (sizeof(size_t) is assumed to be same. it always is.) */
61255eb991c3 Actually use MEM_ALIGN_SIZE to get the alignment right
Timo Sirainen <tss@iki.fi>
parents: 5377
diff changeset
26 #if MEM_ALIGN_SIZE > SIZEOF_VOID_P
61255eb991c3 Actually use MEM_ALIGN_SIZE to get the alignment right
Timo Sirainen <tss@iki.fi>
parents: 5377
diff changeset
27 # define EXTRA_SIZE_SPACE MEM_ALIGN_SIZE
61255eb991c3 Actually use MEM_ALIGN_SIZE to get the alignment right
Timo Sirainen <tss@iki.fi>
parents: 5377
diff changeset
28 #else
61255eb991c3 Actually use MEM_ALIGN_SIZE to get the alignment right
Timo Sirainen <tss@iki.fi>
parents: 5377
diff changeset
29 # define EXTRA_SIZE_SPACE SIZEOF_VOID_P
61255eb991c3 Actually use MEM_ALIGN_SIZE to get the alignment right
Timo Sirainen <tss@iki.fi>
parents: 5377
diff changeset
30 #endif
5377
512cea8832e5 Use 64bit alignment always
Timo Sirainen <tss@iki.fi>
parents: 5376
diff changeset
31
7933
96b8f50c9eea Don't use malloc_usable_size() for clearing out memory before freeing it.
Timo Sirainen <tss@iki.fi>
parents: 7863
diff changeset
32 /* FIXME: Disabled for now, broken with Valgrind and HP-UX. */
96b8f50c9eea Don't use malloc_usable_size() for clearing out memory before freeing it.
Timo Sirainen <tss@iki.fi>
parents: 7863
diff changeset
33 #undef HAVE_MALLOC_USABLE_SIZE
96b8f50c9eea Don't use malloc_usable_size() for clearing out memory before freeing it.
Timo Sirainen <tss@iki.fi>
parents: 7863
diff changeset
34
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 static const char *pool_system_clean_get_name(pool_t pool);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 static void pool_system_clean_ref(pool_t pool);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 static void pool_system_clean_unref(pool_t *pool);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 static void *pool_system_clean_malloc(pool_t pool, size_t size);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 static void pool_system_clean_free(pool_t pool, void *mem);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 static void *pool_system_clean_realloc(pool_t pool, void *mem,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 size_t old_size, size_t new_size);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 static void pool_system_clean_clear(pool_t pool);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 static size_t pool_system_clean_get_max_easy_alloc_size(pool_t pool);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 static struct pool_vfuncs static_system_clean_pool_vfuncs = {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 pool_system_clean_get_name,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 pool_system_clean_ref,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 pool_system_clean_unref,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 pool_system_clean_malloc,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 pool_system_clean_free,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 pool_system_clean_realloc,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 pool_system_clean_clear,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 pool_system_clean_get_max_easy_alloc_size
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 };
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 static struct pool static_system_clean_pool = {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 MEMBER(v) &static_system_clean_pool_vfuncs,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 MEMBER(alloconly_pool) FALSE,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 MEMBER(datastack_pool) FALSE
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 };
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 pool_t system_clean_pool = &static_system_clean_pool;
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5378
diff changeset
69 static const char *pool_system_clean_get_name(pool_t pool ATTR_UNUSED)
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 return "system clean";
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5378
diff changeset
74 static void pool_system_clean_ref(pool_t pool ATTR_UNUSED)
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5378
diff changeset
78 static void pool_system_clean_unref(pool_t *pool ATTR_UNUSED)
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 static size_t mem_get_size(void *mem)
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 #ifdef USE_GC
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 return GC_size(mem);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 #elif defined(HAVE_MALLOC_USABLE_SIZE)
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 return malloc_usable_size(mem);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 #else
5377
512cea8832e5 Use 64bit alignment always
Timo Sirainen <tss@iki.fi>
parents: 5376
diff changeset
89 return *((size_t *)PTR_OFFSET(mem, -EXTRA_SIZE_SPACE));
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 #endif
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5378
diff changeset
93 static void *pool_system_clean_malloc(pool_t pool ATTR_UNUSED, size_t size)
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 void *mem;
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
97 if (unlikely(size == 0 || size > SSIZE_T_MAX))
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 i_panic("Trying to allocate %"PRIuSIZE_T" bytes", size);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 #ifdef USE_GC
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 mem = GC_malloc(size);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 #else
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 #ifndef HAVE_MALLOC_USABLE_SIZE
5377
512cea8832e5 Use 64bit alignment always
Timo Sirainen <tss@iki.fi>
parents: 5376
diff changeset
104 size += EXTRA_SIZE_SPACE;
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 #endif
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 mem = calloc(size, 1);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 #endif
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
108 if (unlikely(mem == NULL)) {
8206
53ad035a2d0b If memory allocation fails, log how large allocation we were trying to do.
Timo Sirainen <tss@iki.fi>
parents: 7933
diff changeset
109 i_fatal_status(FATAL_OUTOFMEM, "pool_system_malloc(%"PRIuSIZE_T
53ad035a2d0b If memory allocation fails, log how large allocation we were trying to do.
Timo Sirainen <tss@iki.fi>
parents: 7933
diff changeset
110 "): Out of memory", size);
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 #if !defined(USE_GC) && !defined(HAVE_MALLOC_USABLE_SIZE)
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 size_t *saved_size = mem;
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115
5377
512cea8832e5 Use 64bit alignment always
Timo Sirainen <tss@iki.fi>
parents: 5376
diff changeset
116 *saved_size = size - EXTRA_SIZE_SPACE;
512cea8832e5 Use 64bit alignment always
Timo Sirainen <tss@iki.fi>
parents: 5376
diff changeset
117 mem = PTR_OFFSET(mem, EXTRA_SIZE_SPACE);
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 #endif
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 return mem;
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5378
diff changeset
123 static void pool_system_clean_free(pool_t pool ATTR_UNUSED, void *mem)
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 if (mem != NULL) {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 safe_memset(mem, 0, mem_get_size(mem));
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 #ifndef USE_GC
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 #ifndef HAVE_MALLOC_USABLE_SIZE
5377
512cea8832e5 Use 64bit alignment always
Timo Sirainen <tss@iki.fi>
parents: 5376
diff changeset
129 mem = PTR_OFFSET(mem, -EXTRA_SIZE_SPACE);
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 #endif
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 free(mem);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 #endif
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5378
diff changeset
136 static void *pool_system_clean_realloc(pool_t pool ATTR_UNUSED, void *mem,
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 size_t old_size, size_t new_size)
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 void *new_mem;
8639
685a5e3565b0 mempool system clean: Don't break if realloc() shrinks the memory area.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
140 size_t old_alloc_size;
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
142 if (unlikely(new_size == 0 || new_size > SSIZE_T_MAX))
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 i_panic("Trying to allocate %"PRIuSIZE_T" bytes", new_size);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 new_mem = pool_system_clean_malloc(pool, new_size);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 if (mem != NULL) {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 #if !defined(USE_GC) && defined(HAVE_MALLOC_USABLE_SIZE)
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 i_assert(old_size == (size_t)-1 ||
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 old_size <= malloc_usable_size(mem));
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 #endif
8639
685a5e3565b0 mempool system clean: Don't break if realloc() shrinks the memory area.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
151 old_alloc_size = mem_get_size(mem);
685a5e3565b0 mempool system clean: Don't break if realloc() shrinks the memory area.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
152 memcpy(new_mem, mem, I_MIN(old_alloc_size, new_size));
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 if (old_size < new_size) {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 /* clear new data */
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 memset((char *)new_mem + old_size, 0,
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 new_size - old_size);
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 }
8639
685a5e3565b0 mempool system clean: Don't break if realloc() shrinks the memory area.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
159 pool_system_clean_free(pool, mem);
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 return new_mem;
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5378
diff changeset
165 static void ATTR_NORETURN
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5378
diff changeset
166 pool_system_clean_clear(pool_t pool ATTR_UNUSED)
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 i_panic("pool_system_clean_clear() must not be called");
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 }
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 static size_t
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5378
diff changeset
172 pool_system_clean_get_max_easy_alloc_size(pool_t pool ATTR_UNUSED)
5356
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 {
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 return 0;
48fe4fe9ef64 Added system_clean_pool. default_pool is now set statically, so it can be
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 }