Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Another GC related crash, now 100% reproduceable. #69

Open
hugopl opened this issue Jun 13, 2020 · 7 comments
Open

Another GC related crash, now 100% reproduceable. #69

hugopl opened this issue Jun 13, 2020 · 7 comments

Comments

@hugopl
Copy link
Contributor

hugopl commented Jun 13, 2020

I thought about create this issue at malloc_pthread_shim shard, but as it's a fix for this one, I created here, please correct me if this isn't the right place.

To reproduce the crash:

$ git clone https://github.com/hugopl/tijolo.git
$ cd tijolo && git checkout 5b55a519e37c0c02fb4eed56cbf5f8be87494fe8
$ shards build
$ ./bin/tijolo

The crash doesn't happen with GC disabled. I tried to reduce the code to create a minimal example, but seems that it was not enough entropy to trigger the bug.

If I remove the require "malloc_pthread_shim" at src.main.cr it works... but crash later on GtkSource::Language.set_language as expected.

If I comment lines 66 and 68 (some signal connections) at src/application.cr it works... but probably just a coincidence.... anyway the crash happens inside the setup_actions.

Here's the output with the following libraries compiled as debug:

libgailutil-3.so
libgdk-3.so
libgio-2.0.so
libglib-2.0.so
libgmodule-2.0.so
libgobject-2.0.so
libgthread-2.0.so
libgtk-3.so
$ LD_LIBRARY_PATH=/opt/debug/usr/lib/ GC_PRINT_VERBOSE_STATS=1 ./bin/tijolo
Grow heap to 64 KiB after 0 bytes allocated
Number of processors = 8
Started 7 mark helper threads
Initiating full world-stop collection!
0 bytes in heap blacklisted for interior pointers

--> Marking for collection #1 after 0 allocated bytes
Pushed 1 thread stacks
Starting marking for mark phase number 0
Starting mark helper 0
Starting mark helper 1
Starting mark helper 2
Starting mark helper 3
Starting mark helper 4
Starting mark helper 5
Starting mark helper 6
Starting mark helper 7
Finished mark helper 0
Finished mark helper 7
Finished mark helper 4
Finished mark helper 2
Finished mark helper 1
Finished mark helper 6
Finished mark helper 5
Finished mark helper 3
Finished marking for mark phase number 0
GC #1 freed 0 bytes, heap 64 KiB (+ 0 KiB unmapped)
World-stopped marking took 1 msecs (1 in average)
Bytes recovered before sweep - f.l. count = 0
In-use heap: 0% (0 KiB pointers + 0 KiB other)
Immediately reclaimed 0 bytes, heapsize: 65536 bytes (0 unmapped)
0 finalization entries; 0/0 short/long disappearing links alive
0 finalization-ready objects; 0/0 short/long links cleared
Finalize plus initiate sweep took 0 + 0 msecs
Complete collection took 1 msecs
Adding block map for size of 3 granules (48 bytes)
Grow heap to 156 KiB after 48 bytes allocated
Adding block map for size of 0 granules (0 bytes)
Adding block map for size of 1 granules (16 bytes)
Adding block map for size of 16 granules (256 bytes)
Adding block map for size of 32 granules (512 bytes)
Adding block map for size of 128 granules (2048 bytes)
Adding block map for size of 2 granules (32 bytes)
Adding block map for size of 4 granules (64 bytes)
Adding block map for size of 6 granules (96 bytes)
Adding block map for size of 9 granules (144 bytes)
Adding block map for size of 5 granules (80 bytes)
Adding block map for size of 8 granules (128 bytes)
Adding block map for size of 10 granules (160 bytes)
Adding block map for size of 12 granules (192 bytes)
Grow heap to 220 KiB after 112400 bytes allocated
Adding block map for size of 64 granules (1024 bytes)
Grew fo table to 1 entries
Adding block map for size of 15 granules (240 bytes)
Grew fo table to 2 entries
Grow heap to 296 KiB after 140448 bytes allocated
Adding block map for size of 11 granules (176 bytes)
Grew fo table to 4 entries
Adding block map for size of 7 granules (112 bytes)
Adding block map for size of 17 granules (272 bytes)
Grew fo table to 8 entries
Grew dl table to 1 entries
Adding block map for size of 13 granules (208 bytes)
Grew dl table to 2 entries
Adding block map for size of 21 granules (336 bytes)
Grow heap to 396 KiB after 179504 bytes allocated
Adding block map for size of 20 granules (320 bytes)
Adding block map for size of 14 granules (224 bytes)
Grew fo table to 16 entries
Initiating full world-stop collection!
0 bytes in heap blacklisted for interior pointers

--> Marking for collection #2 after 242816 allocated bytes
Pushed 1 thread stacks
Starting marking for mark phase number 1
Starting mark helper 0
Starting mark helper 1
Starting mark helper 2
Starting mark helper 3
Starting mark helper 4
Starting mark helper 5
Starting mark helper 6
Finished mark helper 3
Finished mark helper 4
Finished mark helper 5
Finished mark helper 0
Finished mark helper 6
Finished mark helper 1
Finished mark helper 2
Finished marking for mark phase number 1
GC #2 freed 0 bytes, heap 396 KiB (+ 0 KiB unmapped)
World-stopped marking took 1 msecs (1 in average)
Bytes recovered before sweep - f.l. count = -126240
In-use heap: 54% (209 KiB pointers + 5 KiB other)
Immediately reclaimed -109856 bytes, heapsize: 405504 bytes (0 unmapped)
10 finalization entries; 3/0 short/long disappearing links alive
1 finalization-ready objects; 0/0 short/long links cleared
Finalize plus initiate sweep took 0 + 0 msecs
Complete collection took 1 msecs
Grow heap to 580 KiB after 0 bytes allocated
Adding block map for size of 42 granules (672 bytes)
Adding block map for size of 24 granules (384 bytes)
Adding block map for size of 50 granules (800 bytes)
Adding block map for size of 84 granules (1344 bytes)
Grow heap to 776 KiB after 354400 bytes allocated
Grow heap to 1036 KiB after 750640 bytes allocated
Adding block map for size of 18 granules (288 bytes)
Initiating full world-stop collection!
4096 bytes in heap blacklisted for interior pointers

--> Marking for collection #3 after 2088480 allocated bytes
Pushed 2 thread stacks
Starting marking for mark phase number 2
Starting mark helper 0
Starting mark helper 1
Starting mark helper 2
Starting mark helper 3
Starting mark helper 4
Starting mark helper 5
Starting mark helper 6
Starting mark helper 7
Finished mark helper 7
Finished mark helper 6
Finished mark helper 0
Finished mark helper 2
Finished mark helper 5
Finished mark helper 1
Finished mark helper 3
Finished mark helper 4
Finished marking for mark phase number 2
Recycle 65536/65536 scratch-allocated bytes at 0x7f6392888000
Grew mark stack to 8192 frames
GC #3 freed -24416 bytes, heap 1100 KiB (+ 0 KiB unmapped)
World-stopped marking took 2 msecs (1 in average)
Bytes recovered before sweep - f.l. count = -230480
In-use heap: 59% (652 KiB pointers + 7 KiB other)
Immediately reclaimed -222288 bytes, heapsize: 1126400 bytes (0 unmapped)
10 finalization entries; 3/0 short/long disappearing links alive
2 finalization-ready objects; 0/0 short/long links cleared
Finalize plus initiate sweep took 0 + 0 msecs
Complete collection took 2 msecs
Adding block map for size of 19 granules (304 bytes)
Adding block map for size of 23 granules (368 bytes)
Grow heap to 1468 KiB after 107824 bytes allocated
Adding block map for size of 22 granules (352 bytes)
Grow heap to 1960 KiB after 607136 bytes allocated
Initiating full world-stop collection!
0 bytes in heap blacklisted for interior pointers

--> Marking for collection #4 after 1296688 allocated bytes
Pushed 3 thread stacks
Starting marking for mark phase number 3
Starting mark helper 0
Starting mark helper 1
Starting mark helper 2
Starting mark helper 3
Starting mark helper 4
Starting mark helper 5
Starting mark helper 6
Starting mark helper 7
Finished mark helper 4
Finished mark helper 6
Finished mark helper 7
Finished mark helper 2
Finished mark helper 1
Finished mark helper 5
Finished mark helper 3
Finished mark helper 0
Finished marking for mark phase number 3
Recycle 131072/131072 scratch-allocated bytes at 0x7f63895c1000
Grew mark stack to 16384 frames
GC #4 freed -92608 bytes, heap 2088 KiB (+ 0 KiB unmapped)
World-stopped marking took 3 msecs (1 in average)
Bytes recovered before sweep - f.l. count = -100080
In-use heap: 72% (1502 KiB pointers + 5 KiB other)
Immediately reclaimed -91888 bytes, heapsize: 2138112 bytes (0 unmapped)
10 finalization entries; 3/0 short/long disappearing links alive
0 finalization-ready objects; 0/0 short/long links cleared
Finalize plus initiate sweep took 0 + 0 msecs
Complete collection took 3 msecs
Grow heap to 2792 KiB after 149440 bytes allocated
Grow heap to 3724 KiB after 978080 bytes allocated
Initiating full world-stop collection!
12288 bytes in heap blacklisted for interior pointers

--> Marking for collection #5 after 2542128 allocated bytes
Pushed 3 thread stacks
Starting marking for mark phase number 4
Starting mark helper 0
Starting mark helper 1
Starting mark helper 2
Starting mark helper 3
Starting mark helper 4
Starting mark helper 5
Starting mark helper 6
Starting mark helper 7
Finished mark helper 0
Finished mark helper 6
Finished mark helper 3
Finished mark helper 4
Finished mark helper 2
Finished mark helper 7
Finished mark helper 1
Finished mark helper 5
Finished marking for mark phase number 4
Recycle 262144/262144 scratch-allocated bytes at 0x7f6388c27000
Grew mark stack to 32768 frames
GC #5 freed -45568 bytes, heap 3980 KiB (+ 0 KiB unmapped)
World-stopped marking took 5 msecs (2 in average)
Bytes recovered before sweep - f.l. count = -77136
In-use heap: 80% (3185 KiB pointers + 5 KiB other)
Immediately reclaimed -64848 bytes, heapsize: 4075520 bytes (0 unmapped)
10 finalization entries; 3/0 short/long disappearing links alive
0 finalization-ready objects; 0/0 short/long links cleared
Finalize plus initiate sweep took 0 + 0 msecs
Complete collection took 6 msecs
Grow heap to 5308 KiB after 343744 bytes allocated
Invalid memory access (signal 11) at address 0x78b
Segmentation fault (core dumped)

exitcode 139.

GDB information about the crash:

(gdb) info threads
  Id   Target Id                                  Frame 
  1    Thread 0x7ffff4116980 (LWP 18561) "tijolo" 0x00007ffff6dda8f4 in do_futex_wait.constprop () from /usr/lib/libpthread.so.0
  2    Thread 0x7ffff4105700 (LWP 18565) "tijolo" 0x00007ffff6dd7e32 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
  3    Thread 0x7ffff3904700 (LWP 18566) "tijolo" 0x00007ffff6dd7e32 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
  4    Thread 0x7ffff3103700 (LWP 18567) "tijolo" 0x00007ffff6dd7e32 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
  5    Thread 0x7ffff2902700 (LWP 18568) "tijolo" 0x00007ffff6dd7e32 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
  6    Thread 0x7ffff2101700 (LWP 18569) "tijolo" 0x00007ffff6dd7e32 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
  7    Thread 0x7ffff1900700 (LWP 18570) "tijolo" 0x00007ffff6dd7e32 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
  8    Thread 0x7ffff10ff700 (LWP 18571) "tijolo" 0x00007ffff6dd7e32 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
* 9    Thread 0x7fffef4f4700 (LWP 18572) "gmain"  0x00007ffff6c7605f in poll () from /usr/lib/libc.so.6

Thread 9 backtrace:

#0  0x00007ffff6c7605f in poll () from /usr/lib/libc.so.6
#1  0x00007ffff70b4f28 in g_main_context_poll (priority=<optimized out>, n_fds=1, fds=0x7fffef807c50, timeout=<optimized out>, context=0x7fffef8839a0) at ../glib/glib/gmain.c:4346
#2  g_main_context_iterate.constprop.0 (context=context@entry=0x7fffef8839a0, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/glib/gmain.c:4042
#3  0x00007ffff7066211 in g_main_context_iteration (context=0x7fffef8839a0, may_block=may_block@entry=1) at ../glib/glib/gmain.c:4108
#4  0x00007ffff7066262 in glib_worker_main (data=<optimized out>) at ../glib/glib/gmain.c:5996
#5  0x00007ffff708f501 in g_thread_proxy (data=0x7fffef7fb360) at ../glib/glib/gthread.c:807
#6  0x00007ffff6e0eb35 in ?? () from /usr/lib/libgc.so.1
#7  0x00007ffff6dfcda7 in GC_call_with_stack_base () from /usr/lib/libgc.so.1
#8  0x00007ffff6dd1422 in start_thread () from /usr/lib/libpthread.so.0
#9  0x00007ffff6c80bf3 in clone () from /usr/lib/libc.so.6

Thread 1 backtrace:

#0  0x00007ffff6dda8f4 in do_futex_wait.constprop () from /usr/lib/libpthread.so.0
#1  0x00007ffff6dda9f8 in __new_sem_wait_slow.constprop.0 () from /usr/lib/libpthread.so.0
#2  0x00007ffff6df3454 in ?? () from /usr/lib/libgc.so.1
#3  0x00007ffff6e01ef9 in ?? () from /usr/lib/libgc.so.1
#4  0x00007ffff6e020bc in ?? () from /usr/lib/libgc.so.1
#5  0x00007ffff6e06a8a in ?? () from /usr/lib/libgc.so.1
#6  0x00007ffff6e06eaf in ?? () from /usr/lib/libgc.so.1
#7  0x00007ffff6e072b7 in ?? () from /usr/lib/libgc.so.1
#8  0x00007ffff6e0b61a in GC_generic_malloc () from /usr/lib/libgc.so.1
#9  0x00007ffff6e0b875 in GC_malloc_kind_global () from /usr/lib/libgc.so.1
#10 0x00007ffff6e0da34 in GC_posix_memalign () from /usr/lib/libgc.so.1
#11 0x0000555555625096 in posix_memalign () at /home/hugo/src/tijolo/lib/malloc_pthread_shim/src/malloc_pthread_shim.cr:200
#12 0x00007ffff708463a in allocator_memalign (memsize=2032, alignment=2048) at ../glib/glib/gslice.c:1411
#13 allocator_add_slab (allocator=0x7ffff713cf00 <allocator>, chunk_size=128, ix=<optimized out>) at ../glib/glib/gslice.c:1283
#14 slab_allocator_alloc_chunk (chunk_size=chunk_size@entry=128) at ../glib/glib/gslice.c:1329
#15 0x00007ffff7085df3 in magazine_cache_pop_magazine (countp=0x7ffff08ed888, ix=7) at ../glib/glib/gslice.c:730
#16 thread_memory_magazine1_reload (ix=7, tmem=<optimized out>) at ../glib/glib/gslice.c:800
#17 g_slice_alloc (mem_size=mem_size@entry=120) at ../glib/glib/gslice.c:1013
#18 0x00007ffff7085e4b in g_slice_alloc0 (mem_size=mem_size@entry=120) at ../glib/glib/gslice.c:1050
#19 0x00007ffff716e629 in g_type_create_instance (type=<optimized out>) at ../glib/gobject/gtype.c:1849
#20 0x00007ffff715ad29 in g_param_spec_internal (param_type=140737288140192, name=name@entry=0x7ffff72e1eed "fd", nick=0x7ffff72d9874 "File descriptor", blurb=blurb@entry=0x7ffff72d9858 "The sockets file descriptor", 
    flags=flags@entry=235) at ../glib/gobject/gparam.c:445
#21 0x00007ffff715af8b in g_param_spec_int (name=name@entry=0x7ffff72e1eed "fd", nick=<optimized out>, blurb=blurb@entry=0x7ffff72d9858 "The sockets file descriptor", minimum=minimum@entry=-2147483648, maximum=maximum@entry=2147483647, 
    default_value=default_value@entry=-1, flags=235) at ../glib/gobject/gparamspecs.c:1784
#22 0x00007ffff7222bb1 in g_socket_class_init (klass=0x7fffef899a80) at ../glib/gio/gsocket.c:961
#23 g_socket_class_intern_init (klass=0x7fffef899a80) at ../glib/gio/gsocket.c:268
#24 0x00007ffff7175092 in type_class_init_Wm (pclass=0x7ffff4110d80, node=0x7fffef83ed20) at ../glib/gobject/gtype.c:2235
#25 g_type_class_ref (type=<optimized out>) at ../glib/gobject/gtype.c:2950
#26 0x00007ffff729d2c1 in ensure_type (gtype=<optimized out>) at ../glib/gio/gdbusprivate.c:222
#27 ensure_required_types () at ../glib/gio/gdbusprivate.c:261
#28 _g_dbus_initialize () at ../glib/gio/gdbusprivate.c:1972
#29 0x00007ffff7291b1a in _g_dbus_initialize () at ../glib/gio/gdbusconnection.c:7334
#30 g_bus_get_sync (bus_type=G_BUS_TYPE_SESSION, cancellable=0x0, error=0x0) at ../glib/gio/gdbusconnection.c:7326
#31 0x00007ffff725fdb9 in g_application_impl_register (error=0x7fffffffdf20, cancellable=0x0, remote_actions=0x7fffef896098, exported_actions=0x7ffff08b1210, flags=G_APPLICATION_NON_UNIQUE, appid=0x7ffff4107880 "io.github.hugopl.Tijolo", 
    application=0x7fffef8960f0) at ../glib/gio/gapplicationimpl-dbus.c:601
#32 g_application_register (application=application@entry=0x7fffef8960f0, cancellable=cancellable@entry=0x0, error=error@entry=0x7fffffffdf20) at ../glib/gio/gapplication.c:2188
#33 0x00007ffff72608ac in g_application_real_local_command_line (application=0x7fffef8960f0, arguments=0x7fffffffdf88, exit_status=0x7fffffffdf84) at ../glib/gio/gapplication.c:1106
#34 0x00007ffff7260c0a in g_application_run (application=0x7fffef8960f0, argc=-8316, argv=<optimized out>) at ../glib/gio/gapplication.c:2528
#35 0x000055555570d496 in run () at /home/hugo/src/tijolo/lib/gobject/src/gtk/gtk.cr:4
#36 0x000055555570c88d in run () at /home/hugo/src/tijolo/src/application.cr:131
#37 0x0000555555609e59 in __crystal_main () at /home/hugo/src/tijolo/src/main.cr:18
#38 0x0000555555785e66 in main_user_code () at /usr/lib/crystal/crystal/main.cr:105
#39 0x0000555555785cfc in main () at /usr/lib/crystal/crystal/main.cr:91
#40 0x0000555555615026 in main () at /usr/lib/crystal/crystal/main.cr:114

The other threads were just waiting...

#0  0x00007ffff6dd7e32 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0
#1  0x00007ffff6dfc555 in ?? () from /usr/lib/libgc.so.1
#2  0x00007ffff6dfc657 in ?? () from /usr/lib/libgc.so.1
#3  0x00007ffff6dd1422 in start_thread () from /usr/lib/libpthread.so.0
#4  0x00007ffff6c80bf3 in clone () from /usr/lib/libc.so.6

Environment: Archlinux, crystal 0.35, and debug versions of following Gtk packages: glib2 2.64.2-1, gtk3 1:3.24.20-1, gtksourceview4 4.6.0-1.

@hugopl
Copy link
Contributor Author

hugopl commented Jun 13, 2020

Ah, additional info, I was using the experimental branch of jhass/crystal-malloc_pthread_shim.

  malloc_pthread_shim:
    github: jhass/crystal-malloc_pthread_shim
    branch: track_alignments

If I use the master branch it works... and with this information I start to believe that this issue should be filled against jhass/crystal-malloc_pthread_shim, not here, hehe

@jhass
Copy link
Owner

jhass commented Jun 13, 2020

Uh. How exhausting. I'll have to see when I have more motivation to look into this to be honest :P

@hugopl
Copy link
Contributor Author

hugopl commented Jun 13, 2020

Uh. How exhausting. I'll have to see when I have more motivation to look into this to be honest :P

I understand, this isn't simple stuff and easily keep someone busy for days.

I'm going to try the approach of compile a patched GLib and link against it, replacing g_malloc, g_realloc, etc.. with the GC_MALLOC_ATOMIC and friends to see if I have some success.

IMO this isn't even a bug in your generator, but a lack of support for C libraries using they own allocators, etc from Crystal side.

@hugopl
Copy link
Contributor Author

hugopl commented Jun 27, 2020

I spent some time today trying to fix this like, my approach was:

  1. Overide all pthread calls and redirect then to GC_ versions (loaded with GC_dlopen)
  2. Overide GC_ functions and let them set inside_gc=1, then call the overided pthread calls.
  3. overrided pthread calls redirect the call to the real pthread calls if inside GC or to the overrided GC otherwise.

Something like:

// INIT_FIX just init all these real_* pointers and put then in thread local variables.
int GC_pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *args) {
  INIT_FIX;
  inside_gc = 1;
  int res = real_GC_pthread_create(thread, attr, start_routine, args);
  inside_gc = 0;
  return res;
}

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *args) {
  INIT_FIX;
  if (inside_gc)
    return real_pthread_create(thread, attr, start_routine, args);
  else
    return GC_pthread_create(thread, attr, start_routine, args);
}

I got happy for few moments... because it seems to work... but not, still getting crashes.

Seems GCJ (java gcc compiler) had this very same problem 14 years ago https://www.redhat.com/archives/fedora-devel-java-list/2006-January/msg00002.html

Another approach I did was to start from glib functions, and set a flag to know if I was inside a glib function that calls pthread... to then call the GC version, got fewer crashes, but didn't work anyway.

So my question is, why the shim need to touch the malloc and friends? Is not this just a problem about glib not tell GC that there's a new thread in town?

BTW, the shim doesn't work with -Dpreview-mt.

@hugopl
Copy link
Contributor Author

hugopl commented Jun 28, 2020

Enough for today, but I found something that seems interesting for this issue:

https://github.com/kubo/plthook

I'm going to try this next time I stop to try to fix this issue.

@jhass
Copy link
Owner

jhass commented Jun 28, 2020

So my question is, why the shim need to touch the malloc and friends? Is not this just a problem about glib not tell GC that there's a new thread in town?

As I understand it bdwgc allocates using sbrk, so it needs to be made aware of any malloced memory to not clobber it. Wrapping the phtread stuff is merely for registering the new stack to scan for live objects.

While https://github.com/ivmai/bdwgc/blob/6d4517c20d33ee6924dbc0d36ba3f8b358d1703e/doc/README.linux#L31-L47 does not mention malloc and I cannot find an explicit statement that all malloc calls should be GC_malloc calls, there's several hints towards that:

The README has this snippet quite prominently:

 #define malloc(n) GC_malloc(n)
#define calloc(m,n) GC_malloc((m)*(n))

There's this note: https://github.com/ivmai/bdwgc/blob/6d4517c20d33ee6924dbc0d36ba3f8b358d1703e/include/gc_pthread_redirects.h#L27-L34

There's this macro: https://github.com/ivmai/bdwgc/blob/b6d93860a38275f4251929d3da7361b5e1419655/doc/README.macros#L223-L238

So yeah, I'm not sure about that but iirc I was still getting crashes or clobbered memory when just redirecting pthread functions on our original case.

hugopl added a commit to hugopl/tijolo that referenced this issue Aug 7, 2020
See jhass/crystal-gobject#69 for more info on why this.
@hugopl
Copy link
Contributor Author

hugopl commented Aug 9, 2020

I just released my pet project, posting just to say thank you very much for the fast responses/fixes on all issues I reported, this made the my project exists... and in Crystal :-).

The 0.1.0 release is shipping with GC disabled by default (sic), I plan to just implement few more things and then back to this issue. Last time I tried to mimic what inkscape does before init GC but just got some beautiful crashes at startup...

Inkscape set these flags:

LibGC.set_no_dls(1)
LibGC.set_all_interior_pointers(1)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants