make it possible to disable single-file includes by defining
[platform/upstream/glib.git] / glib / gmem.h
index d1f3d6a..5c83d9f 100644 (file)
  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
  * file for a list of people on the GLib Team.  See the ChangeLog
  * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */
 
+#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__G_LIB_H__) && !defined (GLIB_COMPILATION)
+#error "Only <glib.h> can be included directly."
+#endif
+
 #ifndef __G_MEM_H__
 #define __G_MEM_H__
 
+#include <glib/gslice.h>
 #include <glib/gtypes.h>
 
 G_BEGIN_DECLS
 
-typedef struct _GAllocator GAllocator;
-typedef struct _GMemChunk  GMemChunk;
 typedef struct _GMemVTable GMemVTable;
 
 
@@ -45,14 +48,15 @@ typedef struct _GMemVTable GMemVTable;
 
 /* Memory allocation functions
  */
-gpointer g_malloc         (gulong       n_bytes);
-gpointer g_malloc0        (gulong       n_bytes);
+gpointer g_malloc         (gsize        n_bytes) G_GNUC_MALLOC;
+gpointer g_malloc0        (gsize        n_bytes) G_GNUC_MALLOC;
 gpointer g_realloc        (gpointer     mem,
-                          gulong        n_bytes);
+                          gsize         n_bytes) G_GNUC_WARN_UNUSED_RESULT;
 void    g_free           (gpointer      mem);
-gpointer g_try_malloc     (gulong       n_bytes);
+gpointer g_try_malloc     (gsize        n_bytes) G_GNUC_MALLOC;
+gpointer g_try_malloc0    (gsize        n_bytes) G_GNUC_MALLOC;
 gpointer g_try_realloc    (gpointer     mem,
-                          gulong        n_bytes);
+                          gsize         n_bytes) G_GNUC_WARN_UNUSED_RESULT;
 
 
 /* Convenience memory allocators
@@ -64,6 +68,13 @@ gpointer g_try_realloc    (gpointer   mem,
 #define g_renew(struct_type, mem, n_structs)   \
     ((struct_type *) g_realloc ((mem), ((gsize) sizeof (struct_type)) * ((gsize) (n_structs))))
 
+#define g_try_new(struct_type, n_structs)              \
+    ((struct_type *) g_try_malloc (((gsize) sizeof (struct_type)) * ((gsize) (n_structs))))
+#define g_try_new0(struct_type, n_structs)             \
+    ((struct_type *) g_try_malloc0 (((gsize) sizeof (struct_type)) * ((gsize) (n_structs))))
+#define g_try_renew(struct_type, mem, n_structs)       \
+    ((struct_type *) g_try_realloc ((mem), ((gsize) sizeof (struct_type)) * ((gsize) (n_structs))))
+
 
 /* Memory allocation virtualization for debugging purposes
  * g_mem_set_vtable() has to be the very first GLib function called
@@ -75,7 +86,7 @@ struct _GMemVTable
   gpointer (*realloc)     (gpointer mem,
                           gsize    n_bytes);
   void     (*free)        (gpointer mem);
-  /* optional */
+  /* optional; set to NULL if not used ! */
   gpointer (*calloc)      (gsize    n_blocks,
                           gsize    n_block_bytes);
   gpointer (*try_malloc)  (gsize    n_bytes);
@@ -83,7 +94,9 @@ struct _GMemVTable
                           gsize    n_bytes);
 };
 void    g_mem_set_vtable (GMemVTable   *vtable);
-gboolean g_mem_vtable_is_set (void);
+gboolean g_mem_is_system_malloc (void);
+
+GLIB_VAR gboolean g_mem_gc_friendly;
 
 /* Memory profiler and checker, has to be enabled via g_mem_set_vtable()
  */
@@ -91,8 +104,10 @@ GLIB_VAR GMemVTable *glib_mem_profiler_table;
 void   g_mem_profile   (void);
 
 
-/* Memchunk convenience functions
- */
+/* deprecated memchunks and allocators */
+#if !defined (G_DISABLE_DEPRECATED) || defined (GTK_COMPILATION) || defined (GDK_COMPILATION)
+typedef struct _GAllocator GAllocator;
+typedef struct _GMemChunk  GMemChunk;
 #define g_mem_chunk_create(type, pre_alloc, alloc_type)        ( \
   g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \
                   sizeof (type), \
@@ -108,33 +123,11 @@ void      g_mem_profile   (void);
 #define g_chunk_free(mem, mem_chunk)   G_STMT_START { \
   g_mem_chunk_free ((mem_chunk), (mem)); \
 } G_STMT_END
-
-
-/* "g_mem_chunk_new" creates a new memory chunk.
- * Memory chunks are used to allocate pieces of memory which are
- *  always the same size. Lists are a good example of such a data type.
- * The memory chunk allocates and frees blocks of memory as needed.
- *  Just be sure to call "g_mem_chunk_free" and not "g_free" on data
- *  allocated in a mem chunk. ("g_free" will most likely cause a seg
- *  fault...somewhere).
- *
- * Oh yeah, GMemChunk is an opaque data type. (You don't really
- *  want to know what's going on inside do you?)
- */
-
-/* ALLOC_ONLY MemChunk's can only allocate memory. The free operation
- *  is interpreted as a no op. ALLOC_ONLY MemChunk's save 4 bytes per
- *  atom. (They are also useful for lists which use MemChunk to allocate
- *  memory but are also part of the MemChunk implementation).
- * ALLOC_AND_FREE MemChunk's can allocate and free memory.
- */
-
 #define G_ALLOC_ONLY     1
 #define G_ALLOC_AND_FREE  2
-
 GMemChunk* g_mem_chunk_new     (const gchar *name,
                                gint         atom_size,
-                               gulong       area_size,
+                               gsize        area_size,
                                gint         type);
 void       g_mem_chunk_destroy (GMemChunk   *mem_chunk);
 gpointer   g_mem_chunk_alloc   (GMemChunk   *mem_chunk);
@@ -145,29 +138,14 @@ void       g_mem_chunk_clean   (GMemChunk   *mem_chunk);
 void       g_mem_chunk_reset   (GMemChunk   *mem_chunk);
 void       g_mem_chunk_print   (GMemChunk   *mem_chunk);
 void       g_mem_chunk_info    (void);
-
-/* Ah yes...we have a "g_blow_chunks" function.
- * "g_blow_chunks" simply compresses all the chunks. This operation
- *  consists of freeing every memory area that should be freed (but
- *  which we haven't gotten around to doing yet). And, no,
- *  "g_blow_chunks" doesn't follow the naming scheme, but it is a
- *  much better name than "g_mem_chunk_clean_all" or something
- *  similar.
- */
-void      g_blow_chunks (void);
-
-
-/* Generic allocators
- */
-GAllocator* g_allocator_new   (const gchar  *name,
-                              guint         n_preallocs);
-void        g_allocator_free  (GAllocator   *allocator);
-
-/* internal */
-#define        G_ALLOCATOR_LIST        (1)
-#define        G_ALLOCATOR_SLIST       (2)
-#define        G_ALLOCATOR_NODE        (3)
-
+void      g_blow_chunks       (void);
+GAllocator*g_allocator_new     (const gchar  *name,
+                               guint         n_preallocs);
+void       g_allocator_free    (GAllocator   *allocator);
+#define        G_ALLOCATOR_LIST       (1)
+#define        G_ALLOCATOR_SLIST      (2)
+#define        G_ALLOCATOR_NODE       (3)
+#endif /* G_DISABLE_DEPRECATED */
 
 G_END_DECLS