1 | /* GLIB - Library of useful routines for C programming |
---|
2 | * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald |
---|
3 | * |
---|
4 | * This library is free software; you can redistribute it and/or |
---|
5 | * modify it under the terms of the GNU Lesser General Public |
---|
6 | * License as published by the Free Software Foundation; either |
---|
7 | * version 2 of the License, or (at your option) any later version. |
---|
8 | * |
---|
9 | * This library is distributed in the hope that it will be useful, |
---|
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
12 | * Lesser General Public License for more details. |
---|
13 | * |
---|
14 | * You should have received a copy of the GNU Lesser General Public |
---|
15 | * License along with this library; if not, write to the |
---|
16 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
---|
17 | * Boston, MA 02111-1307, USA. |
---|
18 | */ |
---|
19 | |
---|
20 | /* |
---|
21 | * Modified by the GLib Team and others 1997-2000. See the AUTHORS |
---|
22 | * file for a list of people on the GLib Team. See the ChangeLog |
---|
23 | * files for a list of changes. These files are distributed with |
---|
24 | * GLib at ftp://ftp.gtk.org/pub/gtk/. |
---|
25 | */ |
---|
26 | |
---|
27 | #ifndef __G_MEM_H__ |
---|
28 | #define __G_MEM_H__ |
---|
29 | |
---|
30 | #include <glib/gtypes.h> |
---|
31 | |
---|
32 | G_BEGIN_DECLS |
---|
33 | |
---|
34 | typedef struct _GAllocator GAllocator; |
---|
35 | typedef struct _GMemChunk GMemChunk; |
---|
36 | typedef struct _GMemVTable GMemVTable; |
---|
37 | |
---|
38 | |
---|
39 | #if GLIB_SIZEOF_VOID_P > GLIB_SIZEOF_LONG |
---|
40 | # define G_MEM_ALIGN GLIB_SIZEOF_VOID_P |
---|
41 | #else /* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */ |
---|
42 | # define G_MEM_ALIGN GLIB_SIZEOF_LONG |
---|
43 | #endif /* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */ |
---|
44 | |
---|
45 | |
---|
46 | /* Memory allocation functions |
---|
47 | */ |
---|
48 | gpointer g_malloc (gulong n_bytes); |
---|
49 | gpointer g_malloc0 (gulong n_bytes); |
---|
50 | gpointer g_realloc (gpointer mem, |
---|
51 | gulong n_bytes); |
---|
52 | void g_free (gpointer mem); |
---|
53 | gpointer g_try_malloc (gulong n_bytes); |
---|
54 | gpointer g_try_realloc (gpointer mem, |
---|
55 | gulong n_bytes); |
---|
56 | |
---|
57 | |
---|
58 | /* Convenience memory allocators |
---|
59 | */ |
---|
60 | #define g_new(struct_type, n_structs) \ |
---|
61 | ((struct_type *) g_malloc (((gsize) sizeof (struct_type)) * ((gsize) (n_structs)))) |
---|
62 | #define g_new0(struct_type, n_structs) \ |
---|
63 | ((struct_type *) g_malloc0 (((gsize) sizeof (struct_type)) * ((gsize) (n_structs)))) |
---|
64 | #define g_renew(struct_type, mem, n_structs) \ |
---|
65 | ((struct_type *) g_realloc ((mem), ((gsize) sizeof (struct_type)) * ((gsize) (n_structs)))) |
---|
66 | |
---|
67 | |
---|
68 | /* Memory allocation virtualization for debugging purposes |
---|
69 | * g_mem_set_vtable() has to be the very first GLib function called |
---|
70 | * if being used |
---|
71 | */ |
---|
72 | struct _GMemVTable |
---|
73 | { |
---|
74 | gpointer (*malloc) (gsize n_bytes); |
---|
75 | gpointer (*realloc) (gpointer mem, |
---|
76 | gsize n_bytes); |
---|
77 | void (*free) (gpointer mem); |
---|
78 | /* optional; set to NULL if not used ! */ |
---|
79 | gpointer (*calloc) (gsize n_blocks, |
---|
80 | gsize n_block_bytes); |
---|
81 | gpointer (*try_malloc) (gsize n_bytes); |
---|
82 | gpointer (*try_realloc) (gpointer mem, |
---|
83 | gsize n_bytes); |
---|
84 | }; |
---|
85 | void g_mem_set_vtable (GMemVTable *vtable); |
---|
86 | gboolean g_mem_is_system_malloc (void); |
---|
87 | |
---|
88 | /* Memory profiler and checker, has to be enabled via g_mem_set_vtable() |
---|
89 | */ |
---|
90 | GLIB_VAR GMemVTable *glib_mem_profiler_table; |
---|
91 | void g_mem_profile (void); |
---|
92 | |
---|
93 | |
---|
94 | /* Memchunk convenience functions |
---|
95 | */ |
---|
96 | #define g_mem_chunk_create(type, pre_alloc, alloc_type) ( \ |
---|
97 | g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \ |
---|
98 | sizeof (type), \ |
---|
99 | sizeof (type) * (pre_alloc), \ |
---|
100 | (alloc_type)) \ |
---|
101 | ) |
---|
102 | #define g_chunk_new(type, chunk) ( \ |
---|
103 | (type *) g_mem_chunk_alloc (chunk) \ |
---|
104 | ) |
---|
105 | #define g_chunk_new0(type, chunk) ( \ |
---|
106 | (type *) g_mem_chunk_alloc0 (chunk) \ |
---|
107 | ) |
---|
108 | #define g_chunk_free(mem, mem_chunk) G_STMT_START { \ |
---|
109 | g_mem_chunk_free ((mem_chunk), (mem)); \ |
---|
110 | } G_STMT_END |
---|
111 | |
---|
112 | |
---|
113 | /* "g_mem_chunk_new" creates a new memory chunk. |
---|
114 | * Memory chunks are used to allocate pieces of memory which are |
---|
115 | * always the same size. Lists are a good example of such a data type. |
---|
116 | * The memory chunk allocates and frees blocks of memory as needed. |
---|
117 | * Just be sure to call "g_mem_chunk_free" and not "g_free" on data |
---|
118 | * allocated in a mem chunk. ("g_free" will most likely cause a seg |
---|
119 | * fault...somewhere). |
---|
120 | * |
---|
121 | * Oh yeah, GMemChunk is an opaque data type. (You don't really |
---|
122 | * want to know what's going on inside do you?) |
---|
123 | */ |
---|
124 | |
---|
125 | /* ALLOC_ONLY MemChunks can only allocate memory. The free operation |
---|
126 | * is interpreted as a no op. ALLOC_ONLY MemChunks save 4 bytes per |
---|
127 | * atom. (They are also useful for lists which use MemChunk to allocate |
---|
128 | * memory but are also part of the MemChunk implementation). |
---|
129 | * ALLOC_AND_FREE MemChunks can allocate and free memory. |
---|
130 | */ |
---|
131 | |
---|
132 | #define G_ALLOC_ONLY 1 |
---|
133 | #define G_ALLOC_AND_FREE 2 |
---|
134 | |
---|
135 | GMemChunk* g_mem_chunk_new (const gchar *name, |
---|
136 | gint atom_size, |
---|
137 | gulong area_size, |
---|
138 | gint type); |
---|
139 | void g_mem_chunk_destroy (GMemChunk *mem_chunk); |
---|
140 | gpointer g_mem_chunk_alloc (GMemChunk *mem_chunk); |
---|
141 | gpointer g_mem_chunk_alloc0 (GMemChunk *mem_chunk); |
---|
142 | void g_mem_chunk_free (GMemChunk *mem_chunk, |
---|
143 | gpointer mem); |
---|
144 | void g_mem_chunk_clean (GMemChunk *mem_chunk); |
---|
145 | void g_mem_chunk_reset (GMemChunk *mem_chunk); |
---|
146 | void g_mem_chunk_print (GMemChunk *mem_chunk); |
---|
147 | void g_mem_chunk_info (void); |
---|
148 | |
---|
149 | /* Ah yes...we have a "g_blow_chunks" function. |
---|
150 | * "g_blow_chunks" simply compresses all the chunks. This operation |
---|
151 | * consists of freeing every memory area that should be freed (but |
---|
152 | * which we haven't gotten around to doing yet). And, no, |
---|
153 | * "g_blow_chunks" doesn't follow the naming scheme, but it is a |
---|
154 | * much better name than "g_mem_chunk_clean_all" or something |
---|
155 | * similar. |
---|
156 | */ |
---|
157 | void g_blow_chunks (void); |
---|
158 | |
---|
159 | |
---|
160 | /* Generic allocators |
---|
161 | */ |
---|
162 | GAllocator* g_allocator_new (const gchar *name, |
---|
163 | guint n_preallocs); |
---|
164 | void g_allocator_free (GAllocator *allocator); |
---|
165 | |
---|
166 | /* internal */ |
---|
167 | #define G_ALLOCATOR_LIST (1) |
---|
168 | #define G_ALLOCATOR_SLIST (2) |
---|
169 | #define G_ALLOCATOR_NODE (3) |
---|
170 | |
---|
171 | |
---|
172 | G_END_DECLS |
---|
173 | |
---|
174 | #endif /* __G_MEM_H__ */ |
---|