You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
3.8 KiB
152 lines
3.8 KiB
15 years ago
|
dnl check whether mallinfo() is available and which fields to use to find out memory usage
|
||
|
dnl it's used in konq_mainwindow.cc
|
||
|
dnl warning, ugly code ahead
|
||
|
dnl some implementations have mallinfo() in stdlib.h, others in malloc.h
|
||
|
dnl fields showing memory usage should be hblkhd, uordblks and usmblks,
|
||
|
dnl different implementations use different combinations of these (which is ok),
|
||
|
dnl but some of them "reuse" fields they don't use for other purposes
|
||
|
|
||
|
AC_DEFUN([KDE_MALLINFO_CHECK],
|
||
|
[
|
||
|
AC_MSG_CHECKING([for mallinfo() in $1])
|
||
|
AC_CACHE_VAL(kde_cv_func_mallinfo_$2,
|
||
|
[
|
||
|
AC_LANG_SAVE
|
||
|
AC_LANG_CPLUSPLUS
|
||
|
AC_TRY_COMPILE([#include $1],
|
||
|
[
|
||
|
struct mallinfo m;
|
||
|
int dummy;
|
||
|
m = mallinfo();
|
||
|
dummy = m.hblkhd;
|
||
|
dummy = m.uordblks;
|
||
|
dummy = m.usmblks;
|
||
|
dummy = dummy;
|
||
|
],
|
||
|
kde_cv_func_mallinfo_$2=yes,
|
||
|
kde_cv_func_mallinfo_$2=no)
|
||
|
AC_LANG_RESTORE
|
||
|
])
|
||
|
if test "$kde_cv_func_mallinfo_$2" = "yes"; then
|
||
|
kde_mallinfo_type=$2
|
||
|
fi
|
||
|
AC_MSG_RESULT($kde_cv_func_mallinfo_$2)
|
||
|
])
|
||
|
|
||
|
|
||
|
AC_DEFUN([KDE_MALLINFO_CHECK_FIELD],
|
||
|
[
|
||
|
AC_MSG_CHECKING([whether to use mallinfo field $1])
|
||
|
AC_CACHE_VAL(kde_cv_func_mallinfo_field_$1,
|
||
|
[
|
||
|
AC_LANG_SAVE
|
||
|
AC_LANG_CPLUSPLUS
|
||
|
AC_TRY_RUN(
|
||
|
[
|
||
|
|
||
|
#include <$kde_mallinfo_type.h>
|
||
|
enum use_type { No, Yes, Never };
|
||
|
use_type use_field = No;
|
||
|
const int SIZE = 4 * 1024 * 1024;
|
||
|
const int SMALL_SIZE = 4 * 1024;
|
||
|
|
||
|
void dif( struct mallinfo& m1, struct mallinfo& m2, bool alloc )
|
||
|
{
|
||
|
int difval = m2.$1 - m1.$1;
|
||
|
if( alloc )
|
||
|
{
|
||
|
if( difval >= SIZE && difval < 2 * SIZE && use_field != Never )
|
||
|
use_field = Yes;
|
||
|
}
|
||
|
else // !alloc
|
||
|
{
|
||
|
difval = -difval;
|
||
|
if( difval > SMALL_SIZE && ( difval < SIZE || difval >= 2 * SIZE ) && use_field == Yes )
|
||
|
use_field = Never;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
free( malloc( SIZE * 2 )); // avoid Doug Lea's malloc feature of having total_max in usmblks
|
||
|
struct mallinfo m1 = mallinfo();
|
||
|
void* mem1 = malloc( SIZE );
|
||
|
struct mallinfo m2 = mallinfo();
|
||
|
free( mem1 );
|
||
|
struct mallinfo m3 = mallinfo();
|
||
|
void* mem2[ SIZE / 32 ];
|
||
|
for( int i = 0;
|
||
|
i < SIZE / 32;
|
||
|
++i )
|
||
|
mem2[ i ] = malloc( 32 );
|
||
|
struct mallinfo m4 = mallinfo();
|
||
|
for( int i = 0;
|
||
|
i < SIZE / 32;
|
||
|
++i )
|
||
|
free( mem2[ i ] );
|
||
|
struct mallinfo m5 = mallinfo();
|
||
|
void* mem3[ SIZE / 1024 ];
|
||
|
for( int i = 0;
|
||
|
i < SIZE / 1024;
|
||
|
++i )
|
||
|
mem3[ i ] = malloc( 1024 );
|
||
|
struct mallinfo m6 = mallinfo();
|
||
|
for( int i = 0;
|
||
|
i < SIZE / 1024;
|
||
|
++i )
|
||
|
free( mem3[ i ] );
|
||
|
struct mallinfo m7 = mallinfo();
|
||
|
dif( m1, m2, true );
|
||
|
dif( m2, m3, false );
|
||
|
dif( m3, m4, true );
|
||
|
dif( m4, m5, false );
|
||
|
dif( m5, m6, true );
|
||
|
dif( m6, m7, false );
|
||
|
return use_field == Yes ? 0 : 1;
|
||
|
}
|
||
|
|
||
|
],
|
||
|
[kde_cv_func_mallinfo_field_$1=yes],
|
||
|
[kde_cv_func_mallinfo_field_$1=no],
|
||
|
[kde_cv_func_mallinfo_field_$1=no])
|
||
|
AC_LANG_RESTORE
|
||
|
])
|
||
|
AC_MSG_RESULT($kde_cv_func_mallinfo_field_$1)
|
||
|
kde_mallinfo_$1=$kde_cv_func_mallinfo_field_$1
|
||
|
if test "$kde_mallinfo_$1" = "yes"; then
|
||
|
AC_DEFINE( KDE_MALLINFO_FIELD_$1, 1, [Use mallinfo field $1])
|
||
|
fi
|
||
|
])
|
||
|
|
||
|
|
||
|
kde_mallinfo_type=
|
||
|
KDE_MALLINFO_CHECK([<stdlib.h>],stdlib)
|
||
|
if test -z "$kde_mallinfo_type"; then
|
||
|
KDE_MALLINFO_CHECK([<malloc.h>],malloc)
|
||
|
fi
|
||
|
|
||
|
AC_TRY_LINK_FUNC(mallinfo,
|
||
|
[],
|
||
|
[ AC_CHECK_LIB(malloc,mallinfo,
|
||
|
[ AC_SUBST(LIBMALLOC,"-lmalloc") ],
|
||
|
[ kde_mallinfo_type="" ])
|
||
|
])
|
||
|
|
||
|
if test -n "$kde_mallinfo_type"; then
|
||
|
KDE_MALLINFO_CHECK_FIELD(hblkhd)
|
||
|
KDE_MALLINFO_CHECK_FIELD(uordblks)
|
||
|
KDE_MALLINFO_CHECK_FIELD(usmblks)
|
||
|
if test -z "$kde_mallinfo_hblkhd" -a \
|
||
|
-z "$kde_mallinfo_uordblks" -a \
|
||
|
-z "$kde_mallinfo_usmblks"; then
|
||
|
kde_mallinfo_type=
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
|
||
|
if test "$kde_mallinfo_type" = "stdlib"; then
|
||
|
AC_DEFINE(KDE_MALLINFO_STDLIB, 1, [mallinfo() is available in <stdlib.h>])
|
||
|
elif test "$kde_mallinfo_type" = "malloc"; then
|
||
|
AC_DEFINE(KDE_MALLINFO_MALLOC, 1, [mallinfo() is available in <malloc.h>])
|
||
|
fi
|