summaryrefslogtreecommitdiffstats
path: root/konqueror/preloader/configure.in.in
diff options
context:
space:
mode:
Diffstat (limited to 'konqueror/preloader/configure.in.in')
-rw-r--r--konqueror/preloader/configure.in.in151
1 files changed, 151 insertions, 0 deletions
diff --git a/konqueror/preloader/configure.in.in b/konqueror/preloader/configure.in.in
new file mode 100644
index 000000000..315b23c97
--- /dev/null
+++ b/konqueror/preloader/configure.in.in
@@ -0,0 +1,151 @@
+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