summaryrefslogtreecommitdiff
path: root/configure.ac
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2018-11-21 12:16:01 +0300
committerIvan Maidanski <ivmai@mail.ru>2018-11-21 12:44:46 +0300
commit792268aea37759ae3975ff3baab4e99978ebda5f (patch)
tree785dfa651ddcbe126f245a23a1824392bcb98318 /configure.ac
parent016f30060f3c34a69387fa64e1f75f69057d57c0 (diff)
downloadbdwgc-792268aea37759ae3975ff3baab4e99978ebda5f.tar.gz
Turn off parallel marker, thread-local allocation if used AO ops emulated
* configure.ac (use_parallel_mark, use_thread_local_alloc): New variable (set to enable_parallel_mark and enable_thread_local_alloc, respectively, if threads are enabled). * configure.ac (PARALLEL_MARK, THREAD_LOCAL_ALLOC): Group and move AC_DEFINE down (the definition depends on the final value of use_parallel_mark or use_thread_local_alloc, respectively). * configure.ac (THREAD_LOCAL_ALLOC): Move AM_CONDITIONAL down to use the final value of use_thread_local_alloc; do not check THREADS. * configure.ac (handle-fork): Move AC_ARG_ENABLE and its processing down to use the final value of use_parallel_mark (the latter is used instead of enable_parallel_mark). * configure.ac [$with_libatomic_ops!=none && $need_atomic_ops_asm!=true] (use_thread_local_alloc): Set explicitly to "no" if BASE_ATOMIC_OPS_EMULATED is defined. * configure.ac [$with_libatomic_ops!=none && $need_atomic_ops_asm!=true && $use_parallel_mark!=no] (use_parallel_mark): Set explicitly to "no" in case of a failure of AC_TRY_LINK of a code snippet calling AO_fetch_and_add and AO_compare_and_swap (provided AO_REQUIRE_CAS is defined). * include/private/gc_pmark.h [USE_MARK_BYTES && PARALLEL_MARK && AO_HAVE_char_store] (SET_MARK_BIT_EXIT_IF_SET): Do not use AO_char_load() and AO_char_store() if BASE_ATOMIC_OPS_EMULATED.
Diffstat (limited to 'configure.ac')
-rw-r--r--configure.ac143
1 files changed, 68 insertions, 75 deletions
diff --git a/configure.ac b/configure.ac
index 0fd56663..1d92e2bd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -186,6 +186,8 @@ CFLAGS="$old_CFLAGS"
THREADDLLIBS=
need_atomic_ops_asm=false
+use_parallel_mark=no
+use_thread_local_alloc=no
# Libraries needed to support dynamic loading and/or threads.
case "$THREADS" in
no | none | single)
@@ -203,12 +205,8 @@ case "$THREADS" in
AC_DEFINE(GC_THREADS)
AC_DEFINE([_REENTRANT], [1],
[Required define if using POSIX threads.])
- if test "${enable_parallel_mark}" != no; then
- AC_DEFINE(PARALLEL_MARK)
- fi
- if test "${enable_thread_local_alloc}" != no; then
- AC_DEFINE(THREAD_LOCAL_ALLOC)
- fi
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
default_threadlibs=true
AC_MSG_WARN("Explicit GC_INIT() calls may be required.")
;;
@@ -252,13 +250,9 @@ case "$THREADS" in
*-*-mingw*)
AC_DEFINE(GC_WIN32_PTHREADS)
# Using pthreads-win32 (or other non-Cygwin pthreads) library.
- if test "${enable_parallel_mark}" != no; then
- AC_DEFINE(PARALLEL_MARK)
- fi
- if test "${enable_thread_local_alloc}" != no; then
- AC_DEFINE(THREAD_LOCAL_ALLOC)
- fi
THREADDLLIBS="-lpthread"
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
win32_threads=true
;;
*-*-darwin*)
@@ -285,15 +279,11 @@ case "$THREADS" in
;;
win32)
AC_DEFINE(GC_THREADS)
- if test "${enable_parallel_mark}" != no; then
- AC_DEFINE(PARALLEL_MARK)
- fi
- if test "${enable_thread_local_alloc}" != no; then
- if test "${enable_parallel_mark}" != no \
- -o "${enable_shared}" != yes -o "${enable_static}" != no; then
- # Imply THREAD_LOCAL_ALLOC unless GC_DLL.
- AC_DEFINE(THREAD_LOCAL_ALLOC)
- fi
+ use_parallel_mark=$enable_parallel_mark
+ if test "${enable_parallel_mark}" != no \
+ -o "${enable_shared}" != yes -o "${enable_static}" != no; then
+ # Imply THREAD_LOCAL_ALLOC unless GC_DLL.
+ use_thread_local_alloc=$enable_thread_local_alloc
fi
if test "${enable_win32_dllmain}" = yes; then
AC_DEFINE(GC_INSIDE_DLL, 1,
@@ -309,12 +299,8 @@ case "$THREADS" in
AC_MSG_RESULT($THREADDLLIBS)
# Use pthread GCC switch
THREADDLLIBS=-pthread
- if test "${enable_parallel_mark}" != no; then
- AC_DEFINE(PARALLEL_MARK)
- fi
- if test "${enable_thread_local_alloc}" != no; then
- AC_DEFINE(THREAD_LOCAL_ALLOC)
- fi
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
AC_MSG_WARN("Explicit GC_INIT() calls may be required.")
AM_CFLAGS="-pthread $AM_CFLAGS"
;;
@@ -323,22 +309,14 @@ case "$THREADS" in
THREADDLLIBS=-lpthread
AC_DEFINE(GC_THREADS)
AC_DEFINE(_REENTRANT)
- if test "${enable_parallel_mark}" != no; then
- AC_DEFINE(PARALLEL_MARK)
- fi
- if test "${enable_thread_local_alloc}" != no; then
- AC_DEFINE(THREAD_LOCAL_ALLOC)
- fi
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
;;
rtems)
THREADS=posix
AC_DEFINE(GC_THREADS)
- if test "${enable_parallel_mark}" != no; then
- AC_DEFINE(PARALLEL_MARK)
- fi
- if test "${enable_thread_local_alloc}" != no; then
- AC_DEFINE(THREAD_LOCAL_ALLOC)
- fi
+ use_parallel_mark=$enable_parallel_mark
+ use_thread_local_alloc=$enable_thread_local_alloc
;;
decosf1 | irix | mach | os2 | solaris | dce | vxworks)
AC_MSG_ERROR(thread package $THREADS not yet supported)
@@ -352,8 +330,6 @@ AM_CONDITIONAL(THREADS, test x$THREADS != xnone)
AM_CONDITIONAL(PTHREADS, test x$THREADS = xposix)
AM_CONDITIONAL(DARWIN_THREADS, test x$darwin_threads = xtrue)
AM_CONDITIONAL(WIN32_THREADS, test x$win32_threads = xtrue)
-AM_CONDITIONAL(THREAD_LOCAL_ALLOC,
- test x$enable_thread_local_alloc != xno -a x$THREADS != xnone)
compiler_suncc=no
pthread_start_standalone=no
@@ -856,40 +832,6 @@ if test "${enable_large_config}" = yes; then
[Define to optimize for large heaps or root sets.])
fi
-AC_ARG_ENABLE(handle-fork,
- [AC_HELP_STRING([--enable-handle-fork[=yes|no|auto|manual]],
- [attempt to ensure a usable collector after fork()
- in multi-threaded programs (default: auto;
- manual: GC_atfork_prepare/parent/child should be
- called by the client)])])
-if test "${enable_handle_fork}" = yes; then
- AC_DEFINE(HANDLE_FORK, 1,
- [Define to install pthread_atfork() handlers by default.])
-elif test "${enable_handle_fork}" = no; then
- AC_DEFINE(NO_HANDLE_FORK, 1,
- [Prohibit installation of pthread_atfork() handlers.])
-elif test "${enable_handle_fork}" != manual -a x$THREADS = xposix; then
- # If the option is omitted, pthread_atfork handlers are installed
- # by default for the targets where pthread_atfork is known to work.
- case "$host" in
- *-*-android*)
- # Android NDK does not provide pthread_atfork.
- ;;
- *-*-darwin*)
- # The incremental mode (which is off if parallel marking) conflicts
- # with fork handling on Darwin.
- if test "${enable_parallel_mark}" != no; then
- AC_DEFINE(HANDLE_FORK)
- fi
- ;;
- *-*-aix* | *-*-cygwin* | *-*-freebsd* | *-*-haiku* | \
- *-*-hpux11* | *-*-irix* | *-*-kfreebsd*-gnu | \
- *-*-*linux* | *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
- AC_DEFINE(HANDLE_FORK)
- ;;
- esac
-fi
-
dnl This is something of a hack. When cross-compiling we turn off
dnl some functionality. We also enable the "small" configuration.
dnl These is only correct when targeting an embedded system. FIXME.
@@ -1124,11 +1066,62 @@ AS_IF([test x$with_libatomic_ops != xnone -a x$need_atomic_ops_asm != xtrue],
AO_store_release(&x,AO_load_acquire(&x)+1)],
[ AC_MSG_RESULT(yes) ],
[ AC_MSG_RESULT(no)
+ use_thread_local_alloc=no
AC_DEFINE([BASE_ATOMIC_OPS_EMULATED], [1],
[AO load, store and/or test-and-set primitives are
implemented in libatomic_ops using locks.]) ])
+ AS_IF([test x$use_parallel_mark != xno],
+ [ AC_MSG_CHECKING(
+ [for lock-free compare-and-swap and fetch-and-add primitives])
+ AC_TRY_LINK(
+ [#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"],
+ [AO_t x=0;(void)AO_fetch_and_add(&x,1);(void)AO_compare_and_swap(&x,1,2)],
+ [ AC_MSG_RESULT(yes) ],
+ [ AC_MSG_RESULT(no)
+ use_parallel_mark=no ]) ])
CFLAGS="$old_CFLAGS" ])
+AS_IF([test x$use_parallel_mark != xno],
+ [ AC_DEFINE(PARALLEL_MARK) ])
+AS_IF([test x$use_thread_local_alloc != xno],
+ [ AC_DEFINE(THREAD_LOCAL_ALLOC) ])
+AM_CONDITIONAL(THREAD_LOCAL_ALLOC, test x$use_thread_local_alloc != xno)
+
+AC_ARG_ENABLE(handle-fork,
+ [ AC_HELP_STRING([--enable-handle-fork[=yes|no|auto|manual]],
+ [attempt to ensure a usable collector after fork()
+ in multi-threaded programs (default: auto;
+ manual: GC_atfork_prepare/parent/child should be
+ called by the client)]) ])
+if test "${enable_handle_fork}" = yes; then
+ AC_DEFINE(HANDLE_FORK, 1,
+ [Define to install pthread_atfork() handlers by default.])
+elif test "${enable_handle_fork}" = no; then
+ AC_DEFINE(NO_HANDLE_FORK, 1,
+ [Prohibit installation of pthread_atfork() handlers.])
+elif test "${enable_handle_fork}" != manual -a x$THREADS = xposix; then
+ # If the option is omitted, pthread_atfork handlers are installed
+ # by default for the targets where pthread_atfork is known to work.
+ case "$host" in
+ *-*-android*)
+ # Android NDK does not provide pthread_atfork.
+ ;;
+ *-*-darwin*)
+ # The incremental mode (which is off if parallel marking) conflicts
+ # with fork handling on Darwin.
+ if test x$use_parallel_mark != xno; then
+ AC_DEFINE(HANDLE_FORK)
+ fi
+ ;;
+ *-*-aix* | *-*-cygwin* | *-*-freebsd* | *-*-haiku* | \
+ *-*-hpux11* | *-*-irix* | *-*-kfreebsd*-gnu | \
+ *-*-*linux* | *-*-netbsd* | *-*-openbsd* | *-*-osf* | *-*-solaris*)
+ AC_DEFINE(HANDLE_FORK)
+ ;;
+ esac
+fi
+
dnl Produce the Files
dnl -----------------