Make threads mandatory

G_THREADS_ENABLED still exists, but is always defined. It is still
possible to use libglib without threads, but gobject (and everything
above it) is now guaranteed to be using threads (as, in fact, it was
before, since it was accidentally impossible to compile with
--disable-threads).

https://bugzilla.gnome.org/show_bug.cgi?id=616754
This commit is contained in:
Dan Winship 2011-08-31 14:01:45 -04:00 committed by Ryan Lortie
parent 0d1a2eb4bf
commit 5bc7729d16
13 changed files with 244 additions and 399 deletions

View File

@ -225,20 +225,11 @@ AC_ARG_ENABLE(mem_pools,
[AC_HELP_STRING([--disable-mem-pools],
[disable all glib memory pools])],,
[disable_mem_pools=no])
AC_ARG_ENABLE(threads,
[AC_HELP_STRING([--enable-threads],
[turn on basic thread support [default=yes]
([=no] will override --with-threads)])],,
[enable_threads=yes])
AC_ARG_ENABLE(rebuilds,
[AC_HELP_STRING([--disable-rebuilds],
[disable all source autogeneration rules])],,
[enable_rebuilds=yes])
if test "x$enable_threads" != "xyes"; then
enable_threads=no
fi
AC_MSG_CHECKING([whether to enable garbage collector friendliness])
if test "x$enable_gc_friendly" = "xyes"; then
AC_DEFINE(ENABLE_GC_FRIENDLY_DEFAULT, 1, [Whether to enable GC friendliness by default])
@ -1892,7 +1883,7 @@ dnl *** g_thread checks ***
dnl ***********************
AC_ARG_WITH(threads,
[AC_HELP_STRING([--with-threads=@<:@none/posix/dce/win32@:>@],
[AC_HELP_STRING([--with-threads=@<:@posix/dce/win32@:>@],
[specify a thread implementation to use])],
[if test "x$with_threads" = x; then
want_threads=yes
@ -1900,15 +1891,12 @@ AC_ARG_WITH(threads,
want_threads=$with_threads
fi],
[want_threads=yes])
if test "x$enable_threads" = "xno"; then
want_threads=no
fi
dnl error and warning message
dnl *************************
THREAD_NO_IMPLEMENTATION="You do not have any known thread system on your
computer. GLib will not have a default thread implementation."
computer."
FLAG_DOES_NOT_WORK="I can't find the MACRO to enable thread safety on your
platform (normally it's "_REENTRANT"). I'll not use any flag on
@ -1919,9 +1907,7 @@ LIBS_NOT_FOUND_1="I can't find the libraries for the thread implementation
"
LIBS_NOT_FOUND_2=". Please choose another thread implementation or
provide information on your thread implementation.
You can also run 'configure --disable-threads'
to compile without thread support."
provide information on your thread implementation."
FUNC_NO_GETPWUID_R="the 'g_get_(user_name|real_name|home_dir|tmp_dir)'
functions will not be MT-safe during their first call because
@ -1950,9 +1936,6 @@ AIX_COMPILE_INFO="AIX's C compiler needs to be called by a different name, when
dnl determination of thread implementation
dnl ***************************************
# have_threads=no means no thread support
# have_threads=none means no default thread implementation
have_threads=no
if test "x$want_threads" = xyes || test "x$want_threads" = xposix \
|| test "x$want_threads" = xdce; then
@ -1988,15 +1971,12 @@ if test "x$want_threads" = xyes || test "x$want_threads" = xwin32; then
;;
esac
fi
if test "x$want_threads" = xnone; then
have_threads=none
fi
AC_MSG_CHECKING(for thread implementation)
if test "x$have_threads" = xno && test "x$want_threads" != xno; then
if test "x$have_threads" = xno; then
AC_MSG_RESULT(none available)
AC_MSG_WARN($THREAD_NO_IMPLEMENTATION)
AC_MSG_ERROR($THREAD_NO_IMPLEMENTATION)
else
AC_MSG_RESULT($have_threads)
fi
@ -2036,50 +2016,48 @@ int main() {
&& errno != 0;
}])
if test x"$have_threads" != xno; then
if test x"$have_threads" = xposix; then
# First we test for posix, whether -pthread or -pthreads do the trick as
# both CPPFLAG and LIBS.
# One of them does for most gcc versions and some other platforms/compilers
# too and could be considered as the canonical way to go.
case $host in
*-*-cygwin*|*-*-darwin*)
# skip cygwin and darwin -pthread or -pthreads test
;;
*-solaris*)
# These compiler/linker flags work with both Sun Studio and gcc
# Sun Studio expands -mt to -D_REENTRANT and -lthread
# gcc expands -pthreads to -D_REENTRANT -D_PTHREADS -lpthread
G_THREAD_CFLAGS="-D_REENTRANT -D_PTHREADS"
G_THREAD_LIBS="-lpthread -lthread"
;;
*)
for flag in pthread pthreads mt; do
glib_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -$flag"
AC_TRY_RUN(glib_thread_test(0),
glib_flag_works=yes,
glib_flag_works=no,
[AC_LINK_IFELSE([AC_LANG_SOURCE(glib_thread_test(0))],
glib_flag_works=yes,
glib_flag_works=no)])
CFLAGS="$glib_save_CFLAGS"
if test $glib_flag_works = yes ; then
G_THREAD_CFLAGS=-$flag
G_THREAD_LIBS=-$flag
break;
fi
done
;;
esac
fi
if test x"$have_threads" = xposix; then
# First we test for posix, whether -pthread or -pthreads do the trick as
# both CPPFLAG and LIBS.
# One of them does for most gcc versions and some other platforms/compilers
# too and could be considered as the canonical way to go.
case $host in
*-*-cygwin*|*-*-darwin*)
# skip cygwin and darwin -pthread or -pthreads test
;;
*-solaris*)
# These compiler/linker flags work with both Sun Studio and gcc
# Sun Studio expands -mt to -D_REENTRANT and -lthread
# gcc expands -pthreads to -D_REENTRANT -D_PTHREADS -lpthread
G_THREAD_CFLAGS="-D_REENTRANT -D_PTHREADS"
G_THREAD_LIBS="-lpthread -lthread"
;;
*)
for flag in pthread pthreads mt; do
glib_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -$flag"
AC_TRY_RUN(glib_thread_test(0),
glib_flag_works=yes,
glib_flag_works=no,
[AC_LINK_IFELSE([AC_LANG_SOURCE(glib_thread_test(0))],
glib_flag_works=yes,
glib_flag_works=no)])
CFLAGS="$glib_save_CFLAGS"
if test $glib_flag_works = yes ; then
G_THREAD_CFLAGS=-$flag
G_THREAD_LIBS=-$flag
break;
fi
done
;;
esac
fi
if test x"$G_THREAD_CFLAGS" = x; then
if test x"$G_THREAD_CFLAGS" = x; then
# The canonical -pthread[s] does not work. Try something different.
# The canonical -pthread[s] does not work. Try something different.
case $host in
case $host in
*-aix*)
if test x"$GCC" = xyes; then
# GCC 3.0 and above needs -pthread.
@ -2119,34 +2097,33 @@ if test x"$have_threads" != xno; then
*)
G_THREAD_CFLAGS="-D_REENTRANT" # good default guess otherwise
;;
esac
fi
esac
# if we are not finding the localtime_r function, then we probably are
# not using the proper multithread flag
glib_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS"
# First we test, whether localtime_r is declared in time.h
# directly. Then we test whether a macro localtime_r exists, in
# which case localtime_r in the test program is replaced and thus
# if we still find localtime_r in the output, it is not defined as
# a macro.
AC_EGREP_CPP([[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]], [#include <time.h>], ,
[AC_EGREP_CPP([[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]], [#include <time.h>
localtime_r(a,b)],
AC_MSG_WARN($FLAG_DOES_NOT_WORK))])
CPPFLAGS="$glib_save_CPPFLAGS"
AC_MSG_CHECKING(thread related cflags)
AC_MSG_RESULT($G_THREAD_CFLAGS)
CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS"
fi
# if we are not finding the localtime_r function, then we probably are
# not using the proper multithread flag
glib_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS"
# First we test, whether localtime_r is declared in time.h
# directly. Then we test whether a macro localtime_r exists, in
# which case localtime_r in the test program is replaced and thus
# if we still find localtime_r in the output, it is not defined as
# a macro.
AC_EGREP_CPP([[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]], [#include <time.h>], ,
[AC_EGREP_CPP([[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]], [#include <time.h>
localtime_r(a,b)],
AC_MSG_WARN($FLAG_DOES_NOT_WORK))])
CPPFLAGS="$glib_save_CPPFLAGS"
AC_MSG_CHECKING(thread related cflags)
AC_MSG_RESULT($G_THREAD_CFLAGS)
CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS"
dnl determination of G_THREAD_LIBS
dnl ******************************
@ -2247,9 +2224,6 @@ case $have_threads in
win32)
g_threads_impl="WIN32"
;;
none|no)
g_threads_impl="NONE"
;;
*)
g_threads_impl="NONE"
G_THREAD_LIBS=error
@ -2275,16 +2249,15 @@ AC_MSG_RESULT($G_THREAD_LIBS)
dnl check for mt safe function variants and some posix functions
dnl ************************************************************
if test x"$have_threads" != xno; then
glib_save_LIBS="$LIBS"
# we are not doing the following for now, as this might require glib
# to always be linked with the thread libs on some platforms.
# LIBS="$LIBS $G_THREAD_LIBS"
AC_CHECK_FUNCS(localtime_r gmtime_r)
if test "$ac_cv_header_pwd_h" = "yes"; then
AC_CACHE_CHECK([for posix getpwuid_r],
ac_cv_func_posix_getpwuid_r,
[AC_TRY_RUN([
glib_save_LIBS="$LIBS"
# we are not doing the following for now, as this might require glib
# to always be linked with the thread libs on some platforms.
# LIBS="$LIBS $G_THREAD_LIBS"
AC_CHECK_FUNCS(localtime_r gmtime_r)
if test "$ac_cv_header_pwd_h" = "yes"; then
AC_CACHE_CHECK([for posix getpwuid_r],
ac_cv_func_posix_getpwuid_r,
[AC_TRY_RUN([
#include <errno.h>
#include <pwd.h>
int main () {
@ -2297,33 +2270,33 @@ int main () {
return (error < 0 && errno == ENOSYS)
|| error == ENOSYS;
} ],
[ac_cv_func_posix_getpwuid_r=yes],
[ac_cv_func_posix_getpwuid_r=no])])
GLIB_ASSERT_SET(ac_cv_func_posix_getpwuid_r)
if test "$ac_cv_func_posix_getpwuid_r" = yes; then
AC_DEFINE(HAVE_POSIX_GETPWUID_R,1,
[Have POSIX function getpwuid_r])
else
AC_CACHE_CHECK([for nonposix getpwuid_r],
ac_cv_func_nonposix_getpwuid_r,
[AC_TRY_LINK([#include <pwd.h>],
[char buffer[10000];
struct passwd pwd;
getpwuid_r (0, &pwd, buffer,
sizeof (buffer));],
[ac_cv_func_nonposix_getpwuid_r=yes],
[ac_cv_func_nonposix_getpwuid_r=no])])
GLIB_ASSERT_SET(ac_cv_func_nonposix_getpwuid_r)
if test "$ac_cv_func_nonposix_getpwuid_r" = yes; then
AC_DEFINE(HAVE_NONPOSIX_GETPWUID_R,1,
[Have non-POSIX function getpwuid_r])
fi
[ac_cv_func_posix_getpwuid_r=yes],
[ac_cv_func_posix_getpwuid_r=no])])
GLIB_ASSERT_SET(ac_cv_func_posix_getpwuid_r)
if test "$ac_cv_func_posix_getpwuid_r" = yes; then
AC_DEFINE(HAVE_POSIX_GETPWUID_R,1,
[Have POSIX function getpwuid_r])
else
AC_CACHE_CHECK([for nonposix getpwuid_r],
ac_cv_func_nonposix_getpwuid_r,
[AC_TRY_LINK([#include <pwd.h>],
[char buffer[10000];
struct passwd pwd;
getpwuid_r (0, &pwd, buffer,
sizeof (buffer));],
[ac_cv_func_nonposix_getpwuid_r=yes],
[ac_cv_func_nonposix_getpwuid_r=no])])
GLIB_ASSERT_SET(ac_cv_func_nonposix_getpwuid_r)
if test "$ac_cv_func_nonposix_getpwuid_r" = yes; then
AC_DEFINE(HAVE_NONPOSIX_GETPWUID_R,1,
[Have non-POSIX function getpwuid_r])
fi
fi
if test "$ac_cv_header_grp_h" = "yes"; then
AC_CACHE_CHECK([for posix getgrgid_r],
ac_cv_func_posix_getgrgid_r,
[AC_TRY_RUN([
fi
if test "$ac_cv_header_grp_h" = "yes"; then
AC_CACHE_CHECK([for posix getgrgid_r],
ac_cv_func_posix_getgrgid_r,
[AC_TRY_RUN([
#include <errno.h>
#include <grp.h>
int main () {
@ -2336,116 +2309,115 @@ int main () {
return (error < 0 && errno == ENOSYS)
|| error == ENOSYS;
} ],
[ac_cv_func_posix_getgrgid_r=yes],
[ac_cv_func_posix_getgrgid_r=no])])
GLIB_ASSERT_SET(ac_cv_func_posix_getgrgid_r)
if test "$ac_cv_func_posix_getgrgid_r" = yes; then
AC_DEFINE(HAVE_POSIX_GETGRGID_R,1,
[Have POSIX function getgrgid_r])
else
AC_CACHE_CHECK([for nonposix getgrgid_r],
ac_cv_func_nonposix_getgrgid_r,
[AC_TRY_LINK([#include <grp.h>],
[char buffer[10000];
struct group grp;
getgrgid_r (0, &grp, buffer,
sizeof (buffer));],
[ac_cv_func_nonposix_getgrgid_r=yes],
[ac_cv_func_nonposix_getgrgid_r=no])])
GLIB_ASSERT_SET(ac_cv_func_nonposix_getgrgid_r)
if test "$ac_cv_func_nonposix_getgrgid_r" = yes; then
AC_DEFINE(HAVE_NONPOSIX_GETGRGID_R,1,
[Have non-POSIX function getgrgid_r])
fi
[ac_cv_func_posix_getgrgid_r=yes],
[ac_cv_func_posix_getgrgid_r=no])])
GLIB_ASSERT_SET(ac_cv_func_posix_getgrgid_r)
if test "$ac_cv_func_posix_getgrgid_r" = yes; then
AC_DEFINE(HAVE_POSIX_GETGRGID_R,1,
[Have POSIX function getgrgid_r])
else
AC_CACHE_CHECK([for nonposix getgrgid_r],
ac_cv_func_nonposix_getgrgid_r,
[AC_TRY_LINK([#include <grp.h>],
[char buffer[10000];
struct group grp;
getgrgid_r (0, &grp, buffer,
sizeof (buffer));],
[ac_cv_func_nonposix_getgrgid_r=yes],
[ac_cv_func_nonposix_getgrgid_r=no])])
GLIB_ASSERT_SET(ac_cv_func_nonposix_getgrgid_r)
if test "$ac_cv_func_nonposix_getgrgid_r" = yes; then
AC_DEFINE(HAVE_NONPOSIX_GETGRGID_R,1,
[Have non-POSIX function getgrgid_r])
fi
fi
LIBS="$G_THREAD_LIBS $LIBS"
if test x"$have_threads" = xposix; then
glib_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES"
dnl we might grow sizeof(pthread_t) later on, so use a dummy name here
GLIB_SIZEOF([#include <pthread.h>], pthread_t, system_thread)
# This is not AC_CHECK_FUNC to also work with function
# name mangling in header files.
AC_MSG_CHECKING(for pthread_attr_setstacksize)
fi
LIBS="$G_THREAD_LIBS $LIBS"
if test x"$have_threads" = xposix; then
glib_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES"
dnl we might grow sizeof(pthread_t) later on, so use a dummy name here
GLIB_SIZEOF([#include <pthread.h>], pthread_t, system_thread)
# This is not AC_CHECK_FUNC to also work with function
# name mangling in header files.
AC_MSG_CHECKING(for pthread_attr_setstacksize)
AC_TRY_LINK([#include <pthread.h>],
[pthread_attr_t t; pthread_attr_setstacksize(&t,0)],
[AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE,1,
[Have function pthread_attr_setstacksize])],
[AC_MSG_RESULT(no)])
AC_MSG_CHECKING(for minimal/maximal thread priority)
if test x"$posix_priority_min" = x; then
AC_EGREP_CPP(PX_PRIO_MIN,[#include <pthread.h>
PX_PRIO_MIN],,[
posix_priority_min=PX_PRIO_MIN
posix_priority_max=PX_PRIO_MAX])
fi
if test x"$posix_priority_min" = x; then
# AIX
AC_EGREP_CPP(PTHREAD_PRIO_MIN,[#include <pthread.h>
PTHREAD_PRIO_MIN],,[
posix_priority_min=PTHREAD_PRIO_MIN
posix_priority_max=PTHREAD_PRIO_MAX])
fi
if test x"$posix_priority_min" = x; then
AC_EGREP_CPP(PRI_OTHER_MIN,[#include <pthread.h>
PRI_OTHER_MIN],,[
posix_priority_min=PRI_OTHER_MIN
posix_priority_max=PRI_OTHER_MAX])
fi
if test x"$posix_priority_min" = x; then
AC_MSG_RESULT(none found)
AC_MSG_WARN($POSIX_NO_PRIORITIES)
posix_priority_min=-1
posix_priority_max=-1
else
AC_MSG_RESULT($posix_priority_min/$posix_priority_max)
AC_MSG_CHECKING(for pthread_setschedparam)
AC_TRY_LINK([#include <pthread.h>],
[pthread_attr_t t; pthread_attr_setstacksize(&t,0)],
[AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE,1,
[Have function pthread_attr_setstacksize])],
[AC_MSG_RESULT(no)])
AC_MSG_CHECKING(for minimal/maximal thread priority)
if test x"$posix_priority_min" = x; then
AC_EGREP_CPP(PX_PRIO_MIN,[#include <pthread.h>
PX_PRIO_MIN],,[
posix_priority_min=PX_PRIO_MIN
posix_priority_max=PX_PRIO_MAX])
fi
if test x"$posix_priority_min" = x; then
# AIX
AC_EGREP_CPP(PTHREAD_PRIO_MIN,[#include <pthread.h>
PTHREAD_PRIO_MIN],,[
posix_priority_min=PTHREAD_PRIO_MIN
posix_priority_max=PTHREAD_PRIO_MAX])
fi
if test x"$posix_priority_min" = x; then
AC_EGREP_CPP(PRI_OTHER_MIN,[#include <pthread.h>
PRI_OTHER_MIN],,[
posix_priority_min=PRI_OTHER_MIN
posix_priority_max=PRI_OTHER_MAX])
fi
if test x"$posix_priority_min" = x; then
AC_MSG_RESULT(none found)
AC_MSG_WARN($POSIX_NO_PRIORITIES)
posix_priority_min=-1
posix_priority_max=-1
else
AC_MSG_RESULT($posix_priority_min/$posix_priority_max)
AC_MSG_CHECKING(for pthread_setschedparam)
AC_TRY_LINK([#include <pthread.h>],
[pthread_t t; pthread_setschedparam(t, 0, NULL)],
[AC_MSG_RESULT(yes)
AC_DEFINE_UNQUOTED(POSIX_MIN_PRIORITY,$posix_priority_min,[Minimum POSIX RT priority])
AC_DEFINE_UNQUOTED(POSIX_MAX_PRIORITY,$posix_priority_max,[Maximum POSIX RT priority])],
[AC_MSG_RESULT(no)
AC_MSG_WARN($POSIX_NO_PRIORITIES)])
fi
posix_yield_func=none
AC_MSG_CHECKING(for posix yield function)
for yield_func in sched_yield pthread_yield_np pthread_yield \
thr_yield; do
AC_TRY_LINK([#include <pthread.h>],
[$yield_func()],
[posix_yield_func="$yield_func"
break])
done
if test x"$posix_yield_func" = xnone; then
AC_MSG_RESULT(none found)
AC_MSG_WARN($POSIX_NO_YIELD)
posix_yield_func="g_usleep(1000)"
else
AC_MSG_RESULT($posix_yield_func)
posix_yield_func="$posix_yield_func()"
fi
AC_DEFINE_UNQUOTED(POSIX_YIELD_FUNC,$posix_yield_func,[The POSIX RT yield function])
CPPFLAGS="$glib_save_CPPFLAGS"
elif test x"$have_threads" = xwin32; then
# It's a pointer to a private struct
GLIB_SIZEOF(,struct _GThreadData *, system_thread)
[pthread_t t; pthread_setschedparam(t, 0, NULL)],
[AC_MSG_RESULT(yes)
AC_DEFINE_UNQUOTED(POSIX_MIN_PRIORITY,$posix_priority_min,[Minimum POSIX RT priority])
AC_DEFINE_UNQUOTED(POSIX_MAX_PRIORITY,$posix_priority_max,[Maximum POSIX RT priority])],
[AC_MSG_RESULT(no)
AC_MSG_WARN($POSIX_NO_PRIORITIES)])
fi
posix_yield_func=none
AC_MSG_CHECKING(for posix yield function)
for yield_func in sched_yield pthread_yield_np pthread_yield \
thr_yield; do
AC_TRY_LINK([#include <pthread.h>],
[$yield_func()],
[posix_yield_func="$yield_func"
break])
done
if test x"$posix_yield_func" = xnone; then
AC_MSG_RESULT(none found)
AC_MSG_WARN($POSIX_NO_YIELD)
posix_yield_func="g_usleep(1000)"
else
AC_MSG_RESULT($posix_yield_func)
posix_yield_func="$posix_yield_func()"
fi
AC_DEFINE_UNQUOTED(POSIX_YIELD_FUNC,$posix_yield_func,[The POSIX RT yield function])
CPPFLAGS="$glib_save_CPPFLAGS"
elif test x"$have_threads" = xwin32; then
# It's a pointer to a private struct
GLIB_SIZEOF(,struct _GThreadData *, system_thread)
fi
LIBS="$glib_save_LIBS"
LIBS="$glib_save_LIBS"
# now spit out all the warnings.
if test "$ac_cv_func_posix_getpwuid_r" != "yes" &&
test "$ac_cv_func_nonposix_getpwuid_r" != "yes"; then
AC_MSG_WARN($FUNC_NO_GETPWUID_R)
fi
if test "$ac_cv_func_localtime_r" != "yes"; then
AC_MSG_WARN($FUNC_NO_LOCALTIME_R)
fi
fi
# now spit out all the warnings.
if test "$ac_cv_func_posix_getpwuid_r" != "yes" &&
test "$ac_cv_func_nonposix_getpwuid_r" != "yes"; then
AC_MSG_WARN($FUNC_NO_GETPWUID_R)
fi
if test "$ac_cv_func_localtime_r" != "yes"; then
AC_MSG_WARN($FUNC_NO_LOCALTIME_R)
fi
if test x"$glib_cv_sizeof_system_thread" = x; then
# use a pointer as a fallback.
@ -2468,9 +2440,8 @@ case $host in
;;
esac
AM_CONDITIONAL(HAVE_THREADS, [test "$have_threads" != "none"])
AC_DEFINE_UNQUOTED(G_THREAD_SOURCE,"gthread-$have_threads.c",
[Source file containing theread implementation])
[Source file containing thread implementation])
AC_SUBST(G_THREAD_CFLAGS)
AC_SUBST(G_THREAD_LIBS)
AC_SUBST(G_THREAD_LIBS_FOR_GTHREAD)
@ -3301,7 +3272,7 @@ _______EOF
echo >>$outfile
if test x$g_mutex_has_default = xyes; then
cat >>$outfile <<_______EOF
$g_enable_threads_def G_THREADS_ENABLED
#define G_THREADS_ENABLED
#define G_THREADS_IMPL_$g_threads_impl_def
typedef struct _GStaticMutex GStaticMutex;
struct _GStaticMutex
@ -3321,7 +3292,7 @@ struct _GStaticMutex
_______EOF
else
cat >>$outfile <<_______EOF
$g_enable_threads_def G_THREADS_ENABLED
#define G_THREADS_ENABLED
#define G_THREADS_IMPL_$g_threads_impl_def
typedef struct _GMutex* GStaticMutex;
#define G_STATIC_MUTEX_INIT NULL
@ -3715,11 +3686,6 @@ g_stack_grows=$glib_cv_stack_grows
g_have_eilseq=$have_eilseq
case x$have_threads in
xno) g_enable_threads_def="#undef";;
*) g_enable_threads_def="#define";;
esac
g_threads_impl_def=$g_threads_impl
g_mutex_has_default="$mutex_has_default"

View File

@ -33,15 +33,11 @@ TESTS = abicheck.sh
endif
endif
if HAVE_THREADS
THREAD_FLAGS=-DG_THREADS_MANDATORY
endif
AM_CPPFLAGS = \
-DG_LOG_DOMAIN=\"GLib-GIO\" \
$(gmodule_INCLUDES) \
$(GLIB_DEBUG_FLAGS) \
$(THREAD_FLAGS) \
-DG_THREADS_MANDATORY \
-DG_DISABLE_DEPRECATED \
-DGIO_COMPILATION \
-DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\"

View File

@ -188,7 +188,6 @@ typedef enum
G_SOURCE_CAN_RECURSE = 1 << (G_HOOK_FLAG_USER_SHIFT + 1)
} GSourceFlags;
#ifdef G_THREADS_ENABLED
typedef struct _GMainWaiter GMainWaiter;
struct _GMainWaiter
@ -196,7 +195,6 @@ struct _GMainWaiter
GCond *cond;
GMutex *mutex;
};
#endif
typedef struct _GMainDispatch GMainDispatch;
@ -212,7 +210,6 @@ gboolean _g_main_poll_debug = FALSE;
struct _GMainContext
{
#ifdef G_THREADS_ENABLED
/* The following lock is used for both the list of sources
* and the list of poll records
*/
@ -221,7 +218,6 @@ struct _GMainContext
GThread *owner;
guint owner_count;
GSList *waiters;
#endif
gint ref_count;
@ -237,7 +233,6 @@ struct _GMainContext
GPollFD *cached_poll_array;
guint cached_poll_array_size;
#ifdef G_THREADS_ENABLED
GWakeup *wakeup;
GPollFD wake_up_rec;
@ -245,7 +240,6 @@ struct _GMainContext
/* Flag indicating whether the set of fd's changed during a poll */
gboolean poll_changed;
#endif /* G_THREADS_ENABLED */
GPollFunc poll_func;
@ -312,15 +306,9 @@ struct _GSourcePrivate
GSource *parent_source;
};
#ifdef G_THREADS_ENABLED
#define LOCK_CONTEXT(context) g_static_mutex_lock (&context->mutex)
#define UNLOCK_CONTEXT(context) g_static_mutex_unlock (&context->mutex)
#define G_THREAD_SELF g_thread_self ()
#else
#define LOCK_CONTEXT(context) (void)0
#define UNLOCK_CONTEXT(context) (void)0
#define G_THREAD_SELF NULL
#endif
#define SOURCE_DESTROYED(source) (((source)->flags & G_HOOK_FLAG_ACTIVE) == 0)
#define SOURCE_BLOCKED(source) (((source)->flags & G_HOOK_FLAG_IN_CALL) != 0 && \
@ -515,16 +503,13 @@ g_main_context_unref (GMainContext *context)
source = next;
}
#ifdef G_THREADS_ENABLED
g_static_mutex_free (&context->mutex);
#endif
g_ptr_array_free (context->pending_dispatches, TRUE);
g_free (context->cached_poll_array);
poll_rec_list_free (context, context->poll_records);
#ifdef G_THREADS_ENABLED
if (g_thread_supported())
g_wakeup_free (context->wakeup);
@ -534,12 +519,10 @@ g_main_context_unref (GMainContext *context)
if (context->cond != NULL)
g_cond_free (context->cond);
#endif
g_free (context);
}
#ifdef G_THREADS_ENABLED
static void
g_main_context_init_pipe (GMainContext *context)
{
@ -562,7 +545,6 @@ _g_main_thread_init (void)
g_slist_free (main_contexts_without_pipe);
main_contexts_without_pipe = NULL;
}
#endif /* G_THREADS_ENABLED */
/**
* g_main_context_new:
@ -589,12 +571,10 @@ g_main_context_new (void)
}
#endif
#ifdef G_THREADS_ENABLED
g_static_mutex_init (&context->mutex);
context->owner = NULL;
context->waiters = NULL;
#endif
context->ref_count = 1;
@ -612,13 +592,11 @@ g_main_context_new (void)
context->time_is_fresh = FALSE;
context->real_time_is_fresh = FALSE;
#ifdef G_THREADS_ENABLED
if (g_thread_supported ())
g_main_context_init_pipe (context);
else
main_contexts_without_pipe = g_slist_prepend (main_contexts_without_pipe,
context);
#endif
G_LOCK (main_context_list);
main_context_list = g_slist_append (main_context_list, context);
@ -955,10 +933,8 @@ g_source_attach (GSource *source,
result = g_source_attach_unlocked (source, context);
#ifdef G_THREADS_ENABLED
/* Now wake up the main loop if it is waiting in the poll() */
g_main_context_wakeup_unlocked (context);
#endif
UNLOCK_CONTEXT (context);
@ -2518,7 +2494,6 @@ next_valid_source (GMainContext *context,
gboolean
g_main_context_acquire (GMainContext *context)
{
#ifdef G_THREADS_ENABLED
gboolean result = FALSE;
GThread *self = G_THREAD_SELF;
@ -2542,9 +2517,6 @@ g_main_context_acquire (GMainContext *context)
UNLOCK_CONTEXT (context);
return result;
#else /* !G_THREADS_ENABLED */
return TRUE;
#endif /* G_THREADS_ENABLED */
}
/**
@ -2559,7 +2531,6 @@ g_main_context_acquire (GMainContext *context)
void
g_main_context_release (GMainContext *context)
{
#ifdef G_THREADS_ENABLED
if (context == NULL)
context = g_main_context_default ();
@ -2588,7 +2559,6 @@ g_main_context_release (GMainContext *context)
}
UNLOCK_CONTEXT (context);
#endif /* G_THREADS_ENABLED */
}
/**
@ -2611,7 +2581,6 @@ g_main_context_wait (GMainContext *context,
GCond *cond,
GMutex *mutex)
{
#ifdef G_THREADS_ENABLED
gboolean result = FALSE;
GThread *self = G_THREAD_SELF;
gboolean loop_internal_waiter;
@ -2658,9 +2627,6 @@ g_main_context_wait (GMainContext *context,
UNLOCK_CONTEXT (context);
return result;
#else /* !G_THREADS_ENABLED */
return TRUE;
#endif /* G_THREADS_ENABLED */
}
/**
@ -2700,7 +2666,6 @@ g_main_context_prepare (GMainContext *context,
return FALSE;
}
#ifdef G_THREADS_ENABLED
if (context->poll_waiting)
{
g_warning("g_main_context_prepare(): main loop already active in another thread");
@ -2709,7 +2674,6 @@ g_main_context_prepare (GMainContext *context,
}
context->poll_waiting = TRUE;
#endif /* G_THREADS_ENABLED */
#if 0
/* If recursing, finish up current dispatch, before starting over */
@ -2855,9 +2819,7 @@ g_main_context_query (GMainContext *context,
n_poll++;
}
#ifdef G_THREADS_ENABLED
context->poll_changed = FALSE;
#endif
if (timeout)
{
@ -2907,7 +2869,6 @@ g_main_context_check (GMainContext *context,
return FALSE;
}
#ifdef G_THREADS_ENABLED
if (!context->poll_waiting)
g_wakeup_acknowledge (context->wakeup);
@ -2922,7 +2883,6 @@ g_main_context_check (GMainContext *context,
UNLOCK_CONTEXT (context);
return FALSE;
}
#endif /* G_THREADS_ENABLED */
pollrec = context->poll_records;
i = 0;
@ -3029,7 +2989,6 @@ g_main_context_iterate (GMainContext *context,
UNLOCK_CONTEXT (context);
#ifdef G_THREADS_ENABLED
if (!g_main_context_acquire (context))
{
gboolean got_ownership;
@ -3053,7 +3012,6 @@ g_main_context_iterate (GMainContext *context,
}
else
LOCK_CONTEXT (context);
#endif /* G_THREADS_ENABLED */
if (!context->cached_poll_array)
{
@ -3088,9 +3046,7 @@ g_main_context_iterate (GMainContext *context,
if (dispatch)
g_main_context_dispatch (context);
#ifdef G_THREADS_ENABLED
g_main_context_release (context);
#endif /* G_THREADS_ENABLED */
LOCK_CONTEXT (context);
@ -3241,7 +3197,6 @@ g_main_loop_run (GMainLoop *loop)
g_return_if_fail (loop != NULL);
g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0);
#ifdef G_THREADS_ENABLED
if (!g_main_context_acquire (loop->context))
{
gboolean got_ownership = FALSE;
@ -3282,7 +3237,6 @@ g_main_loop_run (GMainLoop *loop)
}
else
LOCK_CONTEXT (loop->context);
#endif /* G_THREADS_ENABLED */
if (loop->context->in_check_or_prepare)
{
@ -3298,9 +3252,7 @@ g_main_loop_run (GMainLoop *loop)
UNLOCK_CONTEXT (loop->context);
#ifdef G_THREADS_ENABLED
g_main_context_release (loop->context);
#endif /* G_THREADS_ENABLED */
g_main_loop_unref (loop);
}
@ -3325,10 +3277,8 @@ g_main_loop_quit (GMainLoop *loop)
loop->is_running = FALSE;
g_main_context_wakeup_unlocked (loop->context);
#ifdef G_THREADS_ENABLED
if (loop->context->cond)
g_cond_broadcast (loop->context->cond);
#endif /* G_THREADS_ENABLED */
UNLOCK_CONTEXT (loop->context);
}
@ -3523,12 +3473,10 @@ g_main_context_add_poll_unlocked (GMainContext *context,
context->n_poll_records++;
#ifdef G_THREADS_ENABLED
context->poll_changed = TRUE;
/* Now wake up the main loop if it is waiting in the poll() */
g_main_context_wakeup_unlocked (context);
#endif
}
/**
@ -3587,12 +3535,10 @@ g_main_context_remove_poll_unlocked (GMainContext *context,
pollrec = nextrec;
}
#ifdef G_THREADS_ENABLED
context->poll_changed = TRUE;
/* Now wake up the main loop if it is waiting in the poll() */
g_main_context_wakeup_unlocked (context);
#endif
}
/**
@ -3754,13 +3700,11 @@ _g_main_wake_up_all_contexts (void)
static void
g_main_context_wakeup_unlocked (GMainContext *context)
{
#ifdef G_THREADS_ENABLED
if (g_thread_supported() && context->poll_waiting)
{
context->poll_waiting = FALSE;
g_wakeup_signal (context->wakeup);
}
#endif
}
/**
@ -3804,13 +3748,9 @@ g_main_context_is_owner (GMainContext *context)
if (!context)
context = g_main_context_default ();
#ifdef G_THREADS_ENABLED
LOCK_CONTEXT (context);
is_owner = context->owner == G_THREAD_SELF;
UNLOCK_CONTEXT (context);
#else
is_owner = TRUE;
#endif
return is_owner;
}

View File

@ -136,12 +136,9 @@
/**
* G_THREADS_ENABLED:
*
* This macro is defined if GLib was compiled with thread support. This
* does not necessarily mean that there is a thread implementation
* available, but it does mean that the infrastructure is in place and
* that once you provide a thread implementation to g_thread_init(),
* GLib will be multi-thread safe. If #G_THREADS_ENABLED is not
* defined, then Glib is not, and cannot be, multi-thread safe.
* This macro is defined, for backward compatibility, to indicate that
* GLib has been compiled with thread support. As of glib 2.28, it is
* always defined.
**/
/**
@ -886,7 +883,6 @@ G_LOCK_DEFINE_STATIC (g_thread);
/* Initialisation {{{1 ---------------------------------------------------- */
#ifdef G_THREADS_ENABLED
/**
* g_thread_init:
* @vtable: a function table of type #GThreadFunctions, that provides
@ -962,7 +958,6 @@ g_thread_init_glib (void)
_g_win32_thread_init ();
#endif
}
#endif /* G_THREADS_ENABLED */
/* The following sections implement: GOnce, GStaticMutex, GStaticRecMutex,
* GStaticPrivate,

View File

@ -197,7 +197,7 @@ GMutex* g_static_mutex_get_mutex_impl (GMutex **mutex);
(cond, mutex, abs_time, G_MUTEX_DEBUG_MAGIC, G_STRLOC) : TRUE)
#endif /* G_ERRORCHECK_MUTEXES */
#if defined(G_THREADS_ENABLED) && defined(G_THREADS_MANDATORY)
#if defined(G_THREADS_MANDATORY)
#define g_thread_supported() 1
#else
#define g_thread_supported() (g_threads_got_initialized)
@ -362,45 +362,36 @@ g_once_init_enter (volatile gsize *value_location)
*/
extern void glib_dummy_decl (void);
#define G_LOCK_NAME(name) g__ ## name ## _lock
#ifdef G_THREADS_ENABLED
# define G_LOCK_DEFINE_STATIC(name) static G_LOCK_DEFINE (name)
# define G_LOCK_DEFINE(name) \
GStaticMutex G_LOCK_NAME (name) = G_STATIC_MUTEX_INIT
# define G_LOCK_EXTERN(name) extern GStaticMutex G_LOCK_NAME (name)
#define G_LOCK_DEFINE_STATIC(name) static G_LOCK_DEFINE (name)
#define G_LOCK_DEFINE(name) \
GStaticMutex G_LOCK_NAME (name) = G_STATIC_MUTEX_INIT
#define G_LOCK_EXTERN(name) extern GStaticMutex G_LOCK_NAME (name)
# ifdef G_DEBUG_LOCKS
# define G_LOCK(name) G_STMT_START{ \
g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
"file %s: line %d (%s): locking: %s ", \
__FILE__, __LINE__, G_STRFUNC, \
#name); \
g_static_mutex_lock (&G_LOCK_NAME (name)); \
}G_STMT_END
# define G_UNLOCK(name) G_STMT_START{ \
g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
"file %s: line %d (%s): unlocking: %s ", \
__FILE__, __LINE__, G_STRFUNC, \
#name); \
g_static_mutex_unlock (&G_LOCK_NAME (name)); \
}G_STMT_END
# define G_TRYLOCK(name) \
(g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
"file %s: line %d (%s): try locking: %s ", \
__FILE__, __LINE__, G_STRFUNC, \
#name), g_static_mutex_trylock (&G_LOCK_NAME (name)))
# else /* !G_DEBUG_LOCKS */
# define G_LOCK(name) g_static_mutex_lock (&G_LOCK_NAME (name))
# define G_UNLOCK(name) g_static_mutex_unlock (&G_LOCK_NAME (name))
# define G_TRYLOCK(name) g_static_mutex_trylock (&G_LOCK_NAME (name))
# endif /* !G_DEBUG_LOCKS */
#else /* !G_THREADS_ENABLED */
# define G_LOCK_DEFINE_STATIC(name) extern void glib_dummy_decl (void)
# define G_LOCK_DEFINE(name) extern void glib_dummy_decl (void)
# define G_LOCK_EXTERN(name) extern void glib_dummy_decl (void)
# define G_LOCK(name)
# define G_UNLOCK(name)
# define G_TRYLOCK(name) (TRUE)
#endif /* !G_THREADS_ENABLED */
#ifdef G_DEBUG_LOCKS
# define G_LOCK(name) G_STMT_START{ \
g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
"file %s: line %d (%s): locking: %s ", \
__FILE__, __LINE__, G_STRFUNC, \
#name); \
g_static_mutex_lock (&G_LOCK_NAME (name)); \
}G_STMT_END
# define G_UNLOCK(name) G_STMT_START{ \
g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
"file %s: line %d (%s): unlocking: %s ", \
__FILE__, __LINE__, G_STRFUNC, \
#name); \
g_static_mutex_unlock (&G_LOCK_NAME (name)); \
}G_STMT_END
# define G_TRYLOCK(name) \
(g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \
"file %s: line %d (%s): try locking: %s ", \
__FILE__, __LINE__, G_STRFUNC, \
#name), g_static_mutex_trylock (&G_LOCK_NAME (name)))
#else /* !G_DEBUG_LOCKS */
# define G_LOCK(name) g_static_mutex_lock (&G_LOCK_NAME (name))
# define G_UNLOCK(name) g_static_mutex_unlock (&G_LOCK_NAME (name))
# define G_TRYLOCK(name) g_static_mutex_trylock (&G_LOCK_NAME (name))
#endif /* !G_DEBUG_LOCKS */
G_END_DECLS

View File

@ -9,15 +9,11 @@ SUBDIRS = . tests
BUILT_SOURCES=
CLEANFILES=
if HAVE_THREADS
THREAD_FLAGS=-DG_THREADS_MANDATORY
endif
AM_CPPFLAGS = \
-DG_LOG_DOMAIN=\"GLib-GObject\" \
$(gthread_INCLUDES) \
$(GLIB_DEBUG_FLAGS) \
$(THREAD_FLAGS) \
-DG_THREADS_MANDATORY \
-DG_DISABLE_DEPRECATED \
-DGOBJECT_COMPILATION

View File

@ -4261,10 +4261,8 @@ g_type_init_with_debug_flags (GTypeDebugFlags debug_flags)
TypeNode *node;
volatile GType votype;
#ifdef G_THREADS_ENABLED
if (!g_thread_get_initialized())
g_thread_init (NULL);
#endif
G_LOCK (type_init_lock);

View File

@ -36,8 +36,6 @@
#include "glib.h"
#include "gthreadprivate.h"
#ifdef G_THREADS_ENABLED
static GSystemThread zero_thread; /* This is initialized to all zero */
static gboolean thread_system_already_initialized = FALSE;
static gint g_thread_priority_map [G_THREAD_PRIORITY_URGENT + 1];
@ -359,19 +357,3 @@ g_thread_init (GThreadFunctions* init)
g_thread_init_glib ();
}
#else /* !G_THREADS_ENABLED */
void
g_thread_init (GThreadFunctions* init)
{
g_error ("GLib thread support is disabled.");
}
void
g_thread_init_with_errorcheck_mutexes (GThreadFunctions* init)
{
g_error ("GLib thread support is disabled.");
}
#endif /* !G_THREADS_ENABLED */

View File

@ -178,7 +178,6 @@ basic_tests (void)
int
main (int argc, char *argv[])
{
#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
gint i;
gint max_threads = MAX_THREADS;
gint max_unused_threads = MAX_THREADS;
@ -239,7 +238,6 @@ main (int argc, char *argv[])
main_loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (main_loop);
#endif
return EXIT_SUCCESS;
}

View File

@ -163,10 +163,7 @@ main (int argc, char *argv[])
exit (STILL_ACTIVE);
}
#endif
/* Only run the test, if threads are enabled and a default thread
* implementation is available.
*/
#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
#ifdef TEST_THREAD
g_thread_init (NULL);
#endif
@ -201,6 +198,5 @@ main (int argc, char *argv[])
return 1;
}
#endif
return 0;
}

View File

@ -402,9 +402,6 @@ int
main (int argc,
char *argv[])
{
/* Only run the test, if threads are enabled and a default thread
implementation is available */
#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
gint i;
g_thread_init (NULL);
@ -437,6 +434,5 @@ main (int argc,
g_main_loop_run (main_loop);
g_main_loop_unref (main_loop);
#endif
return 0;
}

View File

@ -384,9 +384,6 @@ int
main (int argc,
char *argv[])
{
/* Only run the test, if threads are enabled and a default thread
implementation is available */
#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
g_thread_init (NULL);
run_all_tests ();
@ -397,6 +394,5 @@ main (int argc,
g_thread_use_default_impl = FALSE;
run_all_tests ();
#endif
return 0;
}

View File

@ -466,10 +466,6 @@ test_check_start_and_stop (gpointer user_data)
int
main (int argc, char *argv[])
{
/* Only run the test, if threads are enabled and a default thread
implementation is available */
#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
g_thread_init (NULL);
DEBUG_MSG (("Starting... (in one second)"));
@ -477,7 +473,6 @@ main (int argc, char *argv[])
main_loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (main_loop);
#endif
return 0;
}