Update of /cvsroot/gstreamer/gstreamer/gst/cothreads In directory usw-pr-cvs1:/tmp/cvs-serv1301 Modified Files: Makefile.am acinclude.m4 autogen.sh configure.ac cothread-stack.c Added Files: cothreads-private.h cothreads.c cothreads.h Log Message: the cothreads library now builds, but it's untested the public api is in cothreads.h --- NEW FILE: cothreads-private.h --- /* Pthread-friendly coroutines with pth * Copyright (C) 2002 Andy Wingo <wi...@po...> * * 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 <cothreads.h> 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__ */ --- NEW FILE: cothreads.c --- /* Pthread-friendly coroutines with pth * Copyright (C) 2002 Andy Wingo <wi...@po...> * * 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); } --- NEW FILE: cothreads.h --- /* Pthread-friendly coroutines with pth * Copyright (C) 2002 Andy Wingo <wi...@po...> * * 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 <glib.h> #include <pth_p.h> 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__ */ Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/cothreads/Makefile.am,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- Makefile.am 2002/01/27 20:11:58 1.6 +++ Makefile.am 2002/01/28 01:29:10 1.7 @@ -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 Index: acinclude.m4 =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/cothreads/acinclude.m4,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- acinclude.m4 2002/01/27 20:03:54 1.2 +++ acinclude.m4 2002/01/28 01:29:10 1.3 @@ -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 <glib.h> +#include <stdio.h> +#include <stdlib.h> + +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 <glib.h> +#include <stdio.h> +], [ 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 <ric...@ta...> +dnl Thomas Vander Stichele <th...@ap...> 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_<FEATURE-NAME> to "yes" or "no" depending +dnl on whether the feature is available. +dnl +dnl The macro will set USE_<FEATURE-NAME> to "yes" or "no" depending on +dnl whether the feature is to be used. +dnl Thomas changed this, so that when USE_<FEATURE-NAME> was already set +dnl to no, then it stays that way. +dnl +dnl The macro will call AM_CONDITIONAL(USE_<<FEATURE-NAME>, ...) 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_<FEATURE-NAME> 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 <ric...@ta...> +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 <ric...@ta...> +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 <pthread.h>], + [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 <ba...@us...> @@ -1762,20 +2211,4 @@ 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 <pthread.h>], - [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 ]) Index: autogen.sh =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/cothreads/autogen.sh,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- autogen.sh 2002/01/23 20:00:09 1.3 +++ autogen.sh 2002/01/28 01:29:10 1.4 @@ -137,6 +137,9 @@ 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 Index: configure.ac =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/cothreads/configure.ac,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- configure.ac 2002/01/27 20:03:54 1.2 +++ configure.ac 2002/01/28 01:29:10 1.3 @@ -259,6 +259,34 @@ 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 Index: cothread-stack.c =================================================================== RCS file: /cvsroot/gstreamer/gstreamer/gst/cothreads/cothread-stack.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- cothread-stack.c 2002/01/27 20:03:54 1.1 +++ cothread-stack.c 2002/01/28 01:29:10 1.2 @@ -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_attr { - enum cothread_attr_method method; - int chunk_size; - int blocks_per_chunk; -} +struct _cothread_chunk { + cothread_chunk *next; + cothread_block_state *block_states; + char *chunk; + int size; + int reserved_bottom; + gboolean needs_free; + int nblocks; +}; -#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 @@ } 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 @@ 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 @@ 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 @@ 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; } - - |