source: trunk/third/glib2/glib/gmem.h @ 20721

Revision 20721, 5.8 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r20720, which included commits to RCS files with non-trunk default branches.
Line 
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
32G_BEGIN_DECLS
33
34typedef struct _GAllocator GAllocator;
35typedef struct _GMemChunk  GMemChunk;
36typedef 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 */
48gpointer g_malloc         (gulong        n_bytes);
49gpointer g_malloc0        (gulong        n_bytes);
50gpointer g_realloc        (gpointer      mem,
51                           gulong        n_bytes);
52void     g_free           (gpointer      mem);
53gpointer g_try_malloc     (gulong        n_bytes);
54gpointer 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 */
72struct _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};
85void     g_mem_set_vtable (GMemVTable   *vtable);
86gboolean g_mem_is_system_malloc (void);
87
88/* Memory profiler and checker, has to be enabled via g_mem_set_vtable()
89 */
90GLIB_VAR GMemVTable     *glib_mem_profiler_table;
91void    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
135GMemChunk* g_mem_chunk_new     (const gchar *name,
136                                gint         atom_size,
137                                gulong       area_size,
138                                gint         type);
139void       g_mem_chunk_destroy (GMemChunk   *mem_chunk);
140gpointer   g_mem_chunk_alloc   (GMemChunk   *mem_chunk);
141gpointer   g_mem_chunk_alloc0  (GMemChunk   *mem_chunk);
142void       g_mem_chunk_free    (GMemChunk   *mem_chunk,
143                                gpointer     mem);
144void       g_mem_chunk_clean   (GMemChunk   *mem_chunk);
145void       g_mem_chunk_reset   (GMemChunk   *mem_chunk);
146void       g_mem_chunk_print   (GMemChunk   *mem_chunk);
147void       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 */
157void       g_blow_chunks (void);
158
159
160/* Generic allocators
161 */
162GAllocator* g_allocator_new   (const gchar  *name,
163                               guint         n_preallocs);
164void        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
172G_END_DECLS
173
174#endif /* __G_MEM_H__ */
Note: See TracBrowser for help on using the repository browser.