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