mirror of
https://github.com/gryf/wmaker.git
synced 2026-01-09 07:14:18 +01:00
Repair TEST_WITH_GC
The comment in WINGs/memory.c:wfree() pretty much explains the current situation. There's an incredible amount of mixing the wmalloc/wfree wrappers with native mallocs/frees on the other side, and a good several cases of misusing external libraries' APIs. Until this is thoroughly cleaned, WM with --enable-boehm-gc will hardly even start. Signed-off-by: Tamas TEVESZ <ice@extreme.hu>
This commit is contained in:
committed by
Carlos R. Mafra
parent
2bc0c1124a
commit
4a9d561ce4
@@ -29,9 +29,12 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
#ifdef TEST_WITH_GC
|
#ifdef USE_BOEHM_GC
|
||||||
|
#ifndef GC_DEBUG
|
||||||
|
#define GC_DEBUG
|
||||||
|
#endif /* !GC_DEBUG */
|
||||||
#include <gc/gc.h>
|
#include <gc/gc.h>
|
||||||
#endif
|
#endif /* USE_BOEHM_GC */
|
||||||
|
|
||||||
#ifndef False
|
#ifndef False
|
||||||
# define False 0
|
# define False 0
|
||||||
@@ -71,16 +74,16 @@ void *wmalloc(size_t size)
|
|||||||
|
|
||||||
assert(size > 0);
|
assert(size > 0);
|
||||||
|
|
||||||
#ifdef TEST_WITH_GC
|
#ifdef USE_BOEHM_GC
|
||||||
tmp = GC_malloc(size);
|
tmp = GC_MALLOC(size);
|
||||||
#else
|
#else
|
||||||
tmp = malloc(size);
|
tmp = malloc(size);
|
||||||
#endif
|
#endif
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
wwarning("malloc() failed. Retrying after 2s.");
|
wwarning("malloc() failed. Retrying after 2s.");
|
||||||
sleep(2);
|
sleep(2);
|
||||||
#ifdef TEST_WITH_GC
|
#ifdef USE_BOEHM_GC
|
||||||
tmp = GC_malloc(size);
|
tmp = GC_MALLOC(size);
|
||||||
#else
|
#else
|
||||||
tmp = malloc(size);
|
tmp = malloc(size);
|
||||||
#endif
|
#endif
|
||||||
@@ -108,16 +111,16 @@ void *wrealloc(void *ptr, size_t newsize)
|
|||||||
wfree(ptr);
|
wfree(ptr);
|
||||||
nptr = NULL;
|
nptr = NULL;
|
||||||
} else {
|
} else {
|
||||||
#ifdef TEST_WITH_GC
|
#ifdef USE_BOEHM_GC
|
||||||
nptr = GC_realloc(ptr, newsize);
|
nptr = GC_REALLOC(ptr, newsize);
|
||||||
#else
|
#else
|
||||||
nptr = realloc(ptr, newsize);
|
nptr = realloc(ptr, newsize);
|
||||||
#endif
|
#endif
|
||||||
if (nptr == NULL) {
|
if (nptr == NULL) {
|
||||||
wwarning("realloc() failed. Retrying after 2s.");
|
wwarning("realloc() failed. Retrying after 2s.");
|
||||||
sleep(2);
|
sleep(2);
|
||||||
#ifdef TEST_WITH_GC
|
#ifdef USE_BOEHM_GC
|
||||||
nptr = GC_realloc(ptr, newsize);
|
nptr = GC_REALLOC(ptr, newsize);
|
||||||
#else
|
#else
|
||||||
nptr = realloc(ptr, newsize);
|
nptr = realloc(ptr, newsize);
|
||||||
#endif
|
#endif
|
||||||
@@ -164,11 +167,23 @@ void *wretain(void *ptr)
|
|||||||
|
|
||||||
void wfree(void *ptr)
|
void wfree(void *ptr)
|
||||||
{
|
{
|
||||||
#ifdef TEST_WITH_GC
|
if (ptr)
|
||||||
GC_free(ptr);
|
#ifdef USE_BOEHM_GC
|
||||||
|
/* This should eventually be removed, once the criss-cross
|
||||||
|
* of wmalloc()d memory being free()d, malloc()d memory being
|
||||||
|
* wfree()d, various misuses of calling wfree() on objects
|
||||||
|
* allocated by libc malloc() and calling libc free() on
|
||||||
|
* objects allocated by Boehm GC (think external libraries)
|
||||||
|
* is cleaned up.
|
||||||
|
*/
|
||||||
|
if (GC_base(ptr) != 0)
|
||||||
|
GC_FREE(ptr);
|
||||||
|
else
|
||||||
|
free(ptr);
|
||||||
#else
|
#else
|
||||||
free(ptr);
|
free(ptr);
|
||||||
#endif
|
#endif
|
||||||
|
ptr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wrelease(void *ptr)
|
void wrelease(void *ptr)
|
||||||
|
|||||||
16
configure.ac
16
configure.ac
@@ -141,6 +141,22 @@ AC_ARG_WITH(libs-from, AS_HELP_STRING([--with-libs-from], [pass compiler flags t
|
|||||||
AC_ARG_WITH(incs-from, AS_HELP_STRING([--with-incs-from], [pass compiler flags to look for header files]),
|
AC_ARG_WITH(incs-from, AS_HELP_STRING([--with-incs-from], [pass compiler flags to look for header files]),
|
||||||
[inc_search_path="$withval $inc_search_path"])
|
[inc_search_path="$withval $inc_search_path"])
|
||||||
|
|
||||||
|
|
||||||
|
dnl Boehm GC
|
||||||
|
dnl ========
|
||||||
|
with_boehm_gc=no
|
||||||
|
AC_ARG_ENABLE([boehm-gc],
|
||||||
|
[AS_HELP_STRING([--enable-boehm-gc], [use Boehm GC instead of the default libc malloc() [default=no]])],
|
||||||
|
[with_boehm_gc=$enableval])
|
||||||
|
|
||||||
|
AS_IF([test "x$with_boehm_gc" = "xyes"],
|
||||||
|
AC_SEARCH_LIBS([GC_malloc], [gc],
|
||||||
|
[AC_DEFINE(USE_BOEHM_GC, 1, [Define if Boehm GC is to be used])],
|
||||||
|
[AC_MSG_FAILURE([--enable-boehm-gc specified but test for libgc failed])]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl
|
||||||
dnl ============================
|
dnl ============================
|
||||||
dnl Checks for library functions
|
dnl Checks for library functions
|
||||||
dnl ============================
|
dnl ============================
|
||||||
|
|||||||
Reference in New Issue
Block a user