From: Andy Wingo Date: Mon, 28 Jan 2002 01:29:10 +0000 (+0000) Subject: the cothreads library now builds, but it's untested the public api is in cothreads.h X-Git-Tag: RELEASE-0_3_2-DOBDAY~44 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=45a4d305fd32d34a98e57bf09b0c5b9ba651946f;p=platform%2Fupstream%2Fgstreamer.git the cothreads library now builds, but it's untested the public api is in cothreads.h Original commit message from CVS: the cothreads library now builds, but it's untested the public api is in cothreads.h --- diff --git a/gst/cothreads/Makefile.am b/gst/cothreads/Makefile.am index 2f45005..3014df1 100644 --- a/gst/cothreads/Makefile.am +++ b/gst/cothreads/Makefile.am @@ -4,12 +4,16 @@ # ``UNIX -- where you can do anything # in two keystrokes, or less...'' -noinst_LTLIBRARIES = libpth-mctx.la +noinst_LTLIBRARIES = libpth-mctx.la libgstcothreads.la libpth_mctx_la_SOURCES = pth_mctx.c pth_p.h pth_vers.c pth.h pth_acdef.h pth_acmac.h +libgstcothreads_la_SOURCES = cothreads.c cothread-stack.c cothreads.h +libgstcothreads_la_LIBADD = libpth-mctx.la $(GLIB_LIBS) +libgstcothreads_la_CFLAGS = $(GLIB_CFLAGS) + noinst_PROGRAMS = test-pth test-pth-pthreads test-pthreads test-pth-pthreads2 -noinst_HEADERS = linuxthreads.h +noinst_HEADERS = linuxthreads.h cothreads-private.h cothreads.h test_pth_LDADD = libpth-mctx.la test_pth_pthreads_LDADD = libpth-mctx.la -lpthread diff --git a/gst/cothreads/acinclude.m4 b/gst/cothreads/acinclude.m4 index f54cb34..798f409 100644 --- a/gst/cothreads/acinclude.m4 +++ b/gst/cothreads/acinclude.m4 @@ -1,3 +1,452 @@ +# Configure paths for GLIB +# Owen Taylor 97-11-3 + +dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if "gmodule" or +dnl gthread is specified in MODULES, pass to glib-config +dnl +AC_DEFUN(AM_PATH_GLIB, +[dnl +dnl Get the cflags and libraries from the glib-config script +dnl +AC_ARG_WITH(glib-prefix,[ --with-glib-prefix=PFX Prefix where GLIB is installed (optional)], + glib_config_prefix="$withval", glib_config_prefix="") +AC_ARG_WITH(glib-exec-prefix,[ --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)], + glib_config_exec_prefix="$withval", glib_config_exec_prefix="") +AC_ARG_ENABLE(glibtest, [ --disable-glibtest Do not try to compile and run a test GLIB program], + , enable_glibtest=yes) + + if test x$glib_config_exec_prefix != x ; then + glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix" + if test x${GLIB_CONFIG+set} != xset ; then + GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config + fi + fi + if test x$glib_config_prefix != x ; then + glib_config_args="$glib_config_args --prefix=$glib_config_prefix" + if test x${GLIB_CONFIG+set} != xset ; then + GLIB_CONFIG=$glib_config_prefix/bin/glib-config + fi + fi + + for module in . $4 + do + case "$module" in + gmodule) + glib_config_args="$glib_config_args gmodule" + ;; + gthread) + glib_config_args="$glib_config_args gthread" + ;; + esac + done + + AC_PATH_PROG(GLIB_CONFIG, glib-config, no) + min_glib_version=ifelse([$1], ,0.99.7,$1) + AC_MSG_CHECKING(for GLIB - version >= $min_glib_version) + no_glib="" + if test "$GLIB_CONFIG" = "no" ; then + no_glib=yes + else + GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags` + GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs` + glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_glibtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$GLIB_LIBS $LIBS" +dnl +dnl Now check if the installed GLIB is sufficiently new. (Also sanity +dnl checks the results of glib-config to some extent +dnl + rm -f conf.glibtest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.glibtest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_glib_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_glib_version"); + exit(1); + } + + if ((glib_major_version != $glib_config_major_version) || + (glib_minor_version != $glib_config_minor_version) || + (glib_micro_version != $glib_config_micro_version)) + { + printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", + $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, + glib_major_version, glib_minor_version, glib_micro_version); + printf ("*** was found! If glib-config was correct, then it is best\n"); + printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n"); + printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } + else if ((glib_major_version != GLIB_MAJOR_VERSION) || + (glib_minor_version != GLIB_MINOR_VERSION) || + (glib_micro_version != GLIB_MICRO_VERSION)) + { + printf("*** GLIB header files (version %d.%d.%d) do not match\n", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + glib_major_version, glib_minor_version, glib_micro_version); + } + else + { + if ((glib_major_version > major) || + ((glib_major_version == major) && (glib_minor_version > minor)) || + ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n", + glib_major_version, glib_minor_version, glib_micro_version); + printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GLIB is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the glib-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n"); + printf("*** correct copy of glib-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_glib" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GLIB_CONFIG" = "no" ; then + echo "*** The glib-config script installed by GLIB could not be found" + echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GLIB_CONFIG environment variable to the" + echo "*** full path to glib-config." + else + if test -f conf.glibtest ; then + : + else + echo "*** Could not run GLIB test program, checking why..." + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$LIBS $GLIB_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GLIB or finding the wrong" + echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GLIB was incorrectly installed" + echo "*** or that you have moved GLIB since it was installed. In the latter case, you" + echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GLIB_CFLAGS="" + GLIB_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GLIB_CFLAGS) + AC_SUBST(GLIB_LIBS) + rm -f conf.glibtest +]) +dnl Perform a check for a feature for GStreamer +dnl Richard Boulton +dnl Thomas Vander Stichele added useful stuff +dnl Last modification: 25/06/2001 +dnl GST_CHECK_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION, +dnl DEPENDENT-PLUGINS, TEST-FOR-FEATURE, +dnl DISABLE-BY-DEFAULT, ACTION-IF-USE, ACTION-IF-NOTUSE) +dnl +dnl This macro adds a command line argument to enable the user to enable +dnl or disable a feature, and if the feature is enabled, performs a supplied +dnl test to check if the feature is available. +dnl +dnl The test should define HAVE_ to "yes" or "no" depending +dnl on whether the feature is available. +dnl +dnl The macro will set USE_ to "yes" or "no" depending on +dnl whether the feature is to be used. +dnl Thomas changed this, so that when USE_ was already set +dnl to no, then it stays that way. +dnl +dnl The macro will call AM_CONDITIONAL(USE_<, ...) to allow +dnl the feature to control what is built in Makefile.ams. If you want +dnl additional actions resulting from the test, you can add them with the +dnl ACTION-IF-USE and ACTION-IF-NOTUSE parameters. +dnl +dnl FEATURE-NAME is the name of the feature, and should be in +dnl purely upper case characters. +dnl FEATURE-DESCRIPTION is used to describe the feature in help text for +dnl the command line argument. +dnl DEPENDENT-PLUGINS lists any plugins which depend on this feature. +dnl TEST-FOR-FEATURE is a test which sets HAVE_ to "yes" +dnl or "no" depending on whether the feature is +dnl available. +dnl DISABLE-BY-DEFAULT if "disabled", the feature is disabled by default, +dnl if any other value, the feature is enabled by default. +dnl ACTION-IF-USE any extra actions to perform if the feature is to be +dnl used. +dnl ACTION-IF-NOTUSE any extra actions to perform if the feature is not to +dnl be used. +dnl +dnl +dnl thomas : +dnl we also added a history. +dnl GST_PLUGINS_YES will contain all plugins to be built +dnl that were checked through GST_CHECK_FEATURE +dnl GST_PLUGINS_NO will contain those that won't be built + +AC_DEFUN(GST_CHECK_FEATURE, +[dnl +builtin(define, [gst_endisable], ifelse($5, [disabled], [enable], [disable]))dnl +dnl if it is set to NO, then don't even consider it for building +NOUSE= +if test "x$USE_[$1]" = "xno"; then + NOUSE="yes" +fi +AC_ARG_ENABLE(translit([$1], A-Z, a-z), + [ ]builtin(format, --%-26s gst_endisable %s, gst_endisable-translit([$1], A-Z, a-z), [$2]ifelse([$3],,,: [$3])), + [ case "${enableval}" in + yes) USE_[$1]=yes;; + no) USE_[$1]=no;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;; + esac], + [ USE_$1=]ifelse($5, [disabled], [no], [yes])) dnl DEFAULT + +dnl *** set it back to no if it was preset to no +if test "x$NOUSE" = "xyes"; then + USE_[$1]="no" + AC_MSG_WARN(*** $3 pre-configured not to be built) +fi +NOUSE= + +dnl *** If it's enabled + +if test x$USE_[$1] = xyes; then + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + HAVE_[$1]=no + $4 + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + dnl If it isn't found, unset USE_[$1] + if test x$HAVE_[$1] = xno; then + USE_[$1]=no + fi +fi +dnl *** Warn if it's disabled or not found +if test x$USE_[$1] = xyes; then + ifelse([$6], , :, [$6]) + GST_PLUGINS_YES="$GST_PLUGINS_YES \n\t[$3]" +else + ifelse([$3], , :, [AC_MSG_NOTICE( +These plugins will not be built: [$3] +)]) + GST_PLUGINS_NO="$GST_PLUGINS_NO \n\t[$3]" + ifelse([$7], , :, [$7]) +fi +dnl *** Define the conditional as appropriate +AM_CONDITIONAL(USE_[$1], test x$USE_[$1] = xyes) +]) + +dnl Use a -config program which accepts --cflags and --libs parameters +dnl to set *_CFLAGS and *_LIBS and check existence of a feature. +dnl Richard Boulton +dnl Last modification: 26/06/2001 +dnl GST_CHECK_CONFIGPROG(FEATURE-NAME, CONFIG-PROG-FILENAME, MODULES) +dnl +dnl This check was written for GStreamer: it should be renamed and checked +dnl for portability if you decide to use it elsewhere. +dnl +AC_DEFUN(GST_CHECK_CONFIGPROG, +[ + AC_PATH_PROG([$1]_CONFIG, [$2], no) + if test x$[$1]_CONFIG = xno; then + [$1]_LIBS= + [$1]_CFLAGS= + HAVE_[$1]=no + else + [$1]_LIBS=`[$2] --libs [$3]` + [$1]_CFLAGS=`[$2] --cflags [$3]` + HAVE_[$1]=yes + fi + AC_SUBST([$1]_LIBS) + AC_SUBST([$1]_CFLAGS) +]) + +dnl Use AC_CHECK_LIB and AC_CHECK_HEADER to do both tests at once +dnl sets HAVE_module if we have it +dnl Richard Boulton +dnl Last modification: 26/06/2001 +dnl GST_CHECK_LIBHEADER(FEATURE-NAME, LIB NAME, LIB FUNCTION, EXTRA LD FLAGS, +dnl HEADER NAME, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND) +dnl +dnl This check was written for GStreamer: it should be renamed and checked +dnl for portability if you decide to use it elsewhere. +dnl +AC_DEFUN(GST_CHECK_LIBHEADER, +[ + AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no,[$4]) + if test "x$HAVE_[$1]" = "xyes"; then + AC_CHECK_HEADER([$5], :, HAVE_[$1]=no) + if test "x$HAVE_[$1]" = "xyes"; then + dnl execute what needs to be + ifelse([$6], , :, [$6]) + else + ifelse([$7], , :, [$7]) + fi + else + AC_MSG_WARN([$1] not found) + fi + AC_SUBST(HAVE_[$1]) +] +) + +dnl +dnl Add a subsystem --disable flag and all the necessary symbols and substitions +dnl +dnl GST_SUBSYSTEM_DISABLE(SYSNAME, [subsystem name]) +dnl +AC_DEFUN(GST_SUBSYSTEM_DISABLE, +[AC_ARG_ENABLE(translit([$1], A-Z, a-z), +[ ]builtin(format, --disable-%-17s disable %s, translit([$1], A-Z, a-z), $2), +[ case "${enableval}" in + yes) GST_DISABLE_[$1]=no ;; + no) GST_DISABLE_[$1]=yes ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;; + esac], +[GST_DISABLE_[$1]=no]) dnl Default value +if test x$GST_DISABLE_[$1] = xyes; then + AC_DEFINE(GST_DISABLE_[$1], 1, [Disable $2]) + GST_DISABLE_[$1]_DEFINE=-DGST_DISABLE_[$1] +fi +AM_CONDITIONAL(GST_DISABLE_[$1], test x$GST_DISABLE_[$1] = xyes) +AC_SUBST(GST_DISABLE_[$1]_DEFINE) +GST_SUBSYSTEM_DISABLE_DEFINES="$GST_SUBSYTEM_DISABLE_DEFINES $GST_DISABLE_[$1]_DEFINE" +]) +dnl Check for LinuxThreads +dnl COTHREADS_CHECK_LINUXTHREADS +dnl no arguments +AC_DEFUN([COTHREADS_CHECK_LINUXTHREADS], [ + AC_CACHE_CHECK([for LinuxThreads], + [cothreads_cv_linuxthreads], + [AC_EGREP_CPP(pthread_kill_other_threads_np, + [#include ], + [cothreads_cv_linuxthreads=yes], + [cothreads_cv_linuxthreads=no]) + ]) + if test $cothreads_cv_linuxthreads = yes; then + AC_DEFINE(HAVE_LINUXTHREADS,1,[if you have LinuxThreads]) + fi +]) + +dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +AC_DEFUN(PKG_CHECK_MODULES, [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + if ! $PKG_CONFIG --atleast-pkgconfig-version 0.7.0; then + echo "*** Your version of pkg-config is too old. You need version 0.7.0 or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + else + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + dnl ## dnl ## NGPT - Next Generation POSIX Threading dnl ## Copyright (c) 2001 IBM Corporation @@ -1763,19 +2212,3 @@ dnl # display results in detail AC_MSG_VERBOSE([$]$2) AC_MSG_VERBOSE([$]$3) ]) - -dnl Check for LinuxThreads -dnl COTHREADS_CHECK_LINUXTHREADS -dnl no arguments -AC_DEFUN([COTHREADS_CHECK_LINUXTHREADS], [ - AC_CACHE_CHECK([for LinuxThreads], - [cothreads_cv_linuxthreads], - [AC_EGREP_CPP(pthread_kill_other_threads_np, - [#include ], - [cothreads_cv_linuxthreads=yes], - [cothreads_cv_linuxthreads=no]) - ]) - if test $cothreads_cv_linuxthreads = yes; then - AC_DEFINE(HAVE_LINUXTHREADS,1,[if you have LinuxThreads]) - fi -]) diff --git a/gst/cothreads/autogen.sh b/gst/cothreads/autogen.sh index c40a42c..ba97e06 100755 --- a/gst/cothreads/autogen.sh +++ b/gst/cothreads/autogen.sh @@ -137,6 +137,9 @@ if test -z "$*"; then echo "to pass any to it, please specify them on the $0 command line." fi +echo "+ creating acinclude.m4" +cat m4/*.m4 > acinclude.m4 + echo "+ running aclocal ..." aclocal $ACLOCAL_FLAGS || { echo diff --git a/gst/cothreads/configure.ac b/gst/cothreads/configure.ac index 7cc6c27..6b25ae6 100644 --- a/gst/cothreads/configure.ac +++ b/gst/cothreads/configure.ac @@ -259,6 +259,34 @@ AC_MSG_VERBOSE([decided mctx method: $mctx_mth]) AC_MSG_VERBOSE([decided mctx dispatching: $mctx_dsp]) AC_MSG_VERBOSE([decided mctx stack setup: $mctx_stk]) +AC_MSG_PART(Checking for GLib) + +dnl Check for glib2 +translit(dnm, m, l) AM_CONDITIONAL(USE_GLIB2, true) +GST_CHECK_FEATURE(GLIB2, [use of glib-2.0 and GObject], , [ + PKG_CHECK_MODULES(GLIB2, glib-2.0 gthread-2.0, + HAVE_GLIB2=yes,HAVE_GLIB2=no) + GLIB_LIBS=$GLIB2_LIBS + GLIB_CFLAGS=$GLIB2_CFLAGS + AC_SUBST(GLIB_LIBS) + AC_SUBST(GLIB_CFLAGS) + # if we've gotten this far, the user has specifically asked that glib2 be + # used. if we have no glib2, that is an error. + if test "x$HAVE_GLIB2" = "xno"; then + AC_MSG_ERROR([no glib2 found, try --disable-glib2]) + fi +], enabled, [ +dnl AC_DEFINE(USE_GLIB2) +]) +dnl AC_SUBST(USE_GLIB2) + +if test x$USE_GLIB2 = xno; then + dnl Check for glib and gtk + AM_PATH_GLIB(1.2.0,, + AC_MSG_ERROR(Cannot find glib: Is glib-config in path?), + glib gmodule gthread) +fi + dnl ## Additional support for some special platform/compiler options case "$PLATFORM:$CC" in diff --git a/gst/cothreads/cothread-stack.c b/gst/cothreads/cothread-stack.c index efe6a4d..9e963ab 100644 --- a/gst/cothreads/cothread-stack.c +++ b/gst/cothreads/cothread-stack.c @@ -19,63 +19,83 @@ * Boston, MA 02111-1307, USA. */ -/* chunks can contain 1 or more blocks, each block contains one cothread stack */ +#include "cothreads-private.h" +#include "linuxthreads.h" -enum cothread_attr_method +typedef enum _cothread_block_state cothread_block_state; +typedef struct _cothread_chunk cothread_chunk; + +enum _cothread_block_state { - COTHREAD_ATTR_METHOD_MALLOC, /* cothread stacks on the heap, one block per chunk */ - COTHREAD_ATTR_METHOD_GTHREAD_STACK, /* cothread stacks within the current gthread's stack */ - COTHREAD_ATTR_METHOD_LINUXTHREADS, /* a hack that allows for linuxthreads compatibility */ -} + COTHREAD_BLOCK_STATE_UNUSED=0, + COTHREAD_BLOCK_STATE_IN_USE +}; + +struct _cothread_chunk { + cothread_chunk *next; + cothread_block_state *block_states; + char *chunk; + int size; + int reserved_bottom; + gboolean needs_free; + int nblocks; +}; -struct cothread_attr { - enum cothread_attr_method method; - int chunk_size; - int blocks_per_chunk; -} -#ifdef HAVE_LINUXTHREADS -static struct cothread_attr cothread_attr_default = +static cothread_chunk* cothread_chunk_new (unsigned long size, gboolean allocate); +static void cothread_chunk_free (cothread_chunk *chunk); +static gboolean cothread_stack_alloc_chunked (cothread_chunk *chunk, char **low, char **high, + cothread_chunk *(*chunk_new)(cothread_chunk*)); +static cothread_chunk* cothread_chunk_new_linuxthreads (cothread_chunk* old); + + +gboolean +cothread_stack_alloc_on_heap (char **low, char **high) { - COTHREAD_ATTR_METHOD_LINUXTHREADS, /* use the linuxthreads hack */ - 0x20000, /* 2 MB */ - 8 /* for a stack size of 256 KB */ + *low = g_malloc (_cothread_attr_global->chunk_size / _cothread_attr_global->blocks_per_chunk); + *high = *low + sizeof (*low) - 1; + return TRUE; } -#else -static struct cothread_attr cothread_attr_default = + +gboolean +cothread_stack_alloc_on_gthread_stack (char **low, char **high) { - COTHREAD_ATTR_METHOD_GTHREAD_STACK, /* this is what the old cothreads code does */ - 0x10000, /* only 1 MB due the the FreeBSD defaults */ - 8 /* for a stack size of 128 KB */ + cothread_chunk *chunk = NULL; + static GStaticPrivate chunk_key = G_STATIC_PRIVATE_INIT; + + if (!(chunk = g_static_private_get(&chunk_key))) { + chunk = cothread_chunk_new (_cothread_attr_global->chunk_size, FALSE); + g_static_private_set (&chunk_key, chunk, cothread_chunk_free); + } + + return cothread_stack_alloc_chunked (chunk, low, high, NULL); } -#endif - -static struct cothread_attr *_attr = NULL; /* set in cothread_init() */ -enum cothread_block_state +gboolean +cothread_stack_alloc_linuxthreads (char **low, char **high) { - COTHREAD_BLOCK_STATE_UNUSED=0, - COTHREAD_BLOCK_STATE_IN_USE + cothread_chunk *chunk = NULL; + static GStaticPrivate chunk_key = G_STATIC_PRIVATE_INIT; + + if (!(chunk = g_static_private_get(&chunk_key))) { + chunk = cothread_chunk_new (_cothread_attr_global->chunk_size, FALSE); + g_static_private_set (&chunk_key, chunk, cothread_chunk_free); + } + + return cothread_stack_alloc_chunked (chunk, low, high, cothread_chunk_new_linuxthreads); } -struct cothread_chunk { - struct cothread_chunk *next; - enum cothread_block_state *block_states; - char *chunk; - int size; - int reserved_bottom; - gboolean needs_free; -} /* size must be a power of two. */ -struct cothread_chunk* +static cothread_chunk* cothread_chunk_new (unsigned long size, gboolean allocate) { - struct cothread_chunk *ret; + cothread_chunk *ret; char *sp = CURRENT_STACK_FRAME; - ret = g_new0 (struct cothread_chunk, 1); - ret->block_states = g_new0 (enum cothread_block_state, _attr->blocks_per_chunk); + ret = g_new0 (cothread_chunk, 1); + ret->nblocks = _cothread_attr_global->blocks_per_chunk; + ret->block_states = g_new0 (cothread_block_state, ret->nblocks); if (allocate) { if (!posix_memalign(&ret->chunk, size, size)) @@ -83,7 +103,7 @@ cothread_chunk_new (unsigned long size, gboolean allocate) } else { /* if we don't allocate the chunk, we must already be in it. */ - ret->chunk = (unsigned long) sp &~ (size - 1); + ret->chunk = (char*) ((unsigned long) sp &~ (size - 1)); #if PTH_STACK_GROWTH > 0 ret->reserved_bottom = sp - ret->chunk; #else @@ -97,51 +117,43 @@ cothread_chunk_new (unsigned long size, gboolean allocate) return ret; } -gboolean -cothread_stack_alloc_on_heap (char **low, char **high) -{ - *low = g_malloc (_attr->chunk_size / _attr->blocks_per_chunk); - *high = *low + sizeof (*low); - return TRUE; -} - /** * cothread_stack_alloc_chunked: * @chunk: the chunk for the * Make a new cothread stack out of a chunk. Chunks are assumed to be aligned on - * boundaries of _attr->chunk_size. + * boundaries of _cothread_attr_global->chunk_size. * * Returns: the new cothread context */ - /* we assume that the stack is aligned on _attr->chunk_size boundaries */ + /* we assume that the stack is aligned on _cothread_attr_global->chunk_size boundaries */ static gboolean -cothread_stack_alloc_chunked (struct cothread_chunk *chunk, char **low, char **high, - (struct cothread_chunk*)(*chunk_new)(struct cothread_chunk*)) +cothread_stack_alloc_chunked (cothread_chunk *chunk, char **low, char **high, + cothread_chunk *(*chunk_new)(cothread_chunk*)) { int block; - struct cothread_chunk *walk, *last; + cothread_chunk *walk, *last; for (walk=chunk; walk; last=walk, walk=walk->next) { - if (chunk->block_states[0] == COTHREAD_BLOCK_STATE_UNUSED) { - chunk->block_states[0] = COTHREAD_BLOCK_STATE_IN_USE; + if (walk->block_states[0] == COTHREAD_BLOCK_STATE_UNUSED) { + walk->block_states[0] = COTHREAD_BLOCK_STATE_IN_USE; #if PTH_STACK_GROWTH > 0 - *low = chunk->chunk + chunk->reserved_bottom; - *high = chunk->chunk + chunk->chunk_size / _attr->blocks_per_chunk; + *low = walk->chunk + walk->reserved_bottom; + *high = walk->chunk + walk->size / walk->nblocks; #else - *low = chunk->chunk + chunk->size * (chunk->nblocks - 1) / chunk->nblocks; - *high = chunk->chunk + chunk->size - chunk->reserved_bottom; + *low = walk->chunk + walk->size * (walk->nblocks - 1) / walk->nblocks; + *high = walk->chunk + walk->size - walk->reserved_bottom; #endif return TRUE; } - for (block = 1; block < _attr->blocks_per_chunk; block++) { - if (chunk->block_states[block] == COTHREAD_BLOCK_STATE_UNUSED) { + for (block = 1; block < walk->nblocks; block++) { + if (walk->block_states[block] == COTHREAD_BLOCK_STATE_UNUSED) { #if PTH_STACK_GROWTH > 0 - *low = chunk->chunk + chunk->size * (chunk->nblocks - block - 1) / chunk->nblocks; + *low = walk->chunk + walk->size * (walk->nblocks - block - 1) / walk->nblocks; #else - *low = chunk->chunk + chunk->size * (block - 1) / chunk->nblocks; + *low = walk->chunk + walk->size * (block - 1) / walk->nblocks; #endif - *high = *low + chunk->size / chunk->nblocks; + *high = *low + walk->size / walk->nblocks; return TRUE; } } @@ -153,41 +165,19 @@ cothread_stack_alloc_chunked (struct cothread_chunk *chunk, char **low, char **h return cothread_stack_alloc_chunked (chunk_new (last), low, high, NULL); } -gboolean -cothread_stack_alloc_on_gthread_stack (char **low, char **high) -{ - struct cothread_chunk *chunk = NULL; - static GStaticPrivate chunk_key = G_STATIC_PRIVATE_INIT; - - if (!(chunk = g_static_private_get(&chunk_key))) { - chunk = cothread_chunk_new (_attr->size, FALSE); - g_static_private_set (&chunk_key, chunk, cothread_chunk_free); - } - - return cothread_stack_alloc_chunked (chunk, low, high, NULL); -} - -gboolean -cothread_stack_alloc_linuxthreads (char **low, char **high) +static void +cothread_chunk_free (cothread_chunk *chunk) { - struct cothread_chunk *chunk = NULL; - static GStaticPrivate chunk_key = G_STATIC_PRIVATE_INIT; - - if (!(chunk = g_static_private_get(&chunk_key))) { - chunk = cothread_chunk_new (_attr->size, FALSE); - g_static_private_set (&chunk_key, chunk, cothread_chunk_free); - } - - return cothread_stack_alloc_chunked (chunk, low, high, cothread_chunk_new_linuxthreads); + /* FIXME: implement me please */ } -struct cothread_chunk* -cothread_chunk_new_linuxthreads (struct cothread_chunk* old) +static cothread_chunk* +cothread_chunk_new_linuxthreads (cothread_chunk* old) { - struct cothread_chunk *new; + cothread_chunk *new; void *pthread_descr; - new = cothread_chunk_new (_attr->chunk_size, TRUE); + new = cothread_chunk_new (_cothread_attr_global->chunk_size, TRUE); pthread_descr = __linuxthreads_self(); #if PTH_STACK_GROWTH > 0 /* we don't really know pthread_descr's size in this case, but we can be @@ -196,12 +186,10 @@ cothread_chunk_new_linuxthreads (struct cothread_chunk* old) new->reserved_bottom = 2048; memcpy(new->chunk, pthread_descr, 2048); #else - new->reserved_bottom = ((unsigned long) pthread_descr | (_attr->chunk_size - 1)) - (unsigned long) pthread_descr; + new->reserved_bottom = ((unsigned long) pthread_descr | (new->size - 1)) - (unsigned long) pthread_descr; memcpy(new->chunk + new->size - new->reserved_bottom - 1, pthread_descr, new->reserved_bottom); #endif old->next = new; return new; } - - diff --git a/gst/cothreads/cothreads-private.h b/gst/cothreads/cothreads-private.h new file mode 100644 index 0000000..a2d49b4 --- /dev/null +++ b/gst/cothreads/cothreads-private.h @@ -0,0 +1,35 @@ +/* Pthread-friendly coroutines with pth + * Copyright (C) 2002 Andy Wingo + * + * cothread-private.h: private prototypes + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __COTHREAD_PRIVATE_H__ +#define __COTHREAD_PRIVATE_H__ + +#include + + +extern cothread_attr *_cothread_attr_global; + +gboolean cothread_stack_alloc_on_gthread_stack (char **low, char **high); +gboolean cothread_stack_alloc_linuxthreads (char **low, char **high); +gboolean cothread_stack_alloc_on_heap (char **low, char **high); + + +#endif /* __COTHREAD_PRIVATE_H__ */ diff --git a/gst/cothreads/cothreads.c b/gst/cothreads/cothreads.c new file mode 100644 index 0000000..3ea4e8d --- /dev/null +++ b/gst/cothreads/cothreads.c @@ -0,0 +1,112 @@ +/* Pthread-friendly coroutines with pth + * Copyright (C) 2002 Andy Wingo + * + * cothread.c: public API implementation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "cothreads-private.h" + + +#ifdef HAVE_LINUXTHREADS +static cothread_attr cothread_attr_default = +{ + COTHREAD_ATTR_METHOD_LINUXTHREADS, /* use the linuxthreads hack */ + 0x200000, /* 2 MB */ + 8, /* for a stack size of 256 KB */ + TRUE /* set up the first chunk */ +}; +#else +static cothread_attr cothread_attr_default = +{ + COTHREAD_ATTR_METHOD_GTHREAD_STACK, /* this is what the old cothreads code does */ + 0x100000, /* only 1 MB due the the FreeBSD defaults */ + 8, /* for a stack size of 128 KB */ + TRUE /* set up the first chunk */ +}; +#endif + +cothread_attr *_cothread_attr_global = NULL; + +static gboolean (*stack_alloc_func) (char**, char**); + +cothread* +cothread_init (cothread_attr *attr) +{ + static cothread_attr _attr; + + if (_cothread_attr_global) { + g_warning ("cothread system has already been initialized"); + return; + } + + if (!attr) + _attr = cothread_attr_default; + else + _attr = *attr; + + _cothread_attr_global = &_attr; + + switch (_cothread_attr_global->method) { + case COTHREAD_ATTR_METHOD_MALLOC: + stack_alloc_func = cothread_stack_alloc_on_heap; + break; + case COTHREAD_ATTR_METHOD_GTHREAD_STACK: + stack_alloc_func = cothread_stack_alloc_on_gthread_stack; + break; + case COTHREAD_ATTR_METHOD_LINUXTHREADS: + stack_alloc_func = cothread_stack_alloc_linuxthreads; + break; + default: + g_error ("unexpected value for attr method %d", _cothread_attr_global->method); + } + + return cothread_create (NULL); +} + +cothread* +cothread_create (void (*func)(void)) +{ + char *low, *high; + cothread *ret = g_new0 (cothread, 1); + + if (!func) { + /* we are being asked to save the current thread into a new cothread. this + * only happens for the first cothread. */ + if (_cothread_attr_global->alloc_cothread_0) + if (!stack_alloc_func (&low, &high)) + g_error ("couldn't create cothread 0"); + + pth_mctx_save (ret); + return ret; + } + + if (!stack_alloc_func (&low, &high)) + g_error ("could not allocate a new cothread stack"); + + pth_mctx_set (ret, func, low, high); + + return ret; +} + +void +cothread_destroy (cothread *thread) +{ + /* FIXME: have method-specific destroy functions. */ + + g_free (thread); +} diff --git a/gst/cothreads/cothreads.h b/gst/cothreads/cothreads.h new file mode 100644 index 0000000..9429e6a --- /dev/null +++ b/gst/cothreads/cothreads.h @@ -0,0 +1,55 @@ +/* Pthread-friendly coroutines with pth + * Copyright (C) 2002 Andy Wingo + * + * cothread.h: public API + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __COTHREAD_H__ +#define __COTHREAD_H__ + +#include +#include + + +typedef pth_mctx_t cothread; +typedef enum _cothread_attr_method cothread_attr_method; +typedef struct _cothread_attr cothread_attr; + + +enum _cothread_attr_method +{ + COTHREAD_ATTR_METHOD_MALLOC, /* cothread stacks on the heap, one block per chunk */ + COTHREAD_ATTR_METHOD_GTHREAD_STACK, /* cothread stacks within the current gthread's stack */ + COTHREAD_ATTR_METHOD_LINUXTHREADS, /* a hack that allows for linuxthreads compatibility */ +}; + +struct _cothread_attr { + cothread_attr_method method; + int chunk_size; + int blocks_per_chunk; + gboolean alloc_cothread_0; +}; + + +cothread* cothread_init (cothread_attr *attr); +cothread* cothread_create (void (*func)(void)); +void cothread_destroy (cothread *thread); + +#define cothread_switch(old,new) pth_mctx_switch(old,new) + +#endif /* __COTHREAD_H__ */ diff --git a/gst/cothreads/m4/glib.m4 b/gst/cothreads/m4/glib.m4 new file mode 100644 index 0000000..b8094bb --- /dev/null +++ b/gst/cothreads/m4/glib.m4 @@ -0,0 +1,196 @@ +# Configure paths for GLIB +# Owen Taylor 97-11-3 + +dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if "gmodule" or +dnl gthread is specified in MODULES, pass to glib-config +dnl +AC_DEFUN(AM_PATH_GLIB, +[dnl +dnl Get the cflags and libraries from the glib-config script +dnl +AC_ARG_WITH(glib-prefix,[ --with-glib-prefix=PFX Prefix where GLIB is installed (optional)], + glib_config_prefix="$withval", glib_config_prefix="") +AC_ARG_WITH(glib-exec-prefix,[ --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)], + glib_config_exec_prefix="$withval", glib_config_exec_prefix="") +AC_ARG_ENABLE(glibtest, [ --disable-glibtest Do not try to compile and run a test GLIB program], + , enable_glibtest=yes) + + if test x$glib_config_exec_prefix != x ; then + glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix" + if test x${GLIB_CONFIG+set} != xset ; then + GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config + fi + fi + if test x$glib_config_prefix != x ; then + glib_config_args="$glib_config_args --prefix=$glib_config_prefix" + if test x${GLIB_CONFIG+set} != xset ; then + GLIB_CONFIG=$glib_config_prefix/bin/glib-config + fi + fi + + for module in . $4 + do + case "$module" in + gmodule) + glib_config_args="$glib_config_args gmodule" + ;; + gthread) + glib_config_args="$glib_config_args gthread" + ;; + esac + done + + AC_PATH_PROG(GLIB_CONFIG, glib-config, no) + min_glib_version=ifelse([$1], ,0.99.7,$1) + AC_MSG_CHECKING(for GLIB - version >= $min_glib_version) + no_glib="" + if test "$GLIB_CONFIG" = "no" ; then + no_glib=yes + else + GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags` + GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs` + glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_glibtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$GLIB_LIBS $LIBS" +dnl +dnl Now check if the installed GLIB is sufficiently new. (Also sanity +dnl checks the results of glib-config to some extent +dnl + rm -f conf.glibtest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.glibtest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_glib_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_glib_version"); + exit(1); + } + + if ((glib_major_version != $glib_config_major_version) || + (glib_minor_version != $glib_config_minor_version) || + (glib_micro_version != $glib_config_micro_version)) + { + printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", + $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, + glib_major_version, glib_minor_version, glib_micro_version); + printf ("*** was found! If glib-config was correct, then it is best\n"); + printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n"); + printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } + else if ((glib_major_version != GLIB_MAJOR_VERSION) || + (glib_minor_version != GLIB_MINOR_VERSION) || + (glib_micro_version != GLIB_MICRO_VERSION)) + { + printf("*** GLIB header files (version %d.%d.%d) do not match\n", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + glib_major_version, glib_minor_version, glib_micro_version); + } + else + { + if ((glib_major_version > major) || + ((glib_major_version == major) && (glib_minor_version > minor)) || + ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n", + glib_major_version, glib_minor_version, glib_micro_version); + printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GLIB is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the glib-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n"); + printf("*** correct copy of glib-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_glib" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GLIB_CONFIG" = "no" ; then + echo "*** The glib-config script installed by GLIB could not be found" + echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GLIB_CONFIG environment variable to the" + echo "*** full path to glib-config." + else + if test -f conf.glibtest ; then + : + else + echo "*** Could not run GLIB test program, checking why..." + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$LIBS $GLIB_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GLIB or finding the wrong" + echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GLIB was incorrectly installed" + echo "*** or that you have moved GLIB since it was installed. In the latter case, you" + echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GLIB_CFLAGS="" + GLIB_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GLIB_CFLAGS) + AC_SUBST(GLIB_LIBS) + rm -f conf.glibtest +]) diff --git a/gst/cothreads/m4/gst-feature.m4 b/gst/cothreads/m4/gst-feature.m4 new file mode 100644 index 0000000..a0dc39c --- /dev/null +++ b/gst/cothreads/m4/gst-feature.m4 @@ -0,0 +1,182 @@ +dnl Perform a check for a feature for GStreamer +dnl Richard Boulton +dnl Thomas Vander Stichele added useful stuff +dnl Last modification: 25/06/2001 +dnl GST_CHECK_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION, +dnl DEPENDENT-PLUGINS, TEST-FOR-FEATURE, +dnl DISABLE-BY-DEFAULT, ACTION-IF-USE, ACTION-IF-NOTUSE) +dnl +dnl This macro adds a command line argument to enable the user to enable +dnl or disable a feature, and if the feature is enabled, performs a supplied +dnl test to check if the feature is available. +dnl +dnl The test should define HAVE_ to "yes" or "no" depending +dnl on whether the feature is available. +dnl +dnl The macro will set USE_ to "yes" or "no" depending on +dnl whether the feature is to be used. +dnl Thomas changed this, so that when USE_ was already set +dnl to no, then it stays that way. +dnl +dnl The macro will call AM_CONDITIONAL(USE_<, ...) to allow +dnl the feature to control what is built in Makefile.ams. If you want +dnl additional actions resulting from the test, you can add them with the +dnl ACTION-IF-USE and ACTION-IF-NOTUSE parameters. +dnl +dnl FEATURE-NAME is the name of the feature, and should be in +dnl purely upper case characters. +dnl FEATURE-DESCRIPTION is used to describe the feature in help text for +dnl the command line argument. +dnl DEPENDENT-PLUGINS lists any plugins which depend on this feature. +dnl TEST-FOR-FEATURE is a test which sets HAVE_ to "yes" +dnl or "no" depending on whether the feature is +dnl available. +dnl DISABLE-BY-DEFAULT if "disabled", the feature is disabled by default, +dnl if any other value, the feature is enabled by default. +dnl ACTION-IF-USE any extra actions to perform if the feature is to be +dnl used. +dnl ACTION-IF-NOTUSE any extra actions to perform if the feature is not to +dnl be used. +dnl +dnl +dnl thomas : +dnl we also added a history. +dnl GST_PLUGINS_YES will contain all plugins to be built +dnl that were checked through GST_CHECK_FEATURE +dnl GST_PLUGINS_NO will contain those that won't be built + +AC_DEFUN(GST_CHECK_FEATURE, +[dnl +builtin(define, [gst_endisable], ifelse($5, [disabled], [enable], [disable]))dnl +dnl if it is set to NO, then don't even consider it for building +NOUSE= +if test "x$USE_[$1]" = "xno"; then + NOUSE="yes" +fi +AC_ARG_ENABLE(translit([$1], A-Z, a-z), + [ ]builtin(format, --%-26s gst_endisable %s, gst_endisable-translit([$1], A-Z, a-z), [$2]ifelse([$3],,,: [$3])), + [ case "${enableval}" in + yes) USE_[$1]=yes;; + no) USE_[$1]=no;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;; + esac], + [ USE_$1=]ifelse($5, [disabled], [no], [yes])) dnl DEFAULT + +dnl *** set it back to no if it was preset to no +if test "x$NOUSE" = "xyes"; then + USE_[$1]="no" + AC_MSG_WARN(*** $3 pre-configured not to be built) +fi +NOUSE= + +dnl *** If it's enabled + +if test x$USE_[$1] = xyes; then + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + HAVE_[$1]=no + $4 + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + dnl If it isn't found, unset USE_[$1] + if test x$HAVE_[$1] = xno; then + USE_[$1]=no + fi +fi +dnl *** Warn if it's disabled or not found +if test x$USE_[$1] = xyes; then + ifelse([$6], , :, [$6]) + GST_PLUGINS_YES="$GST_PLUGINS_YES \n\t[$3]" +else + ifelse([$3], , :, [AC_MSG_NOTICE( +These plugins will not be built: [$3] +)]) + GST_PLUGINS_NO="$GST_PLUGINS_NO \n\t[$3]" + ifelse([$7], , :, [$7]) +fi +dnl *** Define the conditional as appropriate +AM_CONDITIONAL(USE_[$1], test x$USE_[$1] = xyes) +]) + +dnl Use a -config program which accepts --cflags and --libs parameters +dnl to set *_CFLAGS and *_LIBS and check existence of a feature. +dnl Richard Boulton +dnl Last modification: 26/06/2001 +dnl GST_CHECK_CONFIGPROG(FEATURE-NAME, CONFIG-PROG-FILENAME, MODULES) +dnl +dnl This check was written for GStreamer: it should be renamed and checked +dnl for portability if you decide to use it elsewhere. +dnl +AC_DEFUN(GST_CHECK_CONFIGPROG, +[ + AC_PATH_PROG([$1]_CONFIG, [$2], no) + if test x$[$1]_CONFIG = xno; then + [$1]_LIBS= + [$1]_CFLAGS= + HAVE_[$1]=no + else + [$1]_LIBS=`[$2] --libs [$3]` + [$1]_CFLAGS=`[$2] --cflags [$3]` + HAVE_[$1]=yes + fi + AC_SUBST([$1]_LIBS) + AC_SUBST([$1]_CFLAGS) +]) + +dnl Use AC_CHECK_LIB and AC_CHECK_HEADER to do both tests at once +dnl sets HAVE_module if we have it +dnl Richard Boulton +dnl Last modification: 26/06/2001 +dnl GST_CHECK_LIBHEADER(FEATURE-NAME, LIB NAME, LIB FUNCTION, EXTRA LD FLAGS, +dnl HEADER NAME, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND) +dnl +dnl This check was written for GStreamer: it should be renamed and checked +dnl for portability if you decide to use it elsewhere. +dnl +AC_DEFUN(GST_CHECK_LIBHEADER, +[ + AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no,[$4]) + if test "x$HAVE_[$1]" = "xyes"; then + AC_CHECK_HEADER([$5], :, HAVE_[$1]=no) + if test "x$HAVE_[$1]" = "xyes"; then + dnl execute what needs to be + ifelse([$6], , :, [$6]) + else + ifelse([$7], , :, [$7]) + fi + else + AC_MSG_WARN([$1] not found) + fi + AC_SUBST(HAVE_[$1]) +] +) + +dnl +dnl Add a subsystem --disable flag and all the necessary symbols and substitions +dnl +dnl GST_SUBSYSTEM_DISABLE(SYSNAME, [subsystem name]) +dnl +AC_DEFUN(GST_SUBSYSTEM_DISABLE, +[AC_ARG_ENABLE(translit([$1], A-Z, a-z), +[ ]builtin(format, --disable-%-17s disable %s, translit([$1], A-Z, a-z), $2), +[ case "${enableval}" in + yes) GST_DISABLE_[$1]=no ;; + no) GST_DISABLE_[$1]=yes ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;; + esac], +[GST_DISABLE_[$1]=no]) dnl Default value +if test x$GST_DISABLE_[$1] = xyes; then + AC_DEFINE(GST_DISABLE_[$1], 1, [Disable $2]) + GST_DISABLE_[$1]_DEFINE=-DGST_DISABLE_[$1] +fi +AM_CONDITIONAL(GST_DISABLE_[$1], test x$GST_DISABLE_[$1] = xyes) +AC_SUBST(GST_DISABLE_[$1]_DEFINE) +GST_SUBSYSTEM_DISABLE_DEFINES="$GST_SUBSYTEM_DISABLE_DEFINES $GST_DISABLE_[$1]_DEFINE" +]) diff --git a/gst/cothreads/m4/linuxthreads.m4 b/gst/cothreads/m4/linuxthreads.m4 new file mode 100644 index 0000000..7f65fac --- /dev/null +++ b/gst/cothreads/m4/linuxthreads.m4 @@ -0,0 +1,15 @@ +dnl Check for LinuxThreads +dnl COTHREADS_CHECK_LINUXTHREADS +dnl no arguments +AC_DEFUN([COTHREADS_CHECK_LINUXTHREADS], [ + AC_CACHE_CHECK([for LinuxThreads], + [cothreads_cv_linuxthreads], + [AC_EGREP_CPP(pthread_kill_other_threads_np, + [#include ], + [cothreads_cv_linuxthreads=yes], + [cothreads_cv_linuxthreads=no]) + ]) + if test $cothreads_cv_linuxthreads = yes; then + AC_DEFINE(HAVE_LINUXTHREADS,1,[if you have LinuxThreads]) + fi +]) diff --git a/gst/cothreads/m4/pkg.m4 b/gst/cothreads/m4/pkg.m4 new file mode 100644 index 0000000..874a120 --- /dev/null +++ b/gst/cothreads/m4/pkg.m4 @@ -0,0 +1,56 @@ + +dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +AC_DEFUN(PKG_CHECK_MODULES, [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + if ! $PKG_CONFIG --atleast-pkgconfig-version 0.7.0; then + echo "*** Your version of pkg-config is too old. You need version 0.7.0 or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + else + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + diff --git a/gst/cothreads/m4/pth-acinclude.m4 b/gst/cothreads/m4/pth-acinclude.m4 new file mode 100644 index 0000000..ad0f6ed --- /dev/null +++ b/gst/cothreads/m4/pth-acinclude.m4 @@ -0,0 +1,1765 @@ +dnl ## +dnl ## NGPT - Next Generation POSIX Threading +dnl ## Copyright (c) 2001 IBM Corporation +dnl ## Copyright (c) 1999-2000 Ralf S. Engelschall +dnl ## +dnl ## This file is part of NGPT, a non-preemptive thread scheduling +dnl ## library which can be found at http://www.ibm.com/developer +dnl ## +dnl ## This library is free software; you can redistribute it and/or +dnl ## modify it under the terms of the GNU Lesser General Public +dnl ## License as published by the Free Software Foundation; either +dnl ## version 2.1 of the License, or (at your option) any later version. +dnl ## +dnl ## This library is distributed in the hope that it will be useful, +dnl ## but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl ## Lesser General Public License for more details. +dnl ## +dnl ## You should have received a copy of the GNU Lesser General Public +dnl ## License along with this library; if not, write to the Free Software +dnl ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +dnl ## USA, or contact Bill Abt +dnl ## +dnl ## aclocal.m4: Pth Autoconf macros +dnl ## + dnl # ``"Reuse an expert's code" is the right + dnl # advice for most people. But it's a useless + dnl # advice for the experts writing the code + dnl # in the first place.' + dnl # -- Dan J. Bernstein + +dnl ## +dnl ## Display Configuration Headers +dnl ## +dnl ## configure.in: +dnl ## AC_MSG_PART() +dnl ## + +define(AC_MSG_PART,[dnl +if test ".$enable_subdir" != .yes; then + AC_MSG_RESULT() + AC_MSG_RESULT(${TB}$1:${TN}) +fi +])dnl + +dnl ## +dnl ## Display a message under --verbose +dnl ## +dnl ## configure.in: +dnl ## AC_MSG_VERBOSE() +dnl ## + +define(AC_MSG_VERBOSE,[dnl +if test ".$verbose" = .yes; then + AC_MSG_RESULT([ $1]) +fi +]) + +dnl ## +dnl ## Do not display message for a command +dnl ## +dnl ## configure.in: +dnl ## AC_MSG_SILENT(...) +dnl ## + +define(AC_FD_TMP, 9) +define(AC_MSG_SILENT,[dnl +exec AC_FD_TMP>&AC_FD_MSG AC_FD_MSG>/dev/null +$1 +exec AC_FD_MSG>&AC_FD_TMP AC_FD_TMP>&- +]) + +dnl ## +dnl ## Perform something only once +dnl ## +dnl ## configure.in: +dnl ## AC_ONCE() +dnl ## + +define(AC_ONCE,[ +ifelse(ac_once_$1, already_done, ,[ + define(ac_once_$1, already_done) + $2 +])dnl +]) + +dnl ## +dnl ## Support for $(S) +dnl ## +dnl ## configure.in: +dnl ## AC_SRCDIR_PREFIX() +dnl ## + +AC_DEFUN(AC_SRCDIR_PREFIX,[ +ac_prog=[$]0 +changequote(, )dnl +ac_srcdir=`echo $ac_prog | sed -e 's%/[^/][^/]*$%%' -e 's%\([^/]\)/*$%\1%'` +changequote([, ])dnl +if test ".$ac_srcdir" = ".$ac_prog"; then + ac_srcdir="" +elif test "x$ac_srcdir" = "x."; then + ac_srcdir="" +else + if test ".$CFLAGS" = .; then + CFLAGS="-I$ac_srcdir" + else + CFLAGS="$CFLAGS -I$ac_srcdir" + fi + ac_srcdir="$ac_srcdir/" +fi +$1="$ac_srcdir" +AC_SUBST($1) +])dnl + +dnl ## +dnl ## Support for --enable-subdir (for use with pth.m4) +dnl ## +dnl ## configure.in: +dnl ## AC_ENABLESUBDIR +dnl ## + +AC_DEFUN(AC_ENABLESUBDIR,[ +AC_ARG_ENABLE(subdir,dnl +[ --enable-subdir enable local building as subdirectory (default=no)],[dnl +],[dnl +enable_subdir=no +])dnl +if test ".$enable_subdir" = .yes; then + enable_batch=yes + enable_shared=no +fi +])dnl + +dnl ## +dnl ## Support for Configuration Headers +dnl ## +dnl ## configure.in: +dnl ## AC_HEADLINE(, , +dnl ## , , +dnl ## ) +dnl ## + +AC_DEFUN(AC_HEADLINE,[dnl +AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl +# configuration header +if test ".`echo dummy [$]@ | grep enable-subdir`" != .; then + enable_subdir=yes +fi +if test ".`echo dummy [$]@ | grep help`" = .; then + # bootstrapping shtool + ac_prog=[$]0 +changequote(, )dnl + ac_srcdir=`echo $ac_prog | sed -e 's%/[^/][^/]*$%%' -e 's%\([^/]\)/*$%\1%'` +changequote([, ])dnl + test ".$ac_srcdir" = ".$ac_prog" && ac_srcdir=. + ac_shtool="${CONFIG_SHELL-/bin/sh} $ac_srcdir/shtool" + + # find out terminal sequences + if test ".$enable_subdir" != .yes; then + TB=`$ac_shtool echo -n -e %B 2>/dev/null` + TN=`$ac_shtool echo -n -e %b 2>/dev/null` + else + TB='' + TN='' + fi + + # find out package version + $3_STR="`$ac_shtool version -lc -dlong $ac_srcdir/$4`" + AC_SUBST($3_STR) + + # friendly header ;) + if test ".$enable_subdir" != .yes; then + echo "Configuring ${TB}$1${TN} ($2), Version ${TB}${$3_STR}${TN}" + echo "$5" + fi + + # additionally find out hex version + $3_HEX="`$ac_shtool version -lc -dhex $ac_srcdir/$4`" + AC_SUBST($3_HEX) +fi +AC_DIVERT_POP() +])dnl + +dnl ## +dnl ## Support for Platform IDs +dnl ## +dnl ## configure.in: +dnl ## AC_PLATFORM() +dnl ## + +AC_DEFUN(AC_PLATFORM,[ +if test ".$host" != .NONE; then + $1="$host" +elif test ".$nonopt" != .NONE; then + $1="$nonopt" +else + $1=`${CONFIG_SHELL-/bin/sh} $srcdir/config.guess` +fi +$1=`${CONFIG_SHELL-/bin/sh} $srcdir/config.sub $$1` || exit 1 +AC_SUBST($1) +if test ".$enable_subdir" != .yes; then + echo "Platform: ${TB}${$1}${TN}" +fi +])dnl + +dnl ## +dnl ## Support for config.param files +dnl ## +dnl ## configure.in: +dnl ## AC_CONFIG_PARAM() +dnl ## + +AC_DEFUN(AC_CONFIG_PARAM,[ +AC_DIVERT_PUSH(-1) +AC_ARG_WITH(param,[ --with-param=ID[,ID,..] load parameters from $1]) +AC_DIVERT_POP() +AC_DIVERT_PUSH(AC_DIVERSION_NOTICE) +ac_prev="" +ac_param="" +if test -f $1; then + ac_param="$1:common" +fi +for ac_option +do + if test ".$ac_prev" != .; then + eval "$ac_prev=\$ac_option" + ac_prev="" + continue + fi + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[[-_a-zA-Z0-9]]*=//'` ;; + *) ac_optarg="" ;; + esac + case "$ac_option" in + --with-param=* ) + case $ac_optarg in + *:* ) + ac_from=`echo $ac_optarg | sed -e 's/:.*//'` + ac_what=`echo $ac_optarg | sed -e 's/.*://'` + ;; + * ) + ac_from="$1" + ac_what="$ac_optarg" + ;; + esac + if test ".$ac_param" = .; then + ac_param="$ac_from:$ac_what" + else + ac_param="$ac_param,$ac_from:$ac_what" + fi + ;; + esac +done +if test ".$ac_param" != .; then + # echo "loading parameters" + OIFS="$IFS" + IFS="," + pconf="/tmp/autoconf.$$" + echo "ac_options=''" >$pconf + ac_from="$1" + for ac_section in $ac_param; do + changequote(, ) + case $ac_section in + *:* ) + ac_from=`echo "$ac_section" | sed -e 's/:.*//'` + ac_section=`echo "$ac_section" | sed -e 's/.*://'` + ;; + esac + (echo ''; cat $ac_from; echo '') |\ + sed -e "1,/[ ]*[ ]*${ac_section}[ ]*{[ ]*/d" \ + -e '/[ ]*}[ ]*/,$d' \ + -e ':join' -e '/\\[ ]*$/N' -e 's/\\[ ]*\n[ ]*//' -e 'tjoin' \ + -e 's/^[ ]*//g' \ + -e 's/^\([^-].*=.*\) IF \(.*\)$/if \2; then \1; fi/' \ + -e 's/^\(--.*=.*\) IF \(.*\)$/if \2; then ac_options="$ac_options \1"; fi/' \ + -e 's/^\(--.*\) IF \(.*\)$/if \2; then ac_options="$ac_options \1"; fi/' \ + -e 's/^\(--.*=.*\)$/ac_options="$ac_options \1"/' \ + -e 's/^\(--.*\)$/ac_options="$ac_options \1"/' \ + >>$pconf + changequote([, ]) + done + IFS="$OIFS" + . $pconf + rm -f $pconf >/dev/null 2>&1 + if test ".[$]*" = .; then + set -- $ac_options + else + set -- "[$]@" $ac_options + fi +fi +AC_DIVERT_POP() +])dnl + +dnl ## +dnl ## Check whether compiler option works +dnl ## +dnl ## configure.in: +dnl ## AC_COMPILER_OPTION(, ,