mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-02 07:23:41 +02:00
prepared deprecation of GMemChunk and GAllocator. added g_slice_*() API to
Tue Nov 1 16:24:20 2005 Tim Janik <timj@imendio.com> * glib/gmem.[hc]: prepared deprecation of GMemChunk and GAllocator. added g_slice_*() API to allocate and cache small bits of memory. an actuall allocator implementation for g_slice_*() is still pending. * glib/gthread.[hc]: changes from a patch by Matthias Clasen. changed GRealThread list to use in-structure *next; fields instead of GSList, in order for thread iteration to not depenend on g_slice_*() indirectly. _g_thread_mem_private_get(): _g_thread_mem_private_set(): added accessors for private memory, needed because the ordinary GPrivate implementation relies on GArray and GSList and therefore indirectly on working g_slice_*() allocations. * glib/gthread.[hc]: g_thread_foreach(): new public API function to loop over all existing threads. * glib/gdataset.c: * glib/gstring.c: * glib/gcache.c: * glib/garray.c: * glib/gqueue.c: * glib/gslist.c: * glib/glist.c: * glib/ghash.c: * glib/gtree.c: * glib/ghook.c: * glib/gmain.c: * glib/gnode.c: removed GAllocator and free list usages and accompanying locks. use g_slice_*() API to allocate and cache small bits of memory. * glib/ghook.h: removed GMemChunk field from public API. * glib/gslist.h: * glib/glist.h: deprecate allocator API, provide _free1() for consistency. * glib/gnode.h: deprecate allocator API. * glib/gmain.c: reordered GPollRec fields so g_slice_free_chain() can be used for poll rec lists. * glib/grel.c: removed mem chunk usage, and allocated tuples via g_slice_*(). g_relation_destroy(): free all tuples from the all_tuples hash table, this effectively maintains the life time track keeping of tuples. g_relation_delete_tuple(): free tuples which are removed from the all_tuples hash table. this fixes a temporary leak that was present in the memchunk code until the destruction of the relation.
This commit is contained in:
74
glib/gmem.h
74
glib/gmem.h
@@ -31,8 +31,6 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _GAllocator GAllocator;
|
||||
typedef struct _GMemChunk GMemChunk;
|
||||
typedef struct _GMemVTable GMemVTable;
|
||||
|
||||
|
||||
@@ -98,9 +96,24 @@ gboolean g_mem_is_system_malloc (void);
|
||||
GLIB_VAR GMemVTable *glib_mem_profiler_table;
|
||||
void g_mem_profile (void);
|
||||
|
||||
|
||||
/* Memchunk convenience functions
|
||||
/* slices - fast allocation/release of small memory blocks
|
||||
*/
|
||||
gpointer g_slice_alloc (guint block_size);
|
||||
gpointer g_slice_alloc0 (guint block_size);
|
||||
void g_slice_free1 (guint block_size,
|
||||
gpointer mem_block);
|
||||
void g_slice_free_chain (guint block_size,
|
||||
gpointer mem_chain,
|
||||
guint next_offset);
|
||||
#define g_slice_new(type) ((type*) g_slice_alloc (sizeof (type)))
|
||||
#define g_slice_new0(type) ((type*) g_slice_alloc0 (sizeof (type)))
|
||||
#define g_slice_free(type,mem) g_slice_free1 (sizeof (type), mem)
|
||||
|
||||
|
||||
/* deprecated memchunks and allocators */
|
||||
#if !defined G_DISABLE_DEPRECATED || 1
|
||||
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), \
|
||||
@@ -116,30 +129,8 @@ 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 MemChunks can only allocate memory. The free operation
|
||||
* is interpreted as a no op. ALLOC_ONLY MemChunks 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 MemChunks 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,
|
||||
@@ -153,29 +144,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
|
||||
|
||||
|
Reference in New Issue
Block a user