strange rb_gc_mark error

  • Thread starter Elias Athanasopoulos
  • Start date
E

Elias Athanasopoulos

Hello!

I have a pure C function, which may be called arbitrary
sequential times. If I call any rb_* function inside, including
the simple rb_warn(), I get:

BUG] rb_gc_mark(): unknown data type 0x28(0x89965b0) non object
ruby 1.8.0 (2003-08-04) [i586-linux]

The error occures after a lot of calls; it reminds me the
behaviour of a stack overflow, or something.

The C function is quite simpe:

static double foo (double *x, double *y)
{
double f = 5.000000;

rb_warn ("%f\n", f);

return f;
}

If I remove the rb_warn() call, everything works okay.

Any hints?

Regards,
 
Y

Yukihiro Matsumoto

Hi,

In message "strange rb_gc_mark error"

|I have a pure C function, which may be called arbitrary
|sequential times. If I call any rb_* function inside, including
|the simple rb_warn(), I get:
|
|BUG] rb_gc_mark(): unknown data type 0x28(0x89965b0) non object
|ruby 1.8.0 (2003-08-04) [i586-linux]
|
|The error occures after a lot of calls; it reminds me the
|behaviour of a stack overflow, or something.

Show us whole program, if possible, to reproduce your error.

matz.
 
E

Elias Athanasopoulos

Hi,

In message "strange rb_gc_mark error"

|I have a pure C function, which may be called arbitrary
|sequential times. If I call any rb_* function inside, including
|the simple rb_warn(), I get:
|
|BUG] rb_gc_mark(): unknown data type 0x28(0x89965b0) non object
|ruby 1.8.0 (2003-08-04) [i586-linux]
|
|The error occures after a lot of calls; it reminds me the
|behaviour of a stack overflow, or something.

Show us whole program, if possible, to reproduce your error.

I will try, but it is a little bit hard because the C func is called
from a C++ method deeply inside a complex inheritance tree.

Things that I can verify now are:

(a) The C func is called with no problem 8000 times.
(b) The C func is called for 3000+ and segfaults if I put a
simple rb_warn() inside. Ruby 1.8.0
(c) The C func is called for 6000+ and segfaults if I put a
simple rb_warn() inside. Ruby 1.8.1 preview 3.

Regards,
 
E

Elias Athanasopoulos

Hi,

In message "strange rb_gc_mark error"

|I have a pure C function, which may be called arbitrary
|sequential times. If I call any rb_* function inside, including
|the simple rb_warn(), I get:
|
|BUG] rb_gc_mark(): unknown data type 0x28(0x89965b0) non object
|ruby 1.8.0 (2003-08-04) [i586-linux]
|
|The error occures after a lot of calls; it reminds me the
|behaviour of a stack overflow, or something.

Show us whole program, if possible, to reproduce your error.

I will try, but it is a little bit hard because the C func is called
from a C++ method deeply inside a complex inheritance tree.

Things that I can verify now are:

(a) The C func is called with no problem 8000 times.
(b) The C func is called for 3000+ and segfaults if I put a
simple rb_warn() inside. Ruby 1.8.0
(c) The C func is called for 6000+ and segfaults if I put a
simple rb_warn() inside. Ruby 1.8.1 preview 3.

Okay, it is my fault. :-(

While writting a C++ extension for Ruby, I do (almost everywhere):

static VALUE foo_init (...)
{
Foo *f = new Foo();
rb_iv_set (self, "__ptr__", (VALUE) f);
return self;
}

static VALUE foo_bar (...)
{
Foo *f = (Foo *) rb_iv_get (self, "__ptr__");
f->Bar();
return self;
}

The error ruby reports is on an address of a Foo created pointer.
If I remove the rb_iv_set() call, ruby executes correctly. But, I
have to keep the pointer somewhere in order to execute methods of
the specific class.

Any ideas?

Regards,
 
A

Ara.T.Howard

Date: Sun, 14 Dec 2003 02:33:04 +0900
From: Elias Athanasopoulos <[email protected]>
Newsgroups: comp.lang.ruby
Subject: Re: strange rb_gc_mark error

Hi,

In message "strange rb_gc_mark error"

|I have a pure C function, which may be called arbitrary
|sequential times. If I call any rb_* function inside, including
|the simple rb_warn(), I get:
|
|BUG] rb_gc_mark(): unknown data type 0x28(0x89965b0) non object
|ruby 1.8.0 (2003-08-04) [i586-linux]
|
|The error occures after a lot of calls; it reminds me the
|behaviour of a stack overflow, or something.

Show us whole program, if possible, to reproduce your error.

I will try, but it is a little bit hard because the C func is called
from a C++ method deeply inside a complex inheritance tree.

Things that I can verify now are:

(a) The C func is called with no problem 8000 times.
(b) The C func is called for 3000+ and segfaults if I put a
simple rb_warn() inside. Ruby 1.8.0
(c) The C func is called for 6000+ and segfaults if I put a
simple rb_warn() inside. Ruby 1.8.1 preview 3.

Okay, it is my fault. :-(

While writting a C++ extension for Ruby, I do (almost everywhere):

static VALUE foo_init (...)
{
Foo *f = new Foo();
rb_iv_set (self, "__ptr__", (VALUE) f);
return self;
}

static VALUE foo_bar (...)
{
Foo *f = (Foo *) rb_iv_get (self, "__ptr__");
f->Bar();
return self;
}

The error ruby reports is on an address of a Foo created pointer.
If I remove the rb_iv_set() call, ruby executes correctly. But, I
have to keep the pointer somewhere in order to execute methods of
the specific class.

Any ideas?

create a struct to wrap Foo objects with and let ruby handle the object:

struct FooWrap { Foo *foo; };
...
...
VALUE rb_cFooWrap;
...
...
static VALUE
FooWrap_free (FooWrap)
struct FooWrap *FooWrap;
{
delete FooWrap->foo;
free(FooWrap);
}
...
...
/* defined this as the class 'new' method in Init */
static VALUE
rb_cFooWrap_c_new (klass)
VALUE klass;
{
struct FooWrap *FooWrap;
VALUE obj;
obj = Data_Make_Struct(klass, struct FooWrap, 0, FooWrap_free, FooWrap);
return obj;
}
...
...
static VALUE foo_init (...)
{
rb_iv_set (self, "foowrap", rb_cFooWrap_c_new);
return self;
}

static VALUE foo_bar (...)
{
VALUE foowrap;
struct FooWrap *FooWrap;

foowrap = rb_iv_get (self, "foowrap");
Data_Get_Struct(foowrap, struct FooWrap, FooWrap)
FooWrap->foo->Bar();
return self;
}


i don't know if you can wrap c++ class directly since Data_Make_Struct uses
ALLOC internally...

-a
--

ATTN: please update your address books with address below!

===============================================================================
| EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
| PHONE :: 303.497.6469
| ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328
| STP :: http://www.ngdc.noaa.gov/stp/
| NGDC :: http://www.ngdc.noaa.gov/
| NESDIS :: http://www.nesdis.noaa.gov/
| NOAA :: http://www.noaa.gov/
| US DOC :: http://www.commerce.gov/
|
| The difference between art and science is that science is what we
| understand well enough to explain to a computer.
| Art is everything else.
| -- Donald Knuth, "Discover"
|
| /bin/sh -c 'for l in ruby perl;do $l -e "print \"\x3a\x2d\x29\x0a\"";done'
===============================================================================
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,754
Messages
2,569,522
Members
44,995
Latest member
PinupduzSap

Latest Threads

Top