+2011-05-30 Ivan Maidanski <ivmai@mail.ru>
+
+ * configure.ac (PIC): Add workaround for GCC v3.4.6 which does not
+ define the corresponding macro.
+ * configure.ac: Don't check for GCC twice.
+ * configure: Regenerate.
+ * tests/test_malloc.c (DEFAULT_NTHREADS): New macro.
+ * tests/test_malloc.c (run_one_test): Refine printed message (in
+ case of HAVE_MMAP).
+ * tests/test_malloc.c (main): Use DEFAULT_NTHREADS.
+ * tests/test_stack.c (main): Cast AO_stack_pop() returned pointer.
+ * src/atomic_ops_malloc.c (USE_MMAP_ANON, GC_MMAP_FLAGS,
+ OPT_MAP_ANON): New macro.
+ * src/atomic_ops_malloc.c (get_mmaped): Pass -1 (instead of 0) as
+ file descriptor to mmap() if MAP_ANONYMOUS (same as for MAP_ANON).
+ * src/atomic_ops_malloc.c (get_mmaped): Use USE_MMAP_ANON,
+ GC_MMAP_FLAGS and OPT_MAP_ANON macros; reformat code; check open()
+ returned value.
+
2011-05-11 Ivan Maidanski <ivmai@mail.ru>
* tests/test_malloc.c: Expand all tabs to spaces; remove trailing
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: -fPIC" >&5
$as_echo "-fPIC" >&6; }
PICFLAG=-fPIC
+ case "$host" in
+ *-*-solaris*)
+ # Workaround: at least GCC 3.4.6 does not define this macro.
+ CFLAGS="$CFLAGS -D__PIC__=1"
+ ;;
+ esac
else
case "$host" in
*-*-hpux*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: \"+Z\"" >&5
$as_echo "\"+Z\"" >&6; }
PICFLAG="+Z"
- if test "$GCC" != yes; then
- CFLAGS="$CFLAGS +O2 -mt"
- fi
+ CFLAGS="$CFLAGS +O2 -mt"
;;
*-*-solaris*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: -Kpic" >&5
$as_echo "-Kpic" >&6; }
PICFLAG=-Kpic
- if test "$GCC" != yes; then
- CFLAGS="$CFLAGS -O"
- need_asm=true
- fi
+ CFLAGS="$CFLAGS -O"
+ need_asm=true
;;
*-*-linux*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: -fPIC" >&5
if test "$GCC" = yes; then
AC_MSG_RESULT(-fPIC)
PICFLAG=-fPIC
+ case "$host" in
+ *-*-solaris*)
+ # Workaround: at least GCC 3.4.6 does not define this macro.
+ CFLAGS="$CFLAGS -D__PIC__=1"
+ ;;
+ esac
else
case "$host" in
*-*-hpux*)
AC_MSG_RESULT("+Z")
PICFLAG="+Z"
- if test "$GCC" != yes; then
- CFLAGS="$CFLAGS +O2 -mt"
- fi
+ CFLAGS="$CFLAGS +O2 -mt"
;;
*-*-solaris*)
AC_MSG_RESULT(-Kpic)
PICFLAG=-Kpic
- if test "$GCC" != yes; then
- CFLAGS="$CFLAGS -O"
- need_asm=true
- fi
+ CFLAGS="$CFLAGS -O"
+ need_asm=true
;;
*-*-linux*)
AC_MSG_RESULT(-fPIC)
#include <fcntl.h>
#include <sys/mman.h>
+#if defined(MAP_ANONYMOUS) || defined(MAP_ANON)
+# define USE_MMAP_ANON
+#endif
+
+#ifdef USE_MMAP_FIXED
+# define GC_MMAP_FLAGS MAP_FIXED | MAP_PRIVATE
+ /* Seems to yield better performance on Solaris 2, but can */
+ /* be unreliable if something is already mapped at the address. */
+#else
+# define GC_MMAP_FLAGS MAP_PRIVATE
+#endif
+
+#ifdef USE_MMAP_ANON
+# ifdef MAP_ANONYMOUS
+# define OPT_MAP_ANON MAP_ANONYMOUS
+# else
+# define OPT_MAP_ANON MAP_ANON
+# endif
+#else
+# define OPT_MAP_ANON 0
+#endif
+
static volatile AO_t mmap_enabled = 0;
void
static char *get_mmaped(size_t sz)
{
char * result;
+# ifdef USE_MMAP_ANON
+# define zero_fd -1
+# else
+ int zero_fd;
+# endif
assert(!(sz & (CHUNK_SIZE - 1)));
- if (!mmap_enabled) return 0;
-# if defined(MAP_ANONYMOUS)
- result = mmap(0, sz, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
-# elif defined(MAP_ANON)
- result = mmap(0, sz, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANON, -1, 0);
-# else
- {
- int zero_fd = open("/dev/zero", O_RDONLY);
- result = mmap(0, sz, PROT_READ | PROT_WRITE,
- MAP_PRIVATE, zero_fd, 0);
- close(zero_fd);
- }
+ if (!mmap_enabled)
+ return 0;
+
+# ifndef USE_MMAP_ANON
+ zero_fd = open("/dev/zero", O_RDONLY);
+ if (zero_fd == -1)
+ return 0;
+# endif
+ result = mmap(0, sz, PROT_READ | PROT_WRITE,
+ GC_MMAP_FLAGS | OPT_MAP_ANON, zero_fd, 0/* offset */);
+# ifndef USE_MMAP_ANON
+ close(zero_fd);
# endif
- if (result == MAP_FAILED) result = 0;
+ if (result == MAP_FAILED)
+ result = 0;
return result;
}
log_sz = *(AO_t *)base;
# ifdef AO_TRACE_MALLOC
fprintf(stderr, "%x: AO_free(%p sz:%lu)\n", (int)pthread_self(), p,
- (unsigned long)
- (log_sz > LOG_MAX_SIZE? log_sz : (1 << log_sz)));
+ (unsigned long)(log_sz > LOG_MAX_SIZE? log_sz : (1 << log_sz)));
# endif
if (log_sz > LOG_MAX_SIZE)
AO_free_large(p);
#ifndef MAX_NTHREADS
# define MAX_NTHREADS 100
#endif
+
+#ifndef DEFAULT_NTHREADS
+# ifdef HAVE_MMAP
+# define DEFAULT_NTHREADS 10
+# else
+# define DEFAULT_NTHREADS 3
+# endif
+#endif
+
#ifndef N_REVERSALS
# define N_REVERSALS 1000 /* must be even */
#endif
+
#ifndef LIST_LENGTH
# define LIST_LENGTH 1000
#endif
+
#ifndef LARGE_OBJ_SIZE
# define LARGE_OBJ_SIZE 200000
#endif
char *q;
if (0 == p) {
- fprintf(stderr, "AO_malloc(%d) failed: This is normal without mmap\n",
- LARGE_OBJ_SIZE);
- AO_free(p);
+# ifdef HAVE_MMAP
+ fprintf(stderr, "AO_malloc(%d) failed\n", LARGE_OBJ_SIZE);
+# else
+ fprintf(stderr, "AO_malloc(%d) failed: This is normal without mmap\n",
+ LARGE_OBJ_SIZE);
+# endif
} else {
p[0] = p[LARGE_OBJ_SIZE/2] = p[LARGE_OBJ_SIZE-1] = 'a';
q = AO_malloc(LARGE_OBJ_SIZE);
int exper_n;
if (1 == argc) {
-# if !defined(HAVE_MMAP)
- nthreads = 3;
-# else
- nthreads = 10;
-# endif
+ nthreads = DEFAULT_NTHREADS;
} else if (2 == argc) {
nthreads = atoi(argv[1]);
if (nthreads < 1 || nthreads > MAX_NTHREADS) {
print_list();
# endif
check_list(list_length);
- while ((le = AO_stack_pop(&the_list)) != 0)
+ while ((le = (list_element *)AO_stack_pop(&the_list)) != 0)
free(le);
}
# ifndef NO_TIMES