Re: GC and Coroutines

Kjetil Matheussen <[email protected]>
Newsgroups gmane.comp.programming.garbage-collection.boehmgc
Message-ID <CAC6niEJX8Sg=bufimWHwCgZo7evrWLxm539ngO3g2O4H29vXxQ@mail.gmail.com>
On Tue, Jan 28, 2014 at 10:35 PM, Juan Wajnerman
<[email protected]> wrote:
> I made the stack and the coroutine variables (might be the same value, right?) as global but it still crashes.
> Something I noticed is that when I call co_create() without a stack (it allocates its own stack) it works fine if I didn't call GC_malloc() before.
> In other words, it crashes if I call GC_malloc() in the main function.
>

To be honest, I didn't use BDW-GC with libpcl, but a different
conservative garbage collector.
It should have worked with the garbage collector I used.

Why BDW-GC fails here, I don't know, but the stack trace below might
give someone
with more knowledge about BDW-GC an idea:


(gdb) bt
#0  0x0000000000419b00 in GC_push_all_eager ()
#1  0x0000000000419b5c in GC_push_all_stack ()
#2  0x000000000040570c in GC_push_all_stack_sections ()
#3  0x000000000040c323 in GC_push_all_stacks ()
#4  0x0000000000408561 in GC_default_push_other_roots ()
#5  0x00000000004058bc in GC_push_roots ()
#6  0x0000000000417ed8 in GC_mark_some ()
#7  0x000000000040ea9f in GC_stopped_mark ()
#8  0x000000000040e71a in GC_try_to_collect_inner ()
#9  0x000000000040fae3 in GC_collect_or_expand ()
#10 0x000000000040fdfb in GC_allocobj ()
#11 0x0000000000415d4e in GC_generic_malloc_inner ()
#12 0x0000000000415efa in GC_generic_malloc ()
#13 0x0000000000416334 in GC_core_malloc ()
#14 0x000000000040a2a4 in GC_malloc ()
#15 0x0000000000404a63 in real_coroutine_body (sbase=0x6bff90,
realarg=0x6b8000) at test2.c:12
#16 0x000000000040708c in GC_call_with_stack_base ()
#17 0x0000000000404a97 in coroutine_stub (arg=0x0) at test2.c:21
#18 0x000000000041ada5 in co_runner ()
#19 0x0000003b49446370 in ?? () from /lib64/libc.so.6
#20 0x0000000000000000 in ?? ()
(gdb)


>
> On Jan 28, 2014, at 6:16 PM, Kjetil Matheussen <[email protected]> wrote:
>
>> On Tue, Jan 28, 2014 at 9:36 PM, Juan Wajnerman <[email protected]> wrote:
>>> I'm not sure if I understand how I'm supposed to use the GC_stack_base info.
>>> I tried to call GC_add_root using the mem_base but with no luck so far.
>>>
>>> Here is a small example of what I'm trying to run:
>>> https://gist.github.com/waj/8675658
>>> In my machine it crashes after 60 or 70 iterations.
>>>
>>> The stack space allocated for the coroutine is also allocated with the GC so
>>> it shouldn't be necessary to register that area, right?
>>>
>>
>> Yes, but I think the problem with your example is
>> that  the pointer to the stack variable in main is not
>> tracable inside the coroutine. To test that theory,
>> it should work if you just make it into a global variable.
>>
>> If you run more coroutines, you also need to add
>> the context of them to the GC roots.
>>
>> For my program, it was enough just doing this:
>>
>> coroutine_t c
>> GC_add_root(c, c+ MAX(sizeof(ucontext_t), sizeof(jmp_buf)))
>
>
> _______________________________________________
> Gc mailing list
> Gc-V9/[email protected]
> http://www.hpl.hp.com/hosted/linux/mail-archives/gc/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.