Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在Ruby扩展中的VALUE*数组上完成标记?_C_Ruby_Garbage Collection_Ruby C Extension - Fatal编程技术网

C 如何在Ruby扩展中的VALUE*数组上完成标记?

C 如何在Ruby扩展中的VALUE*数组上完成标记?,c,ruby,garbage-collection,ruby-c-extension,C,Ruby,Garbage Collection,Ruby C Extension,我有一个矩阵类型,它包含一个void*数组,表示一个对象数组(在给定的矩阵中都是一种类型,例如,所有C整数、所有浮点、双精度、各种结构,甚至可能是所有Ruby值s) 在我尝试创建一个VALUEs矩阵之前,内存分配和垃圾回收似乎都能正常工作 我定义了以下标记函数: void mark_dense_storage(void* s) { size_t i; DENSE_STORAGE* storage = (DENSE_STORAGE*)s; if (storage &&

我有一个矩阵类型,它包含一个
void*
数组,表示一个对象数组(在给定的矩阵中都是一种类型,例如,所有C整数、所有浮点、双精度、各种结构,甚至可能是所有Ruby
s)

在我尝试创建一个
VALUE
s矩阵之前,内存分配和垃圾回收似乎都能正常工作

我定义了以下标记函数:

void mark_dense_storage(void* s) {
  size_t i;
  DENSE_STORAGE* storage = (DENSE_STORAGE*)s;
  if (storage && storage->dtype == RUBY_OBJECT)
    for (i = 0; i < count_dense_storage_elements(s); ++i)
      rb_gc_mark(*((VALUE*)(storage->elements + i*sizeof(VALUE)));
}
nm\u id\u mult
是在my
Init
函数中定义为
rb\u intern(“*”
的全局变量

这可能不是垃圾收集问题,但GC是Ruby中我最不了解的部分——我的segfault也几乎与之相同,poster将其归为GC

所以,我的问题是:

  • 如果是GC,那么标记
    VALUE
    s数组的合适方法是什么

  • 如果不是GC,我该如何诊断这种类型的错误?我从未见过这样的事

  • 编辑:

    事实证明,这是无法初始化C中创建的
    值的一个示例

    换句话说,在尝试访问
    a
    之前,请确保执行
    *(VALUE*)a=INT2FIX(0)


    我仍然认为这个问题是相关的。我还没有在StackOverflow或其他地方找到任何关于清洁和清扫垃圾收集标记的好例子。如果您能提供这样一个示例和/或解释,我将把它标记为这个问题的正确答案。

    Ruby的标记和扫描GC分两个阶段工作

    第一阶段标记活动对象。它通过调用每个已知“活动对象”的标记函数递归工作。通过扫描每个已知Ruby线程或每个注册的全局对象的C堆栈(有一个C函数来注册/注销“已知的活动”对象),可以生成活动对象的初始集合。然后,对象X的标记函数应该为X引用的每个对象调用rb_gc_mark。换句话说,你所做的正是你应该做的


    但是,正如您稍后注意到的,没有任何可能的值是有效的Ruby对象。但是,我相信用Qnil(即nil)初始化会更像ruby。

    它是ruby 1.9.3p0(2011-10-30修订版33570)。因此,首先我将升级到ruby 1.9.3-p125,并检查问题是否仍然存在。p0中的GC存在一些问题。p125仍然存在该问题。我在gist中添加了gdb输出:嗯,您也可以尝试1.9.2-p290-我有一个类似的问题,在1.9.3-p0和1.9.3-p125中都存在。不,1.9.2-p290也不好。除了现在它不知道当前帧是什么函数:
    #0 0x0000bb69英寸??()
    ,从
    st\u lookup
    调用=(
    C[i+j*ldc] = rb_funcall(C[i+j*ldc], nm_id_mult, 1, beta); // C[i+j*ldc] = C[i+j*ldc]*beta