Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   SystemStackError when rb_define_module_function() * 3 (http://www.velocityreviews.com/forums/t828763-systemstackerror-when-rb_define_module_function-3-a.html)

Suraj Kurapati 02-17-2006 03:28 AM

SystemStackError when rb_define_module_function() * 3
 
-----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)

iD4DBQFD9ULQmV9O7RYnKMcRAnzuAKCvyNqkSWWM3o7kpK1l2y 8Xup98hACWOrGI
qDsBxZ9L9CfILnHqlsLnaQ==
=1Ilp
-----END PGP SIGNATURE-----

Suraj Kurapati 02-17-2006 03:38 AM

Re: SystemStackError when rb_define_module_function() * 3
 
-----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+AJ0fT6XGjoth4xxtUrzThH TTsCkhCwCeM6qT
JdFhC9WTrGH9/iVtj9VBVOY=
=jgf0
-----END PGP SIGNATURE-----

Yukihiro Matsumoto 02-19-2006 12:53 PM

Re: SystemStackError when rb_define_module_function() * 3
 
Hi,

In message "Re: SystemStackError when rb_define_module_function() * 3"
on Sat, 18 Feb 2006 01:13:29 +0900, Suraj Kurapati <skurapat@ucsc.edu> 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.



Suraj Kurapati 02-19-2006 07:18 PM

Re: SystemStackError when rb_define_module_function() * 3
 
-----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+MOcmV9O7RYnKMcRAleEAJ4yC3X0OFEoEolyEsv1YN Obj0MDBgCfSiJA
sVF/m8hSVv9ZhEmlzwxamVE=
=bVQ+
-----END PGP SIGNATURE-----




All times are GMT. The time now is 07:33 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.