[gst-devel] Re: Forte Solaris patch

Brian Cameron Brian.Cameron at sun.com
Mon Jan 20 06:43:08 CET 2003


Okay, I updated the patch again.  This patch takes into account David
Schleef's comments.  I added "__GNUC__" ifdef's to the various __asm__ 
code for all compiler types, since you don't want to use gcc+'s inline
assembly extensions if not using gcc.  

Forte does support inline, it just doesn't work well with
__gst_debug_register_funcptr.  This is because the Forte compiler only
supports inline static functions.  Since __gst_debug_register_funcptr is
non-static, it needs to be defined as non-inline for Forte.  I updated
the patch to use the Forte #ifndef __sun rather than #ifdef __GNUC__,
so this is cleaner.  Since this is just a debug function, it probably
isn't worth making this a static inline function in all functions that
require GST_DEBUG_FUNCPTR.

David also pointed out that the non-gcc version of CURRENT_STACK_FRAME
should be the preferred method of getting the stack frame anyway.  I
didn't go ahead and make this change, since I felt that decision would
be better left to someone that is more intimate with that part of the
code.  My patch for now is just to make the code compile on Forte.

David pointed out that he thought that the entire gstarch.h
could be surrounded by an #ifdef __GNUC__.  However, note that Forte
is falling into the "USE_MAKECONTEXT" #elif case, so not the *entire*
file could be included with an #ifdef __GNUC__.  :)  Again I'll leave
this change to someone more intimate with the code, if this is 
desired.

This patch also addresses the compile issue that Christian
Frederik pointed out, so it should work better for everyone.  :)

I'm using the #ifndef __sun rather than #ifdef __GNUC__, since this is
a Forte specific issue.

Brian


> Updated patch.  I found out that the previous patch I sent had a problem
> which caused it to fail on patching configure.ac.  I've heard that this
> patch works better.  :)
> 
> Brian
> 
> 
> > The attached patch makes gstreamer build fine with Forte!  Finally got
> > all the issues sorted.  Could this patch be applied to gstreamer head?
> > 
> > Brian
> > 
> > 
> > Note:  things still aren't working 100% with Forte.  Running "make check"
> >        fails as follows.
> > 
> > --make check output start--
> > 
> > make[5]: Entering directory 
> > `/export/home/build/gnome/future/gstreamer/libs/ext/cothreads/tests'
> > 0: calling the pthread function directly
> > 0: spawning a new cothread
> > 
> > (process:3848): Cothreads-CRITICAL **: mmap failed, captain
> > 
> > Cothreads-ERROR **: could not allocate a new cothread stack
> > aborting...
> > FAIL: cothreads
> > 0: spawning a new cothread (iteration 1)
> > FAIL: dynamic
> > ===================
> > 2 of 2 tests failed
> > ===================
> > 
> > --make check output end--
> > 
> > Brian
> 
> 
> Brian


Brian
-------------- next part --------------
Index: gstreamer/configure.ac
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/configure.ac,v
retrieving revision 1.203
diff -u -p -r1.203 configure.ac
--- gstreamer/configure.ac	11 Jan 2003 00:27:29 -0000	1.203
+++ gstreamer/configure.ac	20 Jan 2003 14:37:22 -0000
@@ -174,6 +174,8 @@ int main ()
                 ftp://ftp.rpm.org/pub/rpm/dist/rpm-4.0.x/])
 ])
 
+AC_CHECK_HEADER(ucontext.h, AC_DEFINE(HAVE_UCONTEXT_H))
+
 dnl Check for atomic.h
 dnl Note: use AC_CHECK_HEADER not AC_CHECK_HEADERS, because the latter
 dnl defines the wrong default symbol as well (HAVE_ASM_ATOMIC_H)
Index: gstreamer/gst/cothreads.c
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/cothreads.c,v
retrieving revision 1.105
diff -u -p -r1.105 cothreads.c
--- gstreamer/gst/cothreads.c	1 Jan 2003 04:28:32 -0000	1.105
+++ gstreamer/gst/cothreads.c	20 Jan 2003 14:37:23 -0000
@@ -36,6 +36,11 @@
 #include "gstarch.h"
 #include "gstlog.h"
 #include "gstutils.h"
+#ifdef HAVE_MAKECONTEXT
+#ifdef HAVE_UCONTEXT_H
+    #include <ucontext.h>
+#endif
+#endif
 
 /* older glibc's have MAP_ANON instead of MAP_ANONYMOUS */
 #ifndef MAP_ANONYMOUS
@@ -101,8 +106,14 @@ cothread_get_current_context (void)
 cothread_context *
 cothread_context_init (void)
 {
+#ifndef __GNUC__
+  char __csf;
+  void *sp = &__csf;
+#else
+  void *sp = CURRENT_STACK_FRAME;
+#endif
+
   cothread_context *ctx;
-  void *sp;
 
   /* if there already is a cotread context for this thread,
    * just return it */
@@ -136,7 +147,6 @@ cothread_context_init (void)
   /* clear the cothread data */
   memset (ctx->cothreads, 0, sizeof (ctx->cothreads));
 
-  sp = CURRENT_STACK_FRAME;
   /* FIXME this may not be 64bit clean
    *       could use casts to uintptr_t from inttypes.h
    *       if only all platforms had inttypes.h
@@ -158,7 +168,7 @@ cothread_context_init (void)
   ctx->cothreads[0]->argv = NULL;
   ctx->cothreads[0]->priv = NULL;
   ctx->cothreads[0]->flags = COTHREAD_STARTED;
-  ctx->cothreads[0]->sp = (void *) CURRENT_STACK_FRAME;
+  ctx->cothreads[0]->sp = (void *) sp;
 
   GST_INFO (GST_CAT_COTHREADS, "0th cothread is %p at sp:%p", 
             ctx->cothreads[0], ctx->cothreads[0]->sp);
@@ -443,6 +453,13 @@ cothread_current (void)
 static void
 cothread_stub (void)
 {
+#ifndef __GNUC__
+  char __csf;
+  char *sp = &__csf;
+#else
+  char *sp = CURRENT_STACK_FRAME;
+#endif
+
   cothread_context *ctx = cothread_get_current_context();
   cothread_state *cothread = ctx->cothreads[ctx->current];
 
@@ -457,7 +474,7 @@ cothread_stub (void)
 
     GST_DEBUG (GST_CAT_COTHREADS, "cothread[%d] thread->func exited", ctx->current);
 
-    GST_DEBUG (GST_CAT_COTHREADS, "sp=%p", CURRENT_STACK_FRAME);
+    GST_DEBUG (GST_CAT_COTHREADS, "sp=%p", sp);
     GST_DEBUG (GST_CAT_COTHREADS, "ctx=%p current=%p", ctx,cothread_get_current_context());
     g_assert (ctx == cothread_get_current_context());
 
Index: gstreamer/gst/gst.c
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/gst.c,v
retrieving revision 1.89
diff -u -p -r1.89 gst.c
--- gstreamer/gst/gst.c	16 Jan 2003 21:22:06 -0000	1.89
+++ gstreamer/gst/gst.c	20 Jan 2003 14:37:23 -0000
@@ -190,18 +190,54 @@ gst_init_with_popt_table (int *argc, cha
   gint nextopt, i, j, nstrip;
   gchar **temp;
   const struct poptOption *options;
-  /* this is probably hacky, no? */
-  const struct poptOption options_with[] = {
-    {NULL, NUL, POPT_ARG_INCLUDE_TABLE, poptHelpOptions, 				 0, "Help options:", NULL},
-    {NULL, NUL, POPT_ARG_INCLUDE_TABLE, (struct poptOption *) gst_init_get_popt_table(), 0, "GStreamer options:", NULL},
-    {NULL, NUL, POPT_ARG_INCLUDE_TABLE, (struct poptOption *) popt_options, 		 0, "Application options:", NULL},
-    POPT_TABLEEND
+  struct poptOption options_with[] = {
+     POPT_TABLEEND,
+     POPT_TABLEEND,
+     POPT_TABLEEND,
+     POPT_TABLEEND
   };
-  const struct poptOption options_without[] = {
-    {NULL, NUL, POPT_ARG_INCLUDE_TABLE, poptHelpOptions, 				 0, "Help options:", NULL},
-    {NULL, NUL, POPT_ARG_INCLUDE_TABLE, (struct poptOption *) gst_init_get_popt_table(), 0, "GStreamer options:", NULL},
-    POPT_TABLEEND
+  struct poptOption options_without[] = {
+     POPT_TABLEEND,
+     POPT_TABLEEND,
+     POPT_TABLEEND
   };
+
+  options_with[0].longName   = NULL;
+  options_with[0].shortName  = NUL;
+  options_with[0].argInfo    = POPT_ARG_INCLUDE_TABLE;
+  options_with[0].arg        = poptHelpOptions;
+  options_with[0].val        = 0;
+  options_with[0].descrip    = "Help options:";
+  options_with[0].argDescrip = NULL;
+  options_with[1].longName   = NULL;
+  options_with[1].shortName  = NUL;
+  options_with[1].argInfo    = POPT_ARG_INCLUDE_TABLE;
+  options_with[1].arg        = (struct poptOption *) gst_init_get_popt_table();
+  options_with[1].val        = 0;
+  options_with[1].descrip    = "GStreamer options:";
+  options_with[1].argDescrip = NULL;
+  options_with[2].longName   = NULL;
+  options_with[2].shortName  = NUL;
+  options_with[2].argInfo    = POPT_ARG_INCLUDE_TABLE;
+  options_with[2].arg        = (struct poptOption *) popt_options;
+  options_with[2].val        = 0;
+  options_with[2].descrip    = "Application options:";
+  options_with[2].argDescrip = NULL;
+
+  options_without[0].longName   = NULL;
+  options_without[0].shortName  = NUL;
+  options_without[0].argInfo    = POPT_ARG_INCLUDE_TABLE;
+  options_without[0].arg        = poptHelpOptions;
+  options_without[0].val        = 0;
+  options_without[0].descrip    = "Help options:";
+  options_without[0].argDescrip = NULL;
+  options_without[1].longName   = NULL;
+  options_without[1].shortName  = NUL;
+  options_without[1].argInfo    = POPT_ARG_INCLUDE_TABLE;
+  options_without[1].arg        = (struct poptOption *) gst_init_get_popt_table();
+  options_without[1].val        = 0;
+  options_without[1].descrip    = "GStreamer options:";
+  options_without[1].argDescrip = NULL;
 
   if (gst_initialized)
   {
Index: gstreamer/gst/gstarch.h
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/gstarch.h,v
retrieving revision 1.18
diff -u -p -r1.18 gstarch.h
--- gstreamer/gst/gstarch.h	11 Dec 2002 21:33:07 -0000	1.18
+++ gstreamer/gst/gstarch.h	20 Jan 2003 14:37:23 -0000
@@ -30,7 +30,7 @@
 
 
 /***** Intel x86 *****/
-#if defined(HAVE_CPU_I386)
+#if defined(HAVE_CPU_I386) && defined(__GNUC__)
 #define GST_ARCH_SET_SP(stackpointer) \
   __asm__( "movl %0, %%esp\n" : : "r"(stackpointer) );
 
@@ -43,7 +43,7 @@
 
 
 /***** PowerPC *****/
-#elif defined (HAVE_CPU_PPC)
+#elif defined (HAVE_CPU_PPC) && defined(__GNUC__)
 
 /* should bring this in line with others and use an "r" */
 #define GST_ARCH_SET_SP(stackpointer) \
@@ -68,7 +68,7 @@ struct minimal_ppc_stackframe {
 
 
 /***** DEC[/Compaq/HP?/Intel?] Alpha *****/
-#elif defined(HAVE_CPU_ALPHA)
+#elif defined(HAVE_CPU_ALPHA) && defined(__GNUC__)
 
 #define GST_ARCH_SET_SP(stackpointer) \
     __asm__("bis $31,%0,$30" : : "r"(stackpointer));
@@ -94,7 +94,7 @@ struct minimal_stackframe {
 
 
 /***** ARM *****/
-#elif defined(HAVE_CPU_ARM)
+#elif defined(HAVE_CPU_ARM) && defined(__GNUC__)
 
 #define GST_ARCH_SET_SP(stackpointer) \
     __asm__( "mov sp, %0" : : "r"(stackpointer));
@@ -110,7 +110,7 @@ struct minimal_stackframe {
 
 
 /***** Sun SPARC *****/
-#elif defined(HAVE_CPU_SPARC)
+#elif defined(HAVE_CPU_SPARC) && defined(__GNUC__)
 
 #define GST_ARCH_SET_SP(stackpointer) \
     __asm__( "ta 3\n\t" \
@@ -131,7 +131,7 @@ struct minimal_stackframe {
 
 
 /***** MIPS *****/
-#elif defined(HAVE_CPU_MIPS)
+#elif defined(HAVE_CPU_MIPS) && defined(__GNUC__)
 
 #define GST_ARCH_SET_SP(stackpointer) \
     __asm__("lw $sp,0(%0)\n\t" : : "r"(stackpointer));
@@ -146,7 +146,7 @@ struct minimal_stackframe {
 
 
 /***** HP-PA *****/
-#elif defined(HAVE_CPU_HPPA)
+#elif defined(HAVE_CPU_HPPA) && defined(__GNUC__)
 
 #define GST_ARCH_SET_SP(stackpointer) \
     __asm__("copy %0,%%sp\n\t" : : "r"(stackpointer));
@@ -160,7 +160,7 @@ struct minimal_stackframe {
 #define GST_ARCH_SETUP_STACK(sp) sp -= 4
 
 /***** S/390 *****/
-#elif defined(HAVE_CPU_S390)
+#elif defined(HAVE_CPU_S390) && defined(__GNUC__)
 
 #define GST_ARCH_SET_SP(stackpointer) \
     __asm__("lr 15,%0" : : "r"(stackpointer))
Index: gstreamer/gst/gstatomic_impl.h
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/gstatomic_impl.h,v
retrieving revision 1.1
diff -u -p -r1.1 gstatomic_impl.h
--- gstreamer/gst/gstatomic_impl.h	31 Dec 2002 03:21:07 -0000	1.1
+++ gstreamer/gst/gstatomic_impl.h	20 Jan 2003 14:37:23 -0000
@@ -33,7 +33,7 @@ G_BEGIN_DECLS
 #if defined (GST_CAN_INLINE) || defined (__GST_ATOMIC_C__)
   
 /***** Intel x86 *****/
-#if defined (HAVE_CPU_I386)
+#if defined (HAVE_CPU_I386) && defined(__GNUC__)
 
 #ifdef GST_CONFIG_NO_SMP
 #define SMP_LOCK ""
@@ -78,7 +78,7 @@ gst_atomic_int_dec_and_test (GstAtomicIn
 }
 
 /***** PowerPC *****/
-#elif defined (HAVE_CPU_PPC)
+#elif defined (HAVE_CPU_PPC) && defined(__GNUC__)
 
 #ifdef GST_CONFIG_NO_SMP
 #define SMP_SYNC        ""
@@ -154,7 +154,7 @@ gst_atomic_int_dec_and_test (GstAtomicIn
 }
 
 /***** DEC[/Compaq/HP?/Intel?] Alpha *****/
-#elif defined(HAVE_CPU_ALPHA)
+#elif defined(HAVE_CPU_ALPHA) && defined(__GNUC__)
 
 GST_INLINE_FUNC void 	gst_atomic_int_init 	(GstAtomicInt *aint, gint val) { aint->counter = val; }
 GST_INLINE_FUNC void 	gst_atomic_int_destroy 	(GstAtomicInt *aint) { } 
@@ -206,7 +206,7 @@ gst_atomic_int_dec_and_test (GstAtomicIn
 }
 
 /***** Sun SPARC *****/
-#elif defined(HAVE_CPU_SPARC)
+#elif defined(HAVE_CPU_SPARC) && defined(__GNUC__)
 
 GST_INLINE_FUNC void 	gst_atomic_int_destroy 	(GstAtomicInt *aint) { } 
 
@@ -285,7 +285,7 @@ gst_atomic_int_dec_and_test (GstAtomicIn
 }
 
 /***** MIPS *****/
-#elif defined(HAVE_CPU_MIPS)
+#elif defined(HAVE_CPU_MIPS) && defined(__GNUC__)
 
 GST_INLINE_FUNC void 	gst_atomic_int_init 	(GstAtomicInt *aint, gint val) { aint->counter = val; }
 GST_INLINE_FUNC void 	gst_atomic_int_destroy 	(GstAtomicInt *aint) { } 
@@ -336,7 +336,7 @@ gst_atomic_int_dec_and_test (GstAtomicIn
 }
 
 /***** S/390 *****/
-#elif defined(HAVE_CPU_S390)
+#elif defined(HAVE_CPU_S390) && defined(__GNUC__)
 
 GST_INLINE_FUNC void 	gst_atomic_int_init 	(GstAtomicInt *aint, gint val) { aint->counter = val; }
 GST_INLINE_FUNC void 	gst_atomic_int_destroy 	(GstAtomicInt *aint) { } 
Index: gstreamer/gst/gstinfo.c
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/gstinfo.c,v
retrieving revision 1.51
diff -u -p -r1.51 gstinfo.c
--- gstreamer/gst/gstinfo.c	13 Dec 2002 15:33:39 -0000	1.51
+++ gstreamer/gst/gstinfo.c	20 Jan 2003 14:37:23 -0000
@@ -564,7 +564,12 @@ gst_debug_print_stack_trace (void)
 
 #endif /* GST_ENABLE_FUNC_INTSTRUMENTATION */
 
+/* Forte does not work with non-static inline functions */
+#ifndef __sun
 inline void *
+#else
+void *
+#endif
 _gst_debug_register_funcptr (void *ptr, gchar *ptrname)
 {
   if (!__gst_function_pointers)
Index: gstreamer/gst/gstinfo.h
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/gstinfo.h,v
retrieving revision 1.39
diff -u -p -r1.39 gstinfo.h
--- gstreamer/gst/gstinfo.h	15 Jan 2003 21:42:30 -0000	1.39
+++ gstreamer/gst/gstinfo.h	20 Jan 2003 14:37:23 -0000
@@ -352,7 +352,12 @@ void gst_default_info_handler (gint cate
                                gint line,const gchar *debug_string,
                                void *element,gchar *string);
 
+/* Forte does not work with non-static inline functions */
+#ifdef __sun
+void * _gst_debug_register_funcptr (void *ptr, gchar *ptrname);
+#else
 inline void * _gst_debug_register_funcptr (void *ptr, gchar *ptrname);
+#endif
 
 extern GstInfoHandler _gst_info_handler;
 extern guint32 _gst_info_categories;
Index: gstreamer/gst/elements/gstmd5sink.c
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/elements/gstmd5sink.c,v
retrieving revision 1.7
diff -u -p -r1.7 gstmd5sink.c
--- gstreamer/gst/elements/gstmd5sink.c	29 Sep 2002 17:52:31 -0000	1.7
+++ gstreamer/gst/elements/gstmd5sink.c	20 Jan 2003 14:37:23 -0000
@@ -151,7 +151,11 @@ md5_process_bytes (const void *buffer, s
       size_t add = 128 - left_over > len ? len : 128 - left_over;
 
       /* Only put full words in the buffer.  */
+#ifdef __GNUC__
       add -= add % __alignof__ (guint32);
+#else
+      add -= add % 4;
+#endif
 
       memcpy (&ctx->buffer[left_over], buffer, add);
       ctx->buflen += add;
Index: gstreamer/libs/ext/cothreads/cothreads/cothreads.c
===================================================================
RCS file: /cvsroot/gstreamer/cothreads/cothreads/cothreads.c,v
retrieving revision 1.21
diff -u -p -r1.21 cothreads.c
--- gstreamer/libs/ext/cothreads/cothreads/cothreads.c	12 Sep 2002 19:28:28 -0000	1.21
+++ gstreamer/libs/ext/cothreads/cothreads/cothreads.c	20 Jan 2003 14:37:23 -0000
@@ -238,7 +238,14 @@ cothreads_get_chunk (void) 
 cothread*
 cothread_create (cothread_func func, int argc, void **argv, cothread *main)
 {
-  char *low, *high, *dest;
+#ifndef __GNUC__
+  char __csf;
+  char *low = &__csf;
+#else
+  char *low = CURRENT_STACK_FRAME;
+#endif
+
+  char *high, *dest;
   cothread_private priv;
   cothread *ret = NULL;
   cothread_chunk *chunk;
@@ -252,7 +259,6 @@ cothread_create (cothread_func func, int
   if (!func) {
     /* we are being asked to save the current thread into a new cothread. this
      * only happens for the first cothread in a thread. */
-    low = CURRENT_STACK_FRAME;
 #if PTH_STACK_GROWTH > 0
     dest = (char*) ((gulong)low | (chunk->size / chunk->nblocks - 1))
       + 1 - getpagesize() * 2;
@@ -302,7 +308,12 @@ cothread_create (cothread_func func, int
 cothread*
 cothread_self (void)
 {
+#ifndef __GNUC__
+  char __csf;
+  char *sp = &__csf;
+#else
   char *sp = CURRENT_STACK_FRAME;
+#endif
 
   return (cothread*)cothread_private_get (cothreads_get_chunk(), sp, NULL, sizeof (cothread_private));
 }
@@ -542,8 +553,13 @@ static cothread_chunk*
 cothread_chunk_new (glong size, gint nblocks)
 {
   cothread_chunk *ret;
+#ifndef __GNUC__
+  char __csf;
+  char *sp = &__csf;
+#else
   char *sp = CURRENT_STACK_FRAME;
-  
+#endif
+
   ret = g_new0 (cothread_chunk, 1);
   ret->nblocks = nblocks;
   ret->block_states = g_new0 (cothread_block_state, ret->nblocks);
Index: gstreamer/libs/ext/cothreads/tests/cothreads.c
===================================================================
RCS file: /cvsroot/gstreamer/cothreads/tests/cothreads.c,v
retrieving revision 1.13
diff -u -p -r1.13 cothreads.c
--- gstreamer/libs/ext/cothreads/tests/cothreads.c	13 Aug 2002 21:53:24 -0000	1.13
+++ gstreamer/libs/ext/cothreads/tests/cothreads.c	20 Jan 2003 14:37:23 -0000
@@ -10,7 +10,10 @@
 #include <errno.h>
 
 #define NGTHREADS 5
+/*
 #define MAIN_STACK_SIZE 0x0800000 	/* Apparently 6 MB is the largest stack
+*/
+#define MAIN_STACK_SIZE 0x0000200 	/* Apparently 6 MB is the largest stack
                                          * size available in linux while running
                                          * threads, so go with aligned 4 MB? */
 #define MAIN_STACK_NCOTHREADS 128	/* 64K stack size */


More information about the gstreamer-devel mailing list