• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.1 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, see <http://www.gnu.org/licenses/>.
16  */
17 
18 /*
19  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
20  * file for a list of people on the GLib Team.  See the ChangeLog
21  * files for a list of changes.  These files are distributed with
22  * GLib at ftp://ftp.gtk.org/pub/gtk/.
23  */
24 
25 #ifndef __G_MEM_H__
26 #define __G_MEM_H__
27 
28 #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
29 #error "Only <glib.h> can be included directly."
30 #endif
31 
32 #include <glib/gutils.h>
33 
34 #if defined(glib_typeof_2_68) && GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68
35 /* for glib_typeof */
36 #include <type_traits>
37 #endif
38 
39 G_BEGIN_DECLS
40 
41 /**
42  * GMemVTable:
43  * @malloc: function to use for allocating memory.
44  * @realloc: function to use for reallocating memory.
45  * @free: function to use to free memory.
46  * @calloc: function to use for allocating zero-filled memory.
47  * @try_malloc: function to use for allocating memory without a default error handler.
48  * @try_realloc: function to use for reallocating memory without a default error handler.
49  *
50  * A set of functions used to perform memory allocation. The same #GMemVTable must
51  * be used for all allocations in the same program; a call to g_mem_set_vtable(),
52  * if it exists, should be prior to any use of GLib.
53  *
54  * This functions related to this has been deprecated in 2.46, and no longer work.
55  */
56 typedef struct _GMemVTable GMemVTable;
57 
58 
59 #if GLIB_SIZEOF_VOID_P > GLIB_SIZEOF_LONG
60 /**
61  * G_MEM_ALIGN:
62  *
63  * Indicates the number of bytes to which memory will be aligned on the
64  * current platform.
65  */
66 #  define G_MEM_ALIGN	GLIB_SIZEOF_VOID_P
67 #else	/* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */
68 #  define G_MEM_ALIGN	GLIB_SIZEOF_LONG
69 #endif	/* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */
70 
71 
72 /* Memory allocation functions
73  */
74 
75 GLIB_AVAILABLE_IN_ALL
76 void	 g_free	          (gpointer	 mem);
77 
78 GLIB_AVAILABLE_IN_2_34
79 void     g_clear_pointer  (gpointer      *pp,
80                            GDestroyNotify destroy);
81 
82 GLIB_AVAILABLE_IN_ALL
83 gpointer g_malloc         (gsize	 n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
84 GLIB_AVAILABLE_IN_ALL
85 gpointer g_malloc0        (gsize	 n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
86 GLIB_AVAILABLE_IN_ALL
87 gpointer g_realloc        (gpointer	 mem,
88 			   gsize	 n_bytes) G_GNUC_WARN_UNUSED_RESULT;
89 GLIB_AVAILABLE_IN_ALL
90 gpointer g_try_malloc     (gsize	 n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
91 GLIB_AVAILABLE_IN_ALL
92 gpointer g_try_malloc0    (gsize	 n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
93 GLIB_AVAILABLE_IN_ALL
94 gpointer g_try_realloc    (gpointer	 mem,
95 			   gsize	 n_bytes) G_GNUC_WARN_UNUSED_RESULT;
96 
97 GLIB_AVAILABLE_IN_ALL
98 gpointer g_malloc_n       (gsize	 n_blocks,
99 			   gsize	 n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
100 GLIB_AVAILABLE_IN_ALL
101 gpointer g_malloc0_n      (gsize	 n_blocks,
102 			   gsize	 n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
103 GLIB_AVAILABLE_IN_ALL
104 gpointer g_realloc_n      (gpointer	 mem,
105 			   gsize	 n_blocks,
106 			   gsize	 n_block_bytes) G_GNUC_WARN_UNUSED_RESULT;
107 GLIB_AVAILABLE_IN_ALL
108 gpointer g_try_malloc_n   (gsize	 n_blocks,
109 			   gsize	 n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
110 GLIB_AVAILABLE_IN_ALL
111 gpointer g_try_malloc0_n  (gsize	 n_blocks,
112 			   gsize	 n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2);
113 GLIB_AVAILABLE_IN_ALL
114 gpointer g_try_realloc_n  (gpointer	 mem,
115 			   gsize	 n_blocks,
116 			   gsize	 n_block_bytes) G_GNUC_WARN_UNUSED_RESULT;
117 
118 #if defined(glib_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_58 && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)
119 #define g_clear_pointer(pp, destroy)                     \
120   G_STMT_START                                           \
121   {                                                      \
122     G_STATIC_ASSERT (sizeof *(pp) == sizeof (gpointer)); \
123     glib_typeof ((pp)) _pp = (pp);                       \
124     glib_typeof (*(pp)) _ptr = *_pp;                     \
125     *_pp = NULL;                                         \
126     if (_ptr)                                            \
127       (destroy) (_ptr);                                  \
128   }                                                      \
129   G_STMT_END                                             \
130   GLIB_AVAILABLE_MACRO_IN_2_34
131 #else /* __GNUC__ */
132 #define g_clear_pointer(pp, destroy) \
133   G_STMT_START {                                                               \
134     G_STATIC_ASSERT (sizeof *(pp) == sizeof (gpointer));                       \
135     /* Only one access, please; work around type aliasing */                   \
136     union { char *in; gpointer *out; } _pp;                                    \
137     gpointer _p;                                                               \
138     /* This assignment is needed to avoid a gcc warning */                     \
139     GDestroyNotify _destroy = (GDestroyNotify) (destroy);                      \
140                                                                                \
141     _pp.in = (char *) (pp);                                                    \
142     _p = *_pp.out;                                                             \
143     if (_p) 								       \
144       { 								       \
145         *_pp.out = NULL;                                                       \
146         _destroy (_p);                                                         \
147       }                                                                        \
148   } G_STMT_END                                                                 \
149   GLIB_AVAILABLE_MACRO_IN_2_34
150 #endif /* __GNUC__ */
151 
152 /**
153  * g_steal_pointer:
154  * @pp: (not nullable): a pointer to a pointer
155  *
156  * Sets @pp to %NULL, returning the value that was there before.
157  *
158  * Conceptually, this transfers the ownership of the pointer from the
159  * referenced variable to the "caller" of the macro (ie: "steals" the
160  * reference).
161  *
162  * The return value will be properly typed, according to the type of
163  * @pp.
164  *
165  * This can be very useful when combined with g_autoptr() to prevent the
166  * return value of a function from being automatically freed.  Consider
167  * the following example (which only works on GCC and clang):
168  *
169  * |[
170  * GObject *
171  * create_object (void)
172  * {
173  *   g_autoptr(GObject) obj = g_object_new (G_TYPE_OBJECT, NULL);
174  *
175  *   if (early_error_case)
176  *     return NULL;
177  *
178  *   return g_steal_pointer (&obj);
179  * }
180  * ]|
181  *
182  * It can also be used in similar ways for 'out' parameters and is
183  * particularly useful for dealing with optional out parameters:
184  *
185  * |[
186  * gboolean
187  * get_object (GObject **obj_out)
188  * {
189  *   g_autoptr(GObject) obj = g_object_new (G_TYPE_OBJECT, NULL);
190  *
191  *   if (early_error_case)
192  *     return FALSE;
193  *
194  *   if (obj_out)
195  *     *obj_out = g_steal_pointer (&obj);
196  *
197  *   return TRUE;
198  * }
199  * ]|
200  *
201  * In the above example, the object will be automatically freed in the
202  * early error case and also in the case that %NULL was given for
203  * @obj_out.
204  *
205  * Since: 2.44
206  */
207 GLIB_AVAILABLE_STATIC_INLINE_IN_2_44
208 static inline gpointer
g_steal_pointer(gpointer pp)209 g_steal_pointer (gpointer pp)
210 {
211   gpointer *ptr = (gpointer *) pp;
212   gpointer ref;
213 
214   ref = *ptr;
215   *ptr = NULL;
216 
217   return ref;
218 }
219 
220 /* type safety */
221 #if defined(glib_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_58 && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)
222 #define g_steal_pointer(pp) ((glib_typeof (*pp)) (g_steal_pointer) (pp))
223 #else  /* __GNUC__ */
224 /* This version does not depend on gcc extensions, but gcc does not warn
225  * about incompatible-pointer-types: */
226 #define g_steal_pointer(pp) \
227   (0 ? (*(pp)) : (g_steal_pointer) (pp))
228 #endif /* __GNUC__ */
229 
230 /* Optimise: avoid the call to the (slower) _n function if we can
231  * determine at compile-time that no overflow happens.
232  */
233 #if defined (__GNUC__) && (__GNUC__ >= 2) && defined (__OPTIMIZE__)
234 #  define _G_NEW(struct_type, n_structs, func) \
235 	(struct_type *) (G_GNUC_EXTENSION ({			\
236 	  gsize __n = (gsize) (n_structs);			\
237 	  gsize __s = sizeof (struct_type);			\
238 	  gpointer __p;						\
239 	  if (__s == 1)						\
240 	    __p = g_##func (__n);				\
241 	  else if (__builtin_constant_p (__n) &&		\
242 	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
243 	    __p = g_##func (__n * __s);				\
244 	  else							\
245 	    __p = g_##func##_n (__n, __s);			\
246 	  __p;							\
247 	}))
248 #  define _G_RENEW(struct_type, mem, n_structs, func) \
249 	(struct_type *) (G_GNUC_EXTENSION ({			\
250 	  gsize __n = (gsize) (n_structs);			\
251 	  gsize __s = sizeof (struct_type);			\
252 	  gpointer __p = (gpointer) (mem);			\
253 	  if (__s == 1)						\
254 	    __p = g_##func (__p, __n);				\
255 	  else if (__builtin_constant_p (__n) &&		\
256 	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
257 	    __p = g_##func (__p, __n * __s);			\
258 	  else							\
259 	    __p = g_##func##_n (__p, __n, __s);			\
260 	  __p;							\
261 	}))
262 
263 #else
264 
265 /* Unoptimised version: always call the _n() function. */
266 
267 #define _G_NEW(struct_type, n_structs, func) \
268         ((struct_type *) g_##func##_n ((n_structs), sizeof (struct_type)))
269 #define _G_RENEW(struct_type, mem, n_structs, func) \
270         ((struct_type *) g_##func##_n (mem, (n_structs), sizeof (struct_type)))
271 
272 #endif
273 
274 /**
275  * g_new:
276  * @struct_type: the type of the elements to allocate
277  * @n_structs: the number of elements to allocate
278  *
279  * Allocates @n_structs elements of type @struct_type.
280  * The returned pointer is cast to a pointer to the given type.
281  * If @n_structs is 0 it returns %NULL.
282  * Care is taken to avoid overflow when calculating the size of the allocated block.
283  *
284  * Since the returned pointer is already casted to the right type,
285  * it is normally unnecessary to cast it explicitly, and doing
286  * so might hide memory allocation errors.
287  *
288  * Returns: a pointer to the allocated memory, cast to a pointer to @struct_type
289  */
290 #define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
291 /**
292  * g_new0:
293  * @struct_type: the type of the elements to allocate.
294  * @n_structs: the number of elements to allocate.
295  *
296  * Allocates @n_structs elements of type @struct_type, initialized to 0's.
297  * The returned pointer is cast to a pointer to the given type.
298  * If @n_structs is 0 it returns %NULL.
299  * Care is taken to avoid overflow when calculating the size of the allocated block.
300  *
301  * Since the returned pointer is already casted to the right type,
302  * it is normally unnecessary to cast it explicitly, and doing
303  * so might hide memory allocation errors.
304  *
305  * Returns: a pointer to the allocated memory, cast to a pointer to @struct_type.
306  */
307 #define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
308 /**
309  * g_renew:
310  * @struct_type: the type of the elements to allocate
311  * @mem: the currently allocated memory
312  * @n_structs: the number of elements to allocate
313  *
314  * Reallocates the memory pointed to by @mem, so that it now has space for
315  * @n_structs elements of type @struct_type. It returns the new address of
316  * the memory, which may have been moved.
317  * Care is taken to avoid overflow when calculating the size of the allocated block.
318  *
319  * Returns: a pointer to the new allocated memory, cast to a pointer to @struct_type
320  */
321 #define g_renew(struct_type, mem, n_structs)		_G_RENEW (struct_type, mem, n_structs, realloc)
322 /**
323  * g_try_new:
324  * @struct_type: the type of the elements to allocate
325  * @n_structs: the number of elements to allocate
326  *
327  * Attempts to allocate @n_structs elements of type @struct_type, and returns
328  * %NULL on failure. Contrast with g_new(), which aborts the program on failure.
329  * The returned pointer is cast to a pointer to the given type.
330  * The function returns %NULL when @n_structs is 0 of if an overflow occurs.
331  *
332  * Since: 2.8
333  * Returns: a pointer to the allocated memory, cast to a pointer to @struct_type
334  */
335 #define g_try_new(struct_type, n_structs)		_G_NEW (struct_type, n_structs, try_malloc)
336 /**
337  * g_try_new0:
338  * @struct_type: the type of the elements to allocate
339  * @n_structs: the number of elements to allocate
340  *
341  * Attempts to allocate @n_structs elements of type @struct_type, initialized
342  * to 0's, and returns %NULL on failure. Contrast with g_new0(), which aborts
343  * the program on failure.
344  * The returned pointer is cast to a pointer to the given type.
345  * The function returns %NULL when @n_structs is 0 or if an overflow occurs.
346  *
347  * Since: 2.8
348  * Returns: a pointer to the allocated memory, cast to a pointer to @struct_type
349  */
350 #define g_try_new0(struct_type, n_structs)		_G_NEW (struct_type, n_structs, try_malloc0)
351 /**
352  * g_try_renew:
353  * @struct_type: the type of the elements to allocate
354  * @mem: the currently allocated memory
355  * @n_structs: the number of elements to allocate
356  *
357  * Attempts to reallocate the memory pointed to by @mem, so that it now has
358  * space for @n_structs elements of type @struct_type, and returns %NULL on
359  * failure. Contrast with g_renew(), which aborts the program on failure.
360  * It returns the new address of the memory, which may have been moved.
361  * The function returns %NULL if an overflow occurs.
362  *
363  * Since: 2.8
364  * Returns: a pointer to the new allocated memory, cast to a pointer to @struct_type
365  */
366 #define g_try_renew(struct_type, mem, n_structs)	_G_RENEW (struct_type, mem, n_structs, try_realloc)
367 
368 
369 /* Memory allocation virtualization for debugging purposes
370  * g_mem_set_vtable() has to be the very first GLib function called
371  * if being used
372  */
373 struct _GMemVTable {
374   gpointer (*malloc)      (gsize    n_bytes);
375   gpointer (*realloc)     (gpointer mem,
376 			   gsize    n_bytes);
377   void     (*free)        (gpointer mem);
378   /* optional; set to NULL if not used ! */
379   gpointer (*calloc)      (gsize    n_blocks,
380 			   gsize    n_block_bytes);
381   gpointer (*try_malloc)  (gsize    n_bytes);
382   gpointer (*try_realloc) (gpointer mem,
383 			   gsize    n_bytes);
384 };
385 GLIB_DEPRECATED_IN_2_46
386 void	 g_mem_set_vtable (GMemVTable	*vtable);
387 GLIB_DEPRECATED_IN_2_46
388 gboolean g_mem_is_system_malloc (void);
389 
390 GLIB_VAR gboolean g_mem_gc_friendly;
391 
392 /* Memory profiler and checker, has to be enabled via g_mem_set_vtable()
393  */
394 GLIB_VAR GMemVTable	*glib_mem_profiler_table;
395 GLIB_DEPRECATED_IN_2_46
396 void	g_mem_profile	(void);
397 
398 G_END_DECLS
399 
400 #endif /* __G_MEM_H__ */
401