SystemStackError when rb_define_module_function() * 3

Discussion in 'Ruby' started by Suraj Kurapati, Feb 17, 2006.

  1. -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    Hello,

    I'm getting a "test.rb:46: stack level too deep (SystemStackError)"
    when defining three or more functions for a module, which is created
    & given to Ruby via the Ruby C API. The test.rb (actually
    "trunk/src/samp/test.rb") file and the remaining source code is
    available in a Subversion repository here:

    svn checkout -r21 svn://rubyforge.org/var/svn/ruby-vpi
    - -or-
    <http://rubyforge.org/plugins/scmsvn/viewcvs.php/?root=ruby-vpi&pathrev=21>


    In particular, the error occurs when I register a third module
    function with Ruby C API inside line 25 of the file
    "trunk/src/RVPI.cin":

    // register the VPI module
    RVPI__rModuleDef = rb_define_module("VPI");

    rb_define_module_function( // first func
    RVPI__rModuleDef
    , "relay_verilog"
    , RVPI_rb_relay_verilog
    , 0
    );

    rb_define_module_function( // second func
    RVPI__rModuleDef
    , "register_task"
    , RVPI_rb_register_task
    , 1
    );

    rb_define_module_function( // third func
    RVPI__rModuleDef
    , "handle_by_name"
    , RVPI_rb_handle_by_name
    , 2
    ); // FIXME: causes "stack level too deep (SystemStackError)"


    I originally thought the problem was with the third module function
    (named "RVPI_rb_handle_by_name") that I was trying to register. But
    this was not the case, because the SystemStackError occurred even
    when I registered the first module function under a different name:

    // register the VPI module
    RVPI__rModuleDef = rb_define_module("VPI");

    rb_define_module_function( // first func
    RVPI__rModuleDef
    , "relay_verilog"
    , RVPI_rb_relay_verilog
    , 0
    );

    rb_define_module_function( // second func
    RVPI__rModuleDef
    , "register_task"
    , RVPI_rb_register_task
    , 1
    );

    rb_define_module_function( // first func with different name
    RVPI__rModuleDef
    , "foo"
    , RVPI_rb_relay_verilog
    , 0
    );


    What am I doing wrong?

    Thank you.
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.1 (GNU/Linux)

    iD4DBQFD9ULQmV9O7RYnKMcRAnzuAKCvyNqkSWWM3o7kpK1l2y8Xup98hACWOrGI
    qDsBxZ9L9CfILnHqlsLnaQ==
    =1Ilp
    -----END PGP SIGNATURE-----
     
    Suraj Kurapati, Feb 17, 2006
    #1
    1. Advertising

  2. -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    Sorry, I forgot to specify the version of Ruby I am using:

    $ ruby --version
    ruby 1.8.3 (2005-06-23) [i486-linux]
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.1 (GNU/Linux)

    iD8DBQFD9UUbmV9O7RYnKMcRAku+AJ0fT6XGjoth4xxtUrzThHTTsCkhCwCeM6qT
    JdFhC9WTrGH9/iVtj9VBVOY=
    =jgf0
    -----END PGP SIGNATURE-----
     
    Suraj Kurapati, Feb 17, 2006
    #2
    1. Advertising

  3. Hi,

    In message "Re: SystemStackError when rb_define_module_function() * 3"
    on Sat, 18 Feb 2006 01:13:29 +0900, Suraj Kurapati <> writes:

    |In particular, the error occurs when I register a third module
    |function with Ruby C API inside line 25 of the file
    |"trunk/src/RVPI.cin":

    Did SystemStackError happened during rb_define_module_function()?
    What OS are you using?

    There's no explicit limitation for number of rb_define_module_function()
    calls, except for OS resource limit. SystemStackError is caused when
    call stack is too deep, and the max depth is calculated in Init_stack().
    Since you are using embedded Ruby, you may fail to call Init_stack()
    in the interpreter initialization.

    matz.
     
    Yukihiro Matsumoto, Feb 19, 2006
    #3
  4. -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    Yukihiro Matsumoto wrote:
    > Did SystemStackError happened during rb_define_module_function()?


    No, it happened later, when the Ruby interpreter was executing a script.

    > What OS are you using?


    Linux 2.6.12-10-386 #1 Mon Jan 16 17:18:08 UTC 2006 i686 GNU/Linux

    > Since you are using embedded Ruby, you may fail to call Init_stack()
    > in the interpreter initialization.


    Ah, thank you. I tried putting a call to Init_stack() in my
    initialization code but no luck. However, the problem is neither
    with embedded Ruby nor with my initialization of the Ruby interpreter:

    After some more investigation I happened upon the answer. There was
    indeed a heap/stack limitation upon the Ruby interpreter embedded in
    my C program!

    (my C program, inside its own process
    .. unlimited stack space ..

    (Ruby interpreter, inside a pthread
    .. 2 MiB of stack space ..

    )
    )

    I was using the pthread library, with default attribute values
    (thread stack size = 2 MiB) for pthread_create(), to launch the Ruby
    interpreter. Naturally, the interpreter eventually ran out of stack
    space and produced the SystemStackError.
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.1 (GNU/Linux)

    iD8DBQFD+MOcmV9O7RYnKMcRAleEAJ4yC3X0OFEoEolyEsv1YNObj0MDBgCfSiJA
    sVF/m8hSVv9ZhEmlzwxamVE=
    =bVQ+
    -----END PGP SIGNATURE-----
     
    Suraj Kurapati, Feb 19, 2006
    #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. Joel VanderWerf
    Replies:
    2
    Views:
    103
  2. Jesper Olsen
    Replies:
    7
    Views:
    619
    Van Jacques
    Jan 16, 2004
  3. Lee
    Replies:
    2
    Views:
    189
  4. John Lam
    Replies:
    3
    Views:
    127
    Ryan Leavengood
    Dec 7, 2005
  5. Suraj Kurapati
    Replies:
    0
    Views:
    131
    Suraj Kurapati
    Feb 17, 2006
Loading...

Share This Page