fi
AC_SUBST(EINA_CONFIGURE_MAGIC_DEBUG)
+# Valgrind
+want_valgrind="no"
+
+AC_MSG_CHECKING(whether to enable build with valgrind)
+AC_ARG_ENABLE(valgrind,
+ AC_HELP_STRING([--enable-valgrind], [enable valgrind fixes to stop false reports]),
+ [want_valgrind=$enableval]
+)
+AC_MSG_RESULT($want_valgrind)
+
+if test x$want_valgrind = "xyes"; then
+ PKG_CHECK_MODULES(VALGRIND, valgrind >= 2.4.0,
+ [
+ requirement_eina="valgrind ${requirement_eina}"
+ ],
+ [
+ AC_DEFINE(NVALGRIND, 1, [Valgrind support disabled])
+ if test "x$want_valgrind" = "xyes"; then
+ AC_MSG_ERROR([Valgrind >= 2.4.0 is required)])
+ fi
+ ]
+ )
+else
+ AC_DEFINE(NVALGRIND, 1, [Valgrind support disabled])
+fi
+
# Safety checks (avoid crashes on wrong api usage)
AC_ARG_ENABLE(safety-checks,
[AC_HELP_STRING([--disable-safety-checks], [disable safety checks for NULL pointers and like. @<:@default=enabled@:>@])],
#include "eina_private.h"
+#ifndef NVALGRIND
+# include <valgrind/memcheck.h>
+#endif
+
#ifdef DEBUG
#include "eina_log.h"
{
Chained_Pool *p;
unsigned char *ptr;
+ unsigned int alignof;
eina_error_set(0);
p = malloc(pool->alloc_size);
return NULL;
}
- ptr = (unsigned char *)p + eina_mempool_alignof(sizeof(Chained_Pool));
+ alignof = eina_mempool_alignof(sizeof(Chained_Pool));
+ ptr = (unsigned char *)p + alignof;
p->usage = 0;
p->base = NULL;
p->last = ptr;
p->limit = ptr + pool->item_alloc * pool->pool_size;
+
+#ifndef NVALGRIND
+ VALGRIND_MAKE_MEM_NOACCESS(ptr, pool->alloc_size - alignof);
+#endif
+
return p;
}
}
#endif
+#ifndef NVALGRIND
+ VALGRIND_MEMPOOL_ALLOC(pool, mem, pool->item_alloc);
+#endif
+
return mem;
}
#endif
#endif
+#ifndef NVALGRIND
+ VALGRIND_MEMPOOL_FREE(pool, ptr);
+#endif
+
EINA_INLIST_FOREACH(pool->first, p)
{
// Could the pointer be inside that pool
mp->group_size = mp->item_alloc * mp->pool_size;
mp->alloc_size = mp->group_size + eina_mempool_alignof(sizeof(Chained_Pool));
+#ifndef NVALGRIND
+ VALGRIND_CREATE_MEMPOOL(mp, 0, 1);
+#endif
+
#ifdef EFL_HAVE_THREADS
# ifdef EFL_HAVE_POSIX_THREADS
# ifdef EFL_DEBUG_THREADS
_eina_chained_mp_pool_free(p);
}
+#ifndef NVALGRIND
+ VALGRIND_DESTROY_MEMPOOL(mp);
+#endif
+
#ifdef EFL_HAVE_THREADS
# ifdef EFL_HAVE_POSIX_THREADS
# ifdef EFL_DEBUG_THREADS