I've seen this being discussed.

On 12.04, and potentially other systems, LMMS crashes on close.
Upon investigation, I found that some plugin code was being initiated and destroyed twice. The cause is that a C code function named "_fini()" in gcc is automatically called when a shared library is closed.
The same is also true when using "__attribute__((destructor))".
Some plugins use both "__attribute__((destructor))" and "_fini()".

Basically, some plugins "_fini()" functions are being called twice.
This seems like a GCC bug, as I don't think when using "__attribute__((destructor)) void _fini()" we should get that called twice. The fact that the issue is not present on 14.04 kinda confirms this for me (newer gcc version fixes the issue?)

Anyway, attached is a patch to fix this.
If by some reason the patch is not there, use this url: http://kxstudio.sourceforge.net/Paste/repo/xxYln

and congrats on the 1.0 release! :)

--- lmms-1.0.0.orig/plugins/LadspaEffect/caps/interface.cc
+++ lmms-1.0.0/plugins/LadspaEffect/caps/interface.cc
@@ -70,7 +70,7 @@ seed()
 extern "C" {
 
 __attribute__ ((constructor)) 
-void _init()
+void caps_so_init()
 {
 	DescriptorStub ** d = descriptors;
 
@@ -126,7 +126,7 @@ void _init()
 }
 
 __attribute__ ((destructor)) 
-void _fini()
+void caps_so_fini()
 {
 	for (ulong i = 0; i < N; ++i)
 		delete descriptors[i];
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_pinknoise.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_pinknoise.c
@@ -225,10 +225,10 @@ LADSPA_Descriptor * mono_descriptor = NU
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -325,9 +325,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(mono_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_eq.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_eq.c
@@ -494,7 +494,7 @@ run_adding_eq(LADSPA_Handle instance, un
 
 
 void
-__attribute__((constructor)) _init() {
+ _init() {
 
 	char **port_names;
 	LADSPA_PortDescriptor *port_descriptors;
@@ -765,7 +765,7 @@ __attribute__((constructor)) _init() {
 
 
 void 
-__attribute__((destructor)) _fini() {
+ _fini() {
 
 	if (eqDescriptor) {
 		free((LADSPA_PortDescriptor *)eqDescriptor->PortDescriptors);
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_sigmoid.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_sigmoid.c
@@ -228,10 +228,10 @@ cleanup_Sigmoid(LADSPA_Handle Instance)
 LADSPA_Descriptor * mono_descriptor = NULL;
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -318,9 +318,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(mono_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_eqbw.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_eqbw.c
@@ -596,7 +596,7 @@ run_adding_eq(LADSPA_Handle instance, un
 
 
 void
-__attribute__((constructor)) _init() {
+ _init() {
 
 	char **port_names;
 	LADSPA_PortDescriptor *port_descriptors;
@@ -955,7 +955,7 @@ __attribute__((constructor)) _init() {
 
 
 void 
-__attribute__((destructor)) _fini() {
+ _fini() {
 
 	if (eqDescriptor) {
 		free((LADSPA_PortDescriptor *)eqDescriptor->PortDescriptors);
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_tremolo.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_tremolo.c
@@ -220,10 +220,10 @@ LADSPA_Descriptor * mono_descriptor = NU
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -323,9 +323,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(mono_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_dynamics_m.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_dynamics_m.c
@@ -516,10 +516,10 @@ LADSPA_Descriptor * mono_descriptor = NU
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -646,9 +646,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(mono_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_reflector.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_reflector.c
@@ -378,10 +378,10 @@ LADSPA_Descriptor * mono_descriptor = NU
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	int i;
 	char ** port_names;
@@ -480,9 +480,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(mono_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_echo.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_echo.c
@@ -436,10 +436,10 @@ LADSPA_Descriptor * stereo_descriptor =
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -607,9 +607,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(stereo_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_dynamics_st.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_dynamics_st.c
@@ -696,10 +696,10 @@ LADSPA_Descriptor * stereo_descriptor =
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -857,9 +857,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(stereo_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_vibrato.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_vibrato.c
@@ -308,10 +308,10 @@ LADSPA_Descriptor * mono_descriptor = NU
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+_init() {
 	
 	int i;
 	char ** port_names;
@@ -425,9 +425,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+_fini() {
 	delete_descriptor(mono_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_rotspeak.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_rotspeak.c
@@ -624,10 +624,10 @@ LADSPA_Descriptor * stereo_descriptor =
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	int i;
 	char ** port_names;
@@ -748,9 +748,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(stereo_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_doubler.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_doubler.c
@@ -574,10 +574,10 @@ LADSPA_Descriptor * stereo_descriptor =
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -717,9 +717,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(stereo_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_chorusflanger.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_chorusflanger.c
@@ -436,10 +436,10 @@ LADSPA_Descriptor * stereo_descriptor =
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -575,9 +575,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(stereo_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_reverb.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_reverb.c
@@ -665,10 +665,10 @@ LADSPA_Descriptor * stereo_descriptor =
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -815,9 +815,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(stereo_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_pitch.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_pitch.c
@@ -418,10 +418,10 @@ LADSPA_Descriptor * mono_descriptor = NU
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	int i;
 	char ** port_names;
@@ -536,9 +536,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(mono_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_tubewarmth.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_tubewarmth.c
@@ -381,10 +381,10 @@ LADSPA_Descriptor * mono_descriptor = NU
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -471,9 +471,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(mono_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_limiter.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_limiter.c
@@ -324,10 +324,10 @@ LADSPA_Descriptor * mono_descriptor = NU
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	char ** port_names;
 	LADSPA_PortDescriptor * port_descriptors;
@@ -423,9 +423,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(mono_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_deesser.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_deesser.c
@@ -349,10 +349,10 @@ LADSPA_Descriptor * mono_descriptor = NU
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+ _init() {
 	
 	int i;
 	char ** port_names;
@@ -471,9 +471,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+ _fini() {
 	delete_descriptor(mono_descriptor);
 }
 
--- lmms-1.0.0.orig/plugins/LadspaEffect/tap/tap_autopan.c
+++ lmms-1.0.0/plugins/LadspaEffect/tap/tap_autopan.c
@@ -233,10 +233,10 @@ LADSPA_Descriptor * mono_descriptor = NU
 
 
 
-/* __attribute__((constructor)) _init() is called automatically when the plugin library is first
+/*  _init() is called automatically when the plugin library is first
    loaded. */
 void 
-__attribute__((constructor)) _init() {
+_init() {
 	
 	int i;
 	char ** port_names;
@@ -341,9 +341,9 @@ delete_descriptor(LADSPA_Descriptor * de
 }
 
 
-/* __attribute__((destructor)) _fini() is called automatically when the library is unloaded. */
+/*  _fini() is called automatically when the library is unloaded. */
 void
-__attribute__((destructor)) _fini() {
+_fini() {
 	delete_descriptor(mono_descriptor);
 }
 
------------------------------------------------------------------------------
_______________________________________________
LMMS-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/lmms-devel

Reply via email to