Source: beast
Version: 0.7.1-5.2
Severity: serious
Tags: patch
Justification: no longer builds from source
beast failed to build from some on some architectures:
| gdk-pixbuf-csource --name=keyboard_pixstream keyboard.png >xgen-keyboard.c-temp && cp
xgen-keyboard.c-temp keyboard.c && rm -f xgen-keyboard.c-temp
| gdk-pixbuf-csource --name=virtual_input_pixstream virtual-input.png
>xgen-virtual-input.c-temp && cp xgen-virtual-input.c-temp virtual-input.c &&
rm -f xgen-virtual-input.c-temp
| gdk-pixbuf-csource --name=virtual_output_pixstream virtual-output.png
>xgen-virtual-output.c-temp && cp xgen-virtual-output.c-temp virtual-output.c
&& rm -f xgen-virtual-output.c-temp
| gdk-pixbuf-csource --name=virtual_synth_pixstream virtual-synth.png
>xgen-virtual-synth.c-temp && cp xgen-virtual-synth.c-temp virtual-synth.c &&
rm -f xgen-virtual-synth.c-temp
| gdk-pixbuf-csource --name=waveosc_pixstream waveosc.png >xgen-waveosc.c-temp && cp
xgen-waveosc.c-temp waveosc.c && rm -f xgen-waveosc.c-temp
| make[4]: Leaving directory `/build/buildd/beast-0.7.1/bse/icons'
| Making all in zintern
| make[4]: Entering directory `/build/buildd/beast-0.7.1/bse/zintern'
| ../../birnet/birnet-zintern -b -z wave-mono ./wave-mono.bse gus-patch
./gus-patch.bse > xgen-bzc \
| && echo "static const BseZFile bse_zfiles[] = {" >> xgen-bzc
\
| && for i in wave-mono gus-patch ; do \
| uname=$(echo $i | tr a-z- A-Z_);
\
| echo " { \"$i\", $uname""_SIZE, " >>xgen-bzc;
\
| echo " $uname""_DATA, G_N_ELEMENTS ($uname""_DATA) },"
>>xgen-bzc; \
| done
\
| && echo "};" >> xgen-bzc
\
| && cp xgen-bzc bse-zfile.c
\
| && rm -f xgen-bzc
| make[2]: make[3]: make[4]: *** [all-recursive] Terminated
| *** [all-recursive] Terminated
| *** [bse-zfile.c] Terminated
| make[1]: *** [all] Terminated
| make: *** [build-stamp] Terminated
| Build killed with signal 15 after 150 minutes of inactivity
The full build log is available here:
https://buildd.debian.org/fetch.cgi?pkg=beast&arch=powerpc&ver=0.7.1-5.2&stamp=1262051092&file=log&as=raw
My theory why that happens is as follows:
glib defines an external g_atomic_pointer_get() function *and*
g_atomic_pointer_get macro. On some architectures the macro expands to
a g_atomic_pointer_get function call. Beast defines its own
g_atomic_pointer_get function (it is C++ and it has a slightly different
prototype, so that's allowed) with g_atomic_pointer_get macro call
inside. Thus, we have an infinite recursion. Thanks to -O2's tail
recursive call optimizations we end up with infinite loop rather than
crash caused by stack overflow.
g_atomic_int_get() function is similarly affected.
I believe that the attached patch fixes this bug. However, it has *not*
been tested on any affected architecture.
--
Jakub Wilk
Index: beast-0.7.1/birnet/birnetthreadimpl.cc
===================================================================
--- beast-0.7.1.orig/birnet/birnetthreadimpl.cc 2009-12-29 23:33:24.000000000 +0100
+++ beast-0.7.1/birnet/birnetthreadimpl.cc 2009-12-29 23:34:24.000000000 +0100
@@ -1481,22 +1481,17 @@
abort(); /* silence compiler */
}
-#ifdef g_atomic_int_get
static int
-(g_atomic_int_get) (volatile int *atomic)
+birnet_atomic_int_get (volatile int *atomic)
{
return g_atomic_int_get (atomic);
}
-#endif
-#ifdef g_atomic_pointer_get
static void*
-(g_atomic_pointer_get) (void * volatile *atomic)
+birnet_atomic_pointer_get (void * volatile *atomic)
{
return (void*) g_atomic_pointer_get (atomic);
}
-#endif
-
static BirnetThreadTable fallback_thread_table = {
NULL, /* mutex_chain4init */
@@ -1506,7 +1501,7 @@
NULL, /* cond_chain4init */
NULL, /* cond_unchain */
(void (*) (volatile void*, volatile void*)) g_atomic_pointer_set,
- (void*(*) (volatile void*)) g_atomic_pointer_get,
+ (void*(*) (volatile void*)) birnet_atomic_pointer_get,
(int (*) (volatile void*, volatile void*, volatile void*)) g_atomic_pointer_compare_and_exchange,
g_atomic_int_set,
g_atomic_int_get,
@@ -1514,7 +1509,7 @@
(void (*) (volatile int*, int)) g_atomic_int_add,
(int (*) (volatile int*, int)) g_atomic_int_exchange_and_add,
(void (*) (volatile uint*, uint)) g_atomic_int_set,
- (uint (*) (volatile uint*)) g_atomic_int_get,
+ (uint (*) (volatile uint*)) birnet_atomic_int_get,
(int (*) (volatile uint*, uint, uint)) g_atomic_int_compare_and_exchange,
(void (*) (volatile uint*, uint)) g_atomic_int_add,
(uint (*) (volatile uint*, uint)) g_atomic_int_exchange_and_add,