Vala: non GObject derived classes are not threadsafe
When a Vala
class is accessed from different threads, there are segfaults. Following example expose this issue:
public class KTest.A {
static async void call_1 (Vala.List<Vala.SourceFile> files) {
yield call_2 (files);
}
static async void call_2 (Vala.List<Vala.SourceFile> files) {
yield call_3 (files);
}
static async void call_3 (Vala.List<Vala.SourceFile> files) {
yield traverse (files);
}
static async void traverse (Vala.List<Vala.SourceFile> files) {
foreach (Vala.SourceFile sf in files) {
stdout.printf ("Source: %s\n", sf.filename);
if ("glib-2.0" in sf.filename) {
stdout.printf ("Iterate over package...\n");
foreach (Vala.CodeNode cn in sf.get_nodes ()) {
if (cn is Vala.Symbol)
if (cn is Vala.Namespace) {
stdout.printf ("Name: %s\n", ((Vala.Symbol) cn).name);
if (((Vala.Symbol) cn).parent_symbol != null) {
stdout.printf ("Parent's Name: %s\n", ((Vala.Symbol) cn).parent_symbol.name);
}
}
if (cn is Vala.ObjectTypeSymbol) {
Vala.ObjectTypeSymbol otype = (Vala.ObjectTypeSymbol) cn;
if (!("string" in otype.name)) {
continue;
}
foreach (Vala.Method method in otype.get_methods ()) {
stdout.printf ("Method: %s : %s : %s\n", method.name, method.get_full_name (), method.source_reference.to_string ());
}
}
}
}
}
}
static async Vala.List<Vala.SourceFile> compile () {
var context = new Vala.CodeContext ();
Vala.CodeContext.push (context);
context.add_external_package ("glib-2.0");
context.add_external_package ("gobject-2.0");
var parser = new Vala.Parser ();
parser.parse (context);
context.check ();
Vala.CodeContext.pop ();
return context.get_source_files ();
}
public static int main () {
var loop = new GLib.MainLoop ();
GLib.Idle.add (()=>{
compile.begin ((o,r)=>{
var files = compile.end (r);
call_1.begin (files, ()=>{
loop.quit ();
});
});
return GLib.Source.REMOVE;
});
loop.run ();
return 0;
}
}
Crash backtrace:
[New Thread 0x7ffff7635700 (LWP 9224)]
Source: /usr/share/vala-0.48/vapi/glib-2.0.vapi
Iterate over package...
Thread 1 "issue" received signal SIGSEGV, Segmentation fault.
0x00007ffff7d3580d in vala_symbol_get_owner () from /lib64/libvala-0.48.so.0
Missing separate debuginfos, use: dnf debuginfo-install libvala-0.48.3-1.fc32.x86_64 pcre2-10.34-9.fc32.x86_64 zlib-1.2.11-21.fc32.x86_64
(gdb) bt
#0 0x00007ffff7d3580d in vala_symbol_get_owner () at /lib64/libvala-0.48.so.0
#1 0x00007ffff7d35852 in vala_symbol_get_parent_symbol ()
at /lib64/libvala-0.48.so.0
#2 0x00007ffff7d36210 in vala_symbol_get_full_name ()
at /lib64/libvala-0.48.so.0
#3 0x00007ffff7d3627d in vala_symbol_get_full_name ()
at /lib64/libvala-0.48.so.0
#4 0x00007ffff7d3627d in vala_symbol_get_full_name ()
at /lib64/libvala-0.48.so.0
#5 0x000000000040387b in ktest_a_traverse_co ()
#6 0x0000000000402dab in ktest_a_traverse ()
#7 0x0000000000402c1e in ktest_a_call_3_co ()
#8 0x0000000000402b43 in ktest_a_call_3 ()
#9 0x00000000004029b6 in ktest_a_call_2_co ()
#10 0x00000000004028db in ktest_a_call_2 ()
#11 0x000000000040274e in ktest_a_call_1_co ()
#12 0x0000000000402673 in ktest_a_call_1 ()
#13 0x0000000000403fae in __lambda5_ ()
#14 0x0000000000403ff6 in ___lambda5__gasync_ready_callback ()
#15 0x00007ffff7e81e9a in g_task_return_now (task=task@entry=0x419820 [GTask])
at ../gio/gtask.c:1214
#16 0x00007ffff7e81edd in complete_in_idle_cb (task=task@entry=0x419820)
at ../gio/gtask.c:1228
#17 0x00007ffff7ac244b in g_idle_dispatch
(source=source@entry=0x142edb0, callback=0x7ffff7e81ed0 <complete_in_idle_cb>, user_data=0x419820) at ../glib/gmain.c:5755
#18 0x00007ffff7ac676f in g_main_dispatch (context=0x415500)
at ../glib/gmain.c:3309
#19 g_main_context_dispatch (context=0x415500) at ../glib/gmain.c:3974
#20 0x00007ffff7ac6af8 in g_main_context_iterate
(context=0x415500, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4047
#21 0x00007ffff7ac6e0b in g_main_loop_run (loop=0x411050)
at ../glib/gmain.c:4241
#22 0x00000000004040d6 in ktest_a_main ()
#23 0x000000000040410a in main ()
Edited by Daniel Espinosa Ortiz