mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-25 15:06:14 +01:00
honour g_mem_gc_friendly settings when freeing slices, make sure
Wed Jan 25 16:39:18 2006 Tim Janik <timj@imendio.com> * glib/gslice.c: honour g_mem_gc_friendly settings when freeing slices, make sure g_mem_gc_friendly is properly initialized. * gmem.[hc]: ensure g_mem_gc_friendly is initialized from G_DEBUG upon the first allocation. applied some branching optimizations. * docs/macros.txt: reflected --enable-gc-friendly change and described ENABLE_GC_FRIENDLY_DEFAULT as well as G_DEBUG=gc-friendly. * configure.in: changed --enable-gc-friendly=yes to define ENABLE_GC_FRIENDLY_DEFAULT. * glib/garray.c: changed ENABLE_GC_FRIENDLY macro #ifdef-s to if (G_UNLIKELY (g_mem_gc_friendly)). * glib/gtree.c: * glib/ghash.c: removed ENABLE_GC_FRIENDLY code which is now taken care of by g_slice_free1(). * tests/slice-test.c: fixed leaks, reported by Kjartan Maraas.
This commit is contained in:
parent
7b744cf4d2
commit
eda944bca5
23
ChangeLog
23
ChangeLog
@ -1,3 +1,26 @@
|
|||||||
|
Wed Jan 25 16:39:18 2006 Tim Janik <timj@imendio.com>
|
||||||
|
|
||||||
|
* glib/gslice.c: honour g_mem_gc_friendly settings when freeing
|
||||||
|
slices, make sure g_mem_gc_friendly is properly initialized.
|
||||||
|
|
||||||
|
* gmem.[hc]: ensure g_mem_gc_friendly is initialized from G_DEBUG upon
|
||||||
|
the first allocation. applied some branching optimizations.
|
||||||
|
|
||||||
|
* docs/macros.txt: reflected --enable-gc-friendly change and
|
||||||
|
described ENABLE_GC_FRIENDLY_DEFAULT as well as G_DEBUG=gc-friendly.
|
||||||
|
|
||||||
|
* configure.in: changed --enable-gc-friendly=yes to define
|
||||||
|
ENABLE_GC_FRIENDLY_DEFAULT.
|
||||||
|
|
||||||
|
* glib/garray.c: changed ENABLE_GC_FRIENDLY macro #ifdef-s to
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly)).
|
||||||
|
|
||||||
|
* glib/gtree.c:
|
||||||
|
* glib/ghash.c: removed ENABLE_GC_FRIENDLY code which is now taken
|
||||||
|
care of by g_slice_free1().
|
||||||
|
|
||||||
|
* tests/slice-test.c: fixed leaks, reported by Kjartan Maraas.
|
||||||
|
|
||||||
Tue Jan 24 17:49:36 2006 Tim Janik <timj@imendio.com>
|
Tue Jan 24 17:49:36 2006 Tim Janik <timj@imendio.com>
|
||||||
|
|
||||||
* glib/gslice.c: only use posix_memalign() if it's known to work,
|
* glib/gslice.c: only use posix_memalign() if it's known to work,
|
||||||
|
@ -1,3 +1,26 @@
|
|||||||
|
Wed Jan 25 16:39:18 2006 Tim Janik <timj@imendio.com>
|
||||||
|
|
||||||
|
* glib/gslice.c: honour g_mem_gc_friendly settings when freeing
|
||||||
|
slices, make sure g_mem_gc_friendly is properly initialized.
|
||||||
|
|
||||||
|
* gmem.[hc]: ensure g_mem_gc_friendly is initialized from G_DEBUG upon
|
||||||
|
the first allocation. applied some branching optimizations.
|
||||||
|
|
||||||
|
* docs/macros.txt: reflected --enable-gc-friendly change and
|
||||||
|
described ENABLE_GC_FRIENDLY_DEFAULT as well as G_DEBUG=gc-friendly.
|
||||||
|
|
||||||
|
* configure.in: changed --enable-gc-friendly=yes to define
|
||||||
|
ENABLE_GC_FRIENDLY_DEFAULT.
|
||||||
|
|
||||||
|
* glib/garray.c: changed ENABLE_GC_FRIENDLY macro #ifdef-s to
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly)).
|
||||||
|
|
||||||
|
* glib/gtree.c:
|
||||||
|
* glib/ghash.c: removed ENABLE_GC_FRIENDLY code which is now taken
|
||||||
|
care of by g_slice_free1().
|
||||||
|
|
||||||
|
* tests/slice-test.c: fixed leaks, reported by Kjartan Maraas.
|
||||||
|
|
||||||
Tue Jan 24 17:49:36 2006 Tim Janik <timj@imendio.com>
|
Tue Jan 24 17:49:36 2006 Tim Janik <timj@imendio.com>
|
||||||
|
|
||||||
* glib/gslice.c: only use posix_memalign() if it's known to work,
|
* glib/gslice.c: only use posix_memalign() if it's known to work,
|
||||||
|
@ -1,3 +1,26 @@
|
|||||||
|
Wed Jan 25 16:39:18 2006 Tim Janik <timj@imendio.com>
|
||||||
|
|
||||||
|
* glib/gslice.c: honour g_mem_gc_friendly settings when freeing
|
||||||
|
slices, make sure g_mem_gc_friendly is properly initialized.
|
||||||
|
|
||||||
|
* gmem.[hc]: ensure g_mem_gc_friendly is initialized from G_DEBUG upon
|
||||||
|
the first allocation. applied some branching optimizations.
|
||||||
|
|
||||||
|
* docs/macros.txt: reflected --enable-gc-friendly change and
|
||||||
|
described ENABLE_GC_FRIENDLY_DEFAULT as well as G_DEBUG=gc-friendly.
|
||||||
|
|
||||||
|
* configure.in: changed --enable-gc-friendly=yes to define
|
||||||
|
ENABLE_GC_FRIENDLY_DEFAULT.
|
||||||
|
|
||||||
|
* glib/garray.c: changed ENABLE_GC_FRIENDLY macro #ifdef-s to
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly)).
|
||||||
|
|
||||||
|
* glib/gtree.c:
|
||||||
|
* glib/ghash.c: removed ENABLE_GC_FRIENDLY code which is now taken
|
||||||
|
care of by g_slice_free1().
|
||||||
|
|
||||||
|
* tests/slice-test.c: fixed leaks, reported by Kjartan Maraas.
|
||||||
|
|
||||||
Tue Jan 24 17:49:36 2006 Tim Janik <timj@imendio.com>
|
Tue Jan 24 17:49:36 2006 Tim Janik <timj@imendio.com>
|
||||||
|
|
||||||
* glib/gslice.c: only use posix_memalign() if it's known to work,
|
* glib/gslice.c: only use posix_memalign() if it's known to work,
|
||||||
|
@ -217,8 +217,7 @@ AC_DEFINE_UNQUOTED(G_COMPILED_WITH_DEBUGGING, ["${enable_debug}"],
|
|||||||
|
|
||||||
AC_MSG_CHECKING([whether to enable garbage collector friendliness])
|
AC_MSG_CHECKING([whether to enable garbage collector friendliness])
|
||||||
if test "x$enable_gc_friendly" = "xyes"; then
|
if test "x$enable_gc_friendly" = "xyes"; then
|
||||||
AC_DEFINE(ENABLE_GC_FRIENDLY, 1, [Whether to enable GC friendliness])
|
AC_DEFINE(ENABLE_GC_FRIENDLY_DEFAULT, 1, [Whether to enable GC friendliness by default])
|
||||||
AC_SUBST(ENABLE_GC_FRIENDLY)
|
|
||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
|
@ -10,7 +10,7 @@ GLib's configure options and corresponding macros
|
|||||||
--enable-debug=yes [default for development branches]
|
--enable-debug=yes [default for development branches]
|
||||||
-DG_ENABLE_DEBUG -g
|
-DG_ENABLE_DEBUG -g
|
||||||
--enable-gc-friendly=yes
|
--enable-gc-friendly=yes
|
||||||
#define ENABLE_GC_FRIENDLY 1
|
#define ENABLE_GC_FRIENDLY_DEFAULT 1
|
||||||
--disable-mem-pools=yes
|
--disable-mem-pools=yes
|
||||||
#define DISABLE_MEM_POOLS 1
|
#define DISABLE_MEM_POOLS 1
|
||||||
|
|
||||||
@ -23,11 +23,13 @@ Notes on GLib's internal and global macros
|
|||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
|
|
||||||
ENABLE_GC_FRIENDLY
|
ENABLE_GC_FRIENDLY_DEFAULT
|
||||||
Newly allocated memory that isn't directly initialized, as well
|
Newly allocated memory that isn't directly initialized, as well
|
||||||
as memory being freed should be reset to 0. The point here is to
|
as memory being freed should be reset to 0. The point here is to
|
||||||
allow memory checkers and similar programs that use bohem GC alike
|
allow memory checkers and similar programs that use bohem GC alike
|
||||||
algorithms to produce more accurate results.
|
algorithms to produce more accurate results.
|
||||||
|
This can also be accomplished by setting the environment variable
|
||||||
|
G_DEBUG=gc-friendly.
|
||||||
DISABLE_MEM_POOLS
|
DISABLE_MEM_POOLS
|
||||||
Many small chunks of memory are often allocated via collective pools
|
Many small chunks of memory are often allocated via collective pools
|
||||||
in GLib and are cached after release to speed up reallocations.
|
in GLib and are cached after release to speed up reallocations.
|
||||||
|
@ -197,10 +197,8 @@ g_array_set_size (GArray *farray,
|
|||||||
if (array->clear)
|
if (array->clear)
|
||||||
g_array_elt_zero (array, array->len, length - array->len);
|
g_array_elt_zero (array, array->len, length - array->len);
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
else if (G_UNLIKELY (g_mem_gc_friendly) && length < array->len)
|
||||||
else if (length < array->len)
|
|
||||||
g_array_elt_zero (array, length, array->len - length);
|
g_array_elt_zero (array, length, array->len - length);
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
array->len = length;
|
array->len = length;
|
||||||
|
|
||||||
@ -226,11 +224,10 @@ g_array_remove_index (GArray* farray,
|
|||||||
|
|
||||||
array->len -= 1;
|
array->len -= 1;
|
||||||
|
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
g_array_elt_zero (array, array->len, 1);
|
g_array_elt_zero (array, array->len, 1);
|
||||||
#else /* !ENABLE_GC_FRIENDLY */
|
else
|
||||||
g_array_zero_terminate (array);
|
g_array_zero_terminate (array);
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
return farray;
|
return farray;
|
||||||
}
|
}
|
||||||
@ -252,11 +249,10 @@ g_array_remove_index_fast (GArray* farray,
|
|||||||
|
|
||||||
array->len -= 1;
|
array->len -= 1;
|
||||||
|
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
g_array_elt_zero (array, array->len, 1);
|
g_array_elt_zero (array, array->len, 1);
|
||||||
#else /* !ENABLE_GC_FRIENDLY */
|
else
|
||||||
g_array_zero_terminate (array);
|
g_array_zero_terminate (array);
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
return farray;
|
return farray;
|
||||||
}
|
}
|
||||||
@ -278,11 +274,10 @@ g_array_remove_range (GArray *farray,
|
|||||||
(array->len - (index_ + length)) * array->elt_size);
|
(array->len - (index_ + length)) * array->elt_size);
|
||||||
|
|
||||||
array->len -= length;
|
array->len -= length;
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
g_array_elt_zero (array, array->len, length);
|
g_array_elt_zero (array, array->len, length);
|
||||||
#else /* !ENABLE_GC_FRIENDLY */
|
else
|
||||||
g_array_zero_terminate (array);
|
g_array_zero_terminate (array);
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
return farray;
|
return farray;
|
||||||
}
|
}
|
||||||
@ -343,9 +338,8 @@ g_array_maybe_expand (GRealArray *array,
|
|||||||
|
|
||||||
array->data = g_realloc (array->data, want_alloc);
|
array->data = g_realloc (array->data, want_alloc);
|
||||||
|
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
memset (array->data + array->alloc, 0, want_alloc - array->alloc);
|
memset (array->data + array->alloc, 0, want_alloc - array->alloc);
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
array->alloc = want_alloc;
|
array->alloc = want_alloc;
|
||||||
}
|
}
|
||||||
@ -414,16 +408,13 @@ g_ptr_array_maybe_expand (GRealPtrArray *array,
|
|||||||
{
|
{
|
||||||
if ((array->len + len) > array->alloc)
|
if ((array->len + len) > array->alloc)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
|
||||||
guint old_alloc = array->alloc;
|
guint old_alloc = array->alloc;
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
array->alloc = g_nearest_pow (array->len + len);
|
array->alloc = g_nearest_pow (array->len + len);
|
||||||
array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
|
array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
|
||||||
array->pdata = g_realloc (array->pdata, sizeof (gpointer) * array->alloc);
|
array->pdata = g_realloc (array->pdata, sizeof (gpointer) * array->alloc);
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
for ( ; old_alloc < array->alloc; old_alloc++)
|
for ( ; old_alloc < array->alloc; old_alloc++)
|
||||||
array->pdata [old_alloc] = NULL;
|
array->pdata [old_alloc] = NULL;
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,14 +439,12 @@ g_ptr_array_set_size (GPtrArray *farray,
|
|||||||
for (i = array->len; i < length; i++)
|
for (i = array->len; i < length; i++)
|
||||||
array->pdata[i] = NULL;
|
array->pdata[i] = NULL;
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
if (G_UNLIKELY (g_mem_gc_friendly) && length < array->len)
|
||||||
else if (length < array->len)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = length; i < array->len; i++)
|
for (i = length; i < array->len; i++)
|
||||||
array->pdata[i] = NULL;
|
array->pdata[i] = NULL;
|
||||||
}
|
}
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
array->len = length;
|
array->len = length;
|
||||||
}
|
}
|
||||||
@ -479,9 +468,8 @@ g_ptr_array_remove_index (GPtrArray* farray,
|
|||||||
|
|
||||||
array->len -= 1;
|
array->len -= 1;
|
||||||
|
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
array->pdata[array->len] = NULL;
|
array->pdata[array->len] = NULL;
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -504,9 +492,8 @@ g_ptr_array_remove_index_fast (GPtrArray* farray,
|
|||||||
|
|
||||||
array->len -= 1;
|
array->len -= 1;
|
||||||
|
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
array->pdata[array->len] = NULL;
|
array->pdata[array->len] = NULL;
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -528,13 +515,12 @@ g_ptr_array_remove_range (GPtrArray* farray,
|
|||||||
(array->len - (index_ + length)) * sizeof (gpointer));
|
(array->len - (index_ + length)) * sizeof (gpointer));
|
||||||
|
|
||||||
array->len -= length;
|
array->len -= length;
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
{
|
{
|
||||||
guint i;
|
guint i;
|
||||||
for (i = 0; i < length; i++)
|
for (i = 0; i < length; i++)
|
||||||
array->pdata[array->len + i] = NULL;
|
array->pdata[array->len + i] = NULL;
|
||||||
}
|
}
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@ -718,12 +718,6 @@ g_hash_node_destroy (GHashNode *hash_node,
|
|||||||
key_destroy_func (hash_node->key);
|
key_destroy_func (hash_node->key);
|
||||||
if (value_destroy_func)
|
if (value_destroy_func)
|
||||||
value_destroy_func (hash_node->value);
|
value_destroy_func (hash_node->value);
|
||||||
|
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
|
||||||
hash_node->key = NULL;
|
|
||||||
hash_node->value = NULL;
|
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
g_slice_free (GHashNode, hash_node);
|
g_slice_free (GHashNode, hash_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
68
glib/gmem.c
68
glib/gmem.c
@ -38,17 +38,24 @@
|
|||||||
#include "gthreadinit.h"
|
#include "gthreadinit.h"
|
||||||
#include "galias.h"
|
#include "galias.h"
|
||||||
|
|
||||||
|
#define MEM_PROFILE_TABLE_SIZE 4096
|
||||||
|
|
||||||
|
|
||||||
/* notes on macros:
|
/* notes on macros:
|
||||||
* having G_DISABLE_CHECKS defined disables use of glib_mem_profiler_table and
|
* having G_DISABLE_CHECKS defined disables use of glib_mem_profiler_table and
|
||||||
* g_mem_profile().
|
* g_mem_profile().
|
||||||
* REALLOC_0_WORKS is defined if g_realloc (NULL, x) works.
|
* REALLOC_0_WORKS is defined if g_realloc (NULL, x) works.
|
||||||
* SANE_MALLOC_PROTOS is defined if the systems malloc() and friends functions
|
* SANE_MALLOC_PROTOS is defined if the systems malloc() and friends functions
|
||||||
* match the corresponding GLib prototypes, keep configure.in and gmem.h in sync here.
|
* match the corresponding GLib prototypes, keep configure.in and gmem.h in sync here.
|
||||||
* if ENABLE_GC_FRIENDLY is defined, freed memory should be 0-wiped.
|
* g_mem_gc_friendly is TRUE, freed memory should be 0-wiped.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MEM_PROFILE_TABLE_SIZE 4096
|
/* --- prototypes --- */
|
||||||
|
static gboolean g_mem_initialized = FALSE;
|
||||||
|
static void g_mem_init_nomessage (void);
|
||||||
|
|
||||||
|
|
||||||
|
/* --- malloc wrappers --- */
|
||||||
#ifndef REALLOC_0_WORKS
|
#ifndef REALLOC_0_WORKS
|
||||||
static gpointer
|
static gpointer
|
||||||
standard_realloc (gpointer mem,
|
standard_realloc (gpointer mem,
|
||||||
@ -115,7 +122,9 @@ static GMemVTable glib_mem_vtable = {
|
|||||||
gpointer
|
gpointer
|
||||||
g_malloc (gulong n_bytes)
|
g_malloc (gulong n_bytes)
|
||||||
{
|
{
|
||||||
if (n_bytes)
|
if (G_UNLIKELY (!g_mem_initialized))
|
||||||
|
g_mem_init_nomessage();
|
||||||
|
if (G_LIKELY (n_bytes))
|
||||||
{
|
{
|
||||||
gpointer mem;
|
gpointer mem;
|
||||||
|
|
||||||
@ -132,7 +141,9 @@ g_malloc (gulong n_bytes)
|
|||||||
gpointer
|
gpointer
|
||||||
g_malloc0 (gulong n_bytes)
|
g_malloc0 (gulong n_bytes)
|
||||||
{
|
{
|
||||||
if (n_bytes)
|
if (G_UNLIKELY (!g_mem_initialized))
|
||||||
|
g_mem_init_nomessage();
|
||||||
|
if (G_LIKELY (n_bytes))
|
||||||
{
|
{
|
||||||
gpointer mem;
|
gpointer mem;
|
||||||
|
|
||||||
@ -150,7 +161,9 @@ gpointer
|
|||||||
g_realloc (gpointer mem,
|
g_realloc (gpointer mem,
|
||||||
gulong n_bytes)
|
gulong n_bytes)
|
||||||
{
|
{
|
||||||
if (n_bytes)
|
if (G_UNLIKELY (!g_mem_initialized))
|
||||||
|
g_mem_init_nomessage();
|
||||||
|
if (G_LIKELY (n_bytes))
|
||||||
{
|
{
|
||||||
mem = glib_mem_vtable.realloc (mem, n_bytes);
|
mem = glib_mem_vtable.realloc (mem, n_bytes);
|
||||||
if (mem)
|
if (mem)
|
||||||
@ -168,14 +181,18 @@ g_realloc (gpointer mem,
|
|||||||
void
|
void
|
||||||
g_free (gpointer mem)
|
g_free (gpointer mem)
|
||||||
{
|
{
|
||||||
if (mem)
|
if (G_UNLIKELY (!g_mem_initialized))
|
||||||
|
g_mem_init_nomessage();
|
||||||
|
if (G_LIKELY (mem))
|
||||||
glib_mem_vtable.free (mem);
|
glib_mem_vtable.free (mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
gpointer
|
gpointer
|
||||||
g_try_malloc (gulong n_bytes)
|
g_try_malloc (gulong n_bytes)
|
||||||
{
|
{
|
||||||
if (n_bytes)
|
if (G_UNLIKELY (!g_mem_initialized))
|
||||||
|
g_mem_init_nomessage();
|
||||||
|
if (G_LIKELY (n_bytes))
|
||||||
return glib_mem_vtable.try_malloc (n_bytes);
|
return glib_mem_vtable.try_malloc (n_bytes);
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -198,7 +215,9 @@ gpointer
|
|||||||
g_try_realloc (gpointer mem,
|
g_try_realloc (gpointer mem,
|
||||||
gulong n_bytes)
|
gulong n_bytes)
|
||||||
{
|
{
|
||||||
if (n_bytes)
|
if (G_UNLIKELY (!g_mem_initialized))
|
||||||
|
g_mem_init_nomessage();
|
||||||
|
if (G_LIKELY (n_bytes))
|
||||||
return glib_mem_vtable.try_realloc (mem, n_bytes);
|
return glib_mem_vtable.try_realloc (mem, n_bytes);
|
||||||
|
|
||||||
if (mem)
|
if (mem)
|
||||||
@ -373,6 +392,9 @@ g_mem_profile (void)
|
|||||||
gulong local_zinit;
|
gulong local_zinit;
|
||||||
gulong local_frees;
|
gulong local_frees;
|
||||||
|
|
||||||
|
if (G_UNLIKELY (!g_mem_initialized))
|
||||||
|
g_mem_init_nomessage();
|
||||||
|
|
||||||
g_mutex_lock (gmem_profile_mutex);
|
g_mutex_lock (gmem_profile_mutex);
|
||||||
|
|
||||||
local_allocs = profile_allocs;
|
local_allocs = profile_allocs;
|
||||||
@ -655,12 +677,38 @@ g_allocator_free (GAllocator *allocator)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_GC_FRIENDLY_DEFAULT
|
||||||
|
gboolean g_mem_gc_friendly = TRUE;
|
||||||
|
#else
|
||||||
|
gboolean g_mem_gc_friendly = FALSE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
g_mem_init_nomessage (void)
|
||||||
|
{
|
||||||
|
if (g_mem_initialized)
|
||||||
|
return;
|
||||||
|
/* don't use g_malloc/g_message here */
|
||||||
|
gchar buffer[1024];
|
||||||
|
const gchar *val = _g_getenv_nomalloc ("G_DEBUG", buffer);
|
||||||
|
static const GDebugKey keys[] = {
|
||||||
|
{ "gc-friendly", 1 },
|
||||||
|
};
|
||||||
|
gint flags = !val ? 0 : g_parse_debug_string (val, keys, G_N_ELEMENTS (keys));
|
||||||
|
if (flags & 1) /* gc-friendly */
|
||||||
|
{
|
||||||
|
g_mem_gc_friendly = TRUE;
|
||||||
|
}
|
||||||
|
g_mem_initialized = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_g_mem_thread_init_noprivate_nomessage (void)
|
_g_mem_thread_init_noprivate_nomessage (void)
|
||||||
{
|
{
|
||||||
/* we may only create mutexes here, locking/unlocking itself
|
/* we may only create mutexes here, locking/
|
||||||
* does not yet work.
|
* unlocking a mutex does not yet work.
|
||||||
*/
|
*/
|
||||||
|
g_mem_init_nomessage();
|
||||||
#ifndef G_DISABLE_CHECKS
|
#ifndef G_DISABLE_CHECKS
|
||||||
gmem_profile_mutex = g_mutex_new ();
|
gmem_profile_mutex = g_mutex_new ();
|
||||||
#endif
|
#endif
|
||||||
|
@ -92,6 +92,8 @@ struct _GMemVTable
|
|||||||
void g_mem_set_vtable (GMemVTable *vtable);
|
void g_mem_set_vtable (GMemVTable *vtable);
|
||||||
gboolean g_mem_is_system_malloc (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()
|
/* Memory profiler and checker, has to be enabled via g_mem_set_vtable()
|
||||||
*/
|
*/
|
||||||
GLIB_VAR GMemVTable *glib_mem_profiler_table;
|
GLIB_VAR GMemVTable *glib_mem_profiler_table;
|
||||||
|
@ -327,6 +327,9 @@ g_slice_init_nomessage (void)
|
|||||||
allocator->max_slab_chunk_size_for_magazine_cache = MAX_SLAB_CHUNK_SIZE (allocator);
|
allocator->max_slab_chunk_size_for_magazine_cache = MAX_SLAB_CHUNK_SIZE (allocator);
|
||||||
if (allocator->config.always_malloc || allocator->config.bypass_magazines)
|
if (allocator->config.always_malloc || allocator->config.bypass_magazines)
|
||||||
allocator->max_slab_chunk_size_for_magazine_cache = 0; /* non-optimized cases */
|
allocator->max_slab_chunk_size_for_magazine_cache = 0; /* non-optimized cases */
|
||||||
|
/* at this point, g_mem_gc_friendly() should be initialized, this
|
||||||
|
* should have been accomplished by the above g_malloc/g_new calls
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline guint
|
static inline guint
|
||||||
@ -791,8 +794,8 @@ g_slice_free1 (gsize mem_size,
|
|||||||
gsize chunk_size = P2ALIGN (mem_size);
|
gsize chunk_size = P2ALIGN (mem_size);
|
||||||
guint acat = allocator_categorize (chunk_size);
|
guint acat = allocator_categorize (chunk_size);
|
||||||
if (G_UNLIKELY (!mem_block))
|
if (G_UNLIKELY (!mem_block))
|
||||||
/* pass */;
|
return;
|
||||||
else if (G_LIKELY (acat == 1)) /* allocate through magazine layer */
|
if (G_LIKELY (acat == 1)) /* allocate through magazine layer */
|
||||||
{
|
{
|
||||||
ThreadMemory *tmem = thread_memory_from_self();
|
ThreadMemory *tmem = thread_memory_from_self();
|
||||||
guint ix = SLAB_INDEX (allocator, chunk_size);
|
guint ix = SLAB_INDEX (allocator, chunk_size);
|
||||||
@ -802,16 +805,24 @@ g_slice_free1 (gsize mem_size,
|
|||||||
if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix)))
|
if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix)))
|
||||||
thread_memory_magazine2_unload (tmem, ix);
|
thread_memory_magazine2_unload (tmem, ix);
|
||||||
}
|
}
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
|
memset (mem_block, 0, chunk_size);
|
||||||
thread_memory_magazine2_free (tmem, ix, mem_block);
|
thread_memory_magazine2_free (tmem, ix, mem_block);
|
||||||
}
|
}
|
||||||
else if (acat == 2) /* allocate through slab allocator */
|
else if (acat == 2) /* allocate through slab allocator */
|
||||||
{
|
{
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
|
memset (mem_block, 0, chunk_size);
|
||||||
g_mutex_lock (allocator->slab_mutex);
|
g_mutex_lock (allocator->slab_mutex);
|
||||||
slab_allocator_free_chunk (chunk_size, mem_block);
|
slab_allocator_free_chunk (chunk_size, mem_block);
|
||||||
g_mutex_unlock (allocator->slab_mutex);
|
g_mutex_unlock (allocator->slab_mutex);
|
||||||
}
|
}
|
||||||
else /* delegate to system malloc */
|
else /* delegate to system malloc */
|
||||||
g_free (mem_block);
|
{
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
|
memset (mem_block, 0, mem_size);
|
||||||
|
g_free (mem_block);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -851,6 +862,8 @@ g_slice_free_chain_with_offset (gsize mem_size,
|
|||||||
if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix)))
|
if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix)))
|
||||||
thread_memory_magazine2_unload (tmem, ix);
|
thread_memory_magazine2_unload (tmem, ix);
|
||||||
}
|
}
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
|
memset (current, 0, chunk_size);
|
||||||
thread_memory_magazine2_free (tmem, ix, current);
|
thread_memory_magazine2_free (tmem, ix, current);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -861,6 +874,8 @@ g_slice_free_chain_with_offset (gsize mem_size,
|
|||||||
{
|
{
|
||||||
guint8 *current = slice;
|
guint8 *current = slice;
|
||||||
slice = *(gpointer*) (current + next_offset);
|
slice = *(gpointer*) (current + next_offset);
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
|
memset (current, 0, chunk_size);
|
||||||
slab_allocator_free_chunk (chunk_size, current);
|
slab_allocator_free_chunk (chunk_size, current);
|
||||||
}
|
}
|
||||||
g_mutex_unlock (allocator->slab_mutex);
|
g_mutex_unlock (allocator->slab_mutex);
|
||||||
@ -870,6 +885,8 @@ g_slice_free_chain_with_offset (gsize mem_size,
|
|||||||
{
|
{
|
||||||
guint8 *current = slice;
|
guint8 *current = slice;
|
||||||
slice = *(gpointer*) (current + next_offset);
|
slice = *(gpointer*) (current + next_offset);
|
||||||
|
if (G_UNLIKELY (g_mem_gc_friendly))
|
||||||
|
memset (current, 0, mem_size);
|
||||||
g_free (current);
|
g_free (current);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
15
glib/gtree.c
15
glib/gtree.c
@ -259,14 +259,6 @@ g_tree_destroy (GTree *tree)
|
|||||||
tree->key_destroy_func (node->key);
|
tree->key_destroy_func (node->key);
|
||||||
if (tree->value_destroy_func)
|
if (tree->value_destroy_func)
|
||||||
tree->value_destroy_func (node->value);
|
tree->value_destroy_func (node->value);
|
||||||
|
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
|
||||||
node->left = NULL;
|
|
||||||
node->right = NULL;
|
|
||||||
node->key = NULL;
|
|
||||||
node->value = NULL;
|
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
g_slice_free (GTreeNode, node);
|
g_slice_free (GTreeNode, node);
|
||||||
|
|
||||||
node = next;
|
node = next;
|
||||||
@ -724,13 +716,6 @@ g_tree_remove_internal (GTree *tree,
|
|||||||
tree->value_destroy_func (node->value);
|
tree->value_destroy_func (node->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_GC_FRIENDLY
|
|
||||||
node->left = NULL;
|
|
||||||
node->right = NULL;
|
|
||||||
node->key = NULL;
|
|
||||||
node->value = NULL;
|
|
||||||
#endif /* ENABLE_GC_FRIENDLY */
|
|
||||||
|
|
||||||
g_slice_free (GTreeNode, node);
|
g_slice_free (GTreeNode, node);
|
||||||
|
|
||||||
tree->nnodes--;
|
tree->nnodes--;
|
||||||
|
@ -126,6 +126,8 @@ test_memchunk_thread (gpointer data)
|
|||||||
for (i = 0; i < prime_size; i++)
|
for (i = 0; i < prime_size; i++)
|
||||||
if (memchunks[i])
|
if (memchunks[i])
|
||||||
old_mem_chunk_destroy (memchunks[i]);
|
old_mem_chunk_destroy (memchunks[i]);
|
||||||
|
g_free (ps);
|
||||||
|
g_free (ss);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -178,6 +180,8 @@ test_sliced_mem_thread (gpointer data)
|
|||||||
for (j = 0; j < k; j++)
|
for (j = 0; j < k; j++)
|
||||||
g_slice_free1 (sz, ps[j]);
|
g_slice_free1 (sz, ps[j]);
|
||||||
}
|
}
|
||||||
|
g_free (ps);
|
||||||
|
g_free (ss);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user