IRB + C Extension = Memory Loss

Discussion in 'Ruby' started by Ryan Bates, Sep 19, 2008.

  1. Ryan Bates

    Ryan Bates Guest

    I'm having difficult making a simple C extension. The struct's memory
    seems to go missing after a while when using IRB. I'm no C expert, so
    I'm probably doing something wrong as far as memory allocation is
    concerned. Here's the problem and the code:

    http://gist.github.com/11611

    Notice the greeting goes away after calling "h.greet" a number of
    times? This only seems to happen in IRB and not through a ruby script.
    Any idea why? I'm assuming it has something to do with Ruby's garbage
    collection, but I don't know how to solve it.

    Thanks,

    Ryan
    Ryan Bates, Sep 19, 2008
    #1
    1. Advertising

  2. Ryan Bates

    Tim Hunter Guest

    Ryan Bates wrote:
    > I'm having difficult making a simple C extension. The struct's memory
    > seems to go missing after a while when using IRB. I'm no C expert, so
    > I'm probably doing something wrong as far as memory allocation is
    > concerned. Here's the problem and the code:
    >
    > http://gist.github.com/11611
    >
    > Notice the greeting goes away after calling "h.greet" a number of
    > times? This only seems to happen in IRB and not through a ruby script.
    > Any idea why? I'm assuming it has something to do with Ruby's garbage
    > collection, but I don't know how to solve it.
    >
    > Thanks,
    >
    > Ryan


    GC is collecting the greeting string because it thinks there are no
    references to it. Your hello_mark function needs to identify the
    greeting string object as "in use". From the Pickaxe:

    "The mark routine will be called by the garbage collector during its
    ``mark'' phase. If your structure references other Ruby objects, then
    your mark function needs to identify these objects using
    rb_gc_mark(value)."
    --
    Posted via http://www.ruby-forum.com/.
    Tim Hunter, Sep 19, 2008
    #2
    1. Advertising

  3. Ryan Bates

    Ryan Bates Guest

    Thanks! That makes sense. Calling rb_gc_mark(*hello->greeting) in the
    hello_mark method works.

    On a related note. What if I need to re-assign greeting to a new
    string at some point in the future after hello_mark has been called.
    Should I call rb_gc_mark upon assignment (outside of hello_mark)?

    Regards,

    Ryan


    On Sep 19, 10:00=A0am, Tim Hunter <> wrote:
    > Ryan Bates wrote:
    > > I'm having difficult making a simple C extension. The struct's memory
    > > seems to go missing after a while when using IRB. I'm no C expert, so
    > > I'm probably doing something wrong as far as memory allocation is
    > > concerned. Here's the problem and the code:

    >
    > >http://gist.github.com/11611

    >
    > > Notice the greeting goes away after calling "h.greet" a number of
    > > times? This only seems to happen in IRB and not through a ruby script.
    > > Any idea why? I'm assuming it has something to do with Ruby's garbage
    > > collection, but I don't know how to solve it.

    >
    > > Thanks,

    >
    > > Ryan

    >
    > GC is collecting the greeting string because it thinks there are no
    > references to it. Your hello_mark function needs to identify the
    > greeting string object as "in use". From the Pickaxe:
    >
    > "The mark routine will be called by the garbage collector during its
    > ``mark'' phase. If your structure references other Ruby objects, then
    > your mark function needs to identify these objects using
    > rb_gc_mark(value)."
    > --
    > Posted viahttp://www.ruby-forum.com/.
    Ryan Bates, Sep 19, 2008
    #3
  4. Ryan Bates

    Tim Hunter Guest

    Ryan Bates wrote:
    > Thanks! That makes sense. Calling rb_gc_mark(*hello->greeting) in the
    > hello_mark method works.
    >
    > On a related note. What if I need to re-assign greeting to a new
    > string at some point in the future after hello_mark has been called.
    > Should I call rb_gc_mark upon assignment (outside of hello_mark)?
    >
    > Regards,
    >
    > Ryan


    Let's back up a bit. I assume you're storing the VALUE passed into
    hello_init in hello->greeting:

    static VALUE hello_init(VALUE obj, VALUE greeting)
    {
    HELLO(obj)->greeting = greeting;
    return Qnil;
    }

    The VALUE represents the String object, which is what Ruby is interested
    in. In that case, you should call rb_gc_mark(hello->greeting) so Ruby
    can mark the String object, not the C string embedded in the object.

    Regarding your new question, when you want to assign a new greeting
    String object, just store the new VALUE in hello->greeting. The old
    greeting String won't get marked during the next GC sweep, so GC will
    know that it's available for collection.

    (I hope this makes sense. It's so hard to make sense on Friday afternoon
    :)
    --
    Posted via http://www.ruby-forum.com/.
    Tim Hunter, Sep 19, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?Utf-8?B?UGV0ZXJU?=
    Replies:
    3
    Views:
    390
    Yuan Ren[MSFT]
    Jan 22, 2006
  2. Son KwonNam

    JNI Memory Loss?

    Son KwonNam, Jun 15, 2004, in forum: Java
    Replies:
    1
    Views:
    1,111
    Son KwonNam
    Jun 15, 2004
  3. Sam Stephenson
    Replies:
    1
    Views:
    213
    Andrew Walrond
    Jun 18, 2005
  4. Replies:
    1
    Views:
    150
    Florian GroƟ
    Oct 26, 2005
  5. anne001
    Replies:
    1
    Views:
    255
    anne001
    Jun 27, 2006
Loading...

Share This Page