[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

rb_raise problem in C extension

bdezonia

4/22/2009 5:02:00 PM

I am using Ruby 1.8.6-26 from the One Click Installer on Windows. I
have a C extension that tries to calloc() memory. If the calloc()
fails I call rb_raise(rb_eNoMemError,"Cannot allocate data"). My
program is getting stuck in this code. Debugging (unfortunately via
print statements) I can see that rb_raise() is going to be called.
After that the exception is never caught by the outermost rescue loop.
The program just stops doing anything (0% cpu) except it keeps
updating a timer in another thread. Are there things I need to know
about rb_raise() and how to use it?
5 Answers

Eric Hodel

4/22/2009 6:45:00 PM

0

On Apr 22, 2009, at 10:05, bdezonia@wisc.edu wrote:
> I am using Ruby 1.8.6-26 from the One Click Installer on Windows. I
> have a C extension that tries to calloc() memory. If the calloc()
> fails I call rb_raise(rb_eNoMemError,"Cannot allocate data"). My
> program is getting stuck in this code. Debugging (unfortunately via
> print statements) I can see that rb_raise() is going to be called.
> After that the exception is never caught by the outermost rescue loop.
> The program just stops doing anything (0% cpu) except it keeps
> updating a timer in another thread. Are there things I need to know
> about rb_raise() and how to use it?

If ruby is out of memory how could it allocate more memory to raise an
exception?

Ruby itself allocates a NoMemError at startup to ensure it can raise
one when it runs out of memory. You'll probably need to do the same.
See gc.c rb_memerror().

bdezonia

4/22/2009 7:53:00 PM

0

On Apr 22, 1:44 pm, Eric Hodel <drbr...@segment7.net> wrote:
> On Apr 22, 2009, at 10:05, bdezo...@wisc.edu wrote:
>
> > I am using Ruby 1.8.6-26 from the One Click Installer on Windows. I
> > have a C extension that tries to calloc() memory. If the calloc()
> > fails I call rb_raise(rb_eNoMemError,"Cannot allocate data"). My
> > program is getting stuck in this code. Debugging (unfortunately via
> > print statements) I can see that rb_raise() is going to be called.
> > After that the exception is never caught by the outermost rescue loop.
> > The program just stops doing anything (0% cpu) except it keeps
> > updating a timer in another thread. Are there things I need to know
> > about rb_raise() and how to use it?
>
> If ruby is out of memory how could it allocate more memory to raise an  
> exception?
>
> Ruby itself allocates a NoMemError at startup to ensure it can raise  
> one when it runs out of memory.  You'll probably need to do the same.  
> See gc.c rb_memerror().

There is plenty of memory available (4-6 gig free). But I'm asking
calloc() for a 1 gb chunk and it can't find one. Is there a different
exception I should throw in this case? Will the rb_raise() in my
nested C code percolate out to my handler in my nested ruby code? (As
a test for now I'm just changing it to an eException but would
appreciate any feedback you have)

Eric Hodel

4/22/2009 10:04:00 PM

0

On Apr 22, 2009, at 12:55, bdezonia@wisc.edu wrote:
> On Apr 22, 1:44 pm, Eric Hodel <drbr...@segment7.net> wrote:
>> On Apr 22, 2009, at 10:05, bdezo...@wisc.edu wrote:
>>> I am using Ruby 1.8.6-26 from the One Click Installer on Windows. I
>>> have a C extension that tries to calloc() memory. If the calloc()
>>> fails I call rb_raise(rb_eNoMemError,"Cannot allocate data"). My
>>> program is getting stuck in this code. Debugging (unfortunately via
>>> print statements) I can see that rb_raise() is going to be called.
>>> After that the exception is never caught by the outermost rescue
>>> loop.
>>> The program just stops doing anything (0% cpu) except it keeps
>>> updating a timer in another thread. Are there things I need to know
>>> about rb_raise() and how to use it?
>>
>> If ruby is out of memory how could it allocate more memory to raise
>> an
>> exception?
>>
>> Ruby itself allocates a NoMemError at startup to ensure it can raise
>> one when it runs out of memory. You'll probably need to do the same.
>> See gc.c rb_memerror().
>
> There is plenty of memory available (4-6 gig free). But I'm asking
> calloc() for a 1 gb chunk and it can't find one. Is there a different
> exception I should throw in this case? Will the rb_raise() in my
> nested C code percolate out to my handler in my nested ruby code? (As
> a test for now I'm just changing it to an eException but would
> appreciate any feedback you have)

In that case, rb_raise should do what you want, however you may need
to explicitly rescue it:

$ ruby
begin
begin
raise NoMemoryError
rescue
puts "caught with plain rescue"
end
rescue Exception # or NoMemoryError
puts "caught with rescue Exception"
end
^D
caught with rescue Exception


For this reason, you should use RuntimeError or StandardError
(especially for custom error classes) instead of Exception, since
Exception isn't caught by a plain rescue.

Ken Bloom

4/23/2009 12:05:00 AM

0

On Wed, 22 Apr 2009 13:44:52 -0500, Eric Hodel wrote:

> On Apr 22, 2009, at 10:05, bdezonia@wisc.edu wrote:
>> I am using Ruby 1.8.6-26 from the One Click Installer on Windows. I
>> have a C extension that tries to calloc() memory. If the calloc() fails
>> I call rb_raise(rb_eNoMemError,"Cannot allocate data"). My program is
>> getting stuck in this code. Debugging (unfortunately via print
>> statements) I can see that rb_raise() is going to be called. After that
>> the exception is never caught by the outermost rescue loop. The program
>> just stops doing anything (0% cpu) except it keeps updating a timer in
>> another thread. Are there things I need to know about rb_raise() and
>> how to use it?
>
> If ruby is out of memory how could it allocate more memory to raise an
> exception?
>
> Ruby itself allocates a NoMemError at startup to ensure it can raise one
> when it runs out of memory. You'll probably need to do the same. See
> gc.c rb_memerror().

Is rb_memerror() exposed for him to call? He could just call that, and it
would spare him all issues with preallocation.

--Ken

--
Chanoch (Ken) Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu...

Eric Hodel

4/23/2009 5:48:00 PM

0

On Apr 23, 2009, at 10:40, Ken Bloom wrote:
> On Wed, 22 Apr 2009 13:44:52 -0500, Eric Hodel wrote:
>> On Apr 22, 2009, at 10:05, bdezonia@wisc.edu wrote:
>>> I am using Ruby 1.8.6-26 from the One Click Installer on Windows. I
>>> have a C extension that tries to calloc() memory. If the calloc()
>>> fails
>>> I call rb_raise(rb_eNoMemError,"Cannot allocate data"). My program
>>> is
>>> getting stuck in this code. Debugging (unfortunately via print
>>> statements) I can see that rb_raise() is going to be called. After
>>> that
>>> the exception is never caught by the outermost rescue loop. The
>>> program
>>> just stops doing anything (0% cpu) except it keeps updating a
>>> timer in
>>> another thread. Are there things I need to know about rb_raise() and
>>> how to use it?
>>
>> If ruby is out of memory how could it allocate more memory to raise
>> an
>> exception?
>>
>> Ruby itself allocates a NoMemError at startup to ensure it can
>> raise one
>> when it runs out of memory. You'll probably need to do the same. See
>> gc.c rb_memerror().
>
> Is rb_memerror() exposed for him to call? He could just call that,
> and it
> would spare him all issues with preallocation.

yeah, looks like it's in intern.h.