Question

J'ai un type de matrice qui contient un void* tableau, représentant un tableau d'objets (qui sont tous d'un type dans une matrice donnée, par exemple, tous les C des entiers, char, double, une variété de structures, ou peut-être même tous les Rubis VALUEs).

L'allocation de la mémoire et de collecte des ordures semble fonctionner correctement jusqu'à ce que j'essaie de créer une matrice de VALUEs.

J'ai la marque suivante de la fonction définie:

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)));
}

Donc, il ne le marquage si c'est réellement un VALUE matrice — sinon, NULL est transmis à Data_Wrap_Struct pour la marque de la fonction.

Mais j'obtiens une erreur de segmentation quand j'ai tester quelques-uns des VALUE fonctions de la matrice (voir résumé).

Plus précisément, il semble d'erreur la première fois que j'essaie d'appeler une méthode Ruby sur le premier objet dans l' VALUE* tableau:

C[i+j*ldc] = rb_funcall(C[i+j*ldc], nm_id_mult, 1, beta); // C[i+j*ldc] = C[i+j*ldc]*beta

nm_id_mult mondial est définie dans mon Init fonction en tant que rb_intern("*").

Il est possible que cela n'est pas une poubelle de collecte de problème, mais la GC est la partie de Ruby que je comprends le moins — et mon erreur de segmentation est également presque identique à cette trace, qui l'affiche les attributs de la GC.

Donc, mes questions:

  1. Si c'est le GC, ce qui est le moyen le plus approprié pour marquer un tableau de VALUEs?

  2. Si ce n'est pas la GC, comment dois-je aller sur le diagnostic de ce type d'erreur?Je n'ai jamais rien vu de tel.

EDIT:

S'avère que c'est un exemple d'échec d'initialisation de VALUEs créé en C.

En d'autres termes, assurez-vous de faire *(VALUE*)a = INT2FIX(0) avant de vous essayez d'accéder à a.

Je ne pense toujours que la question est pertinente.Je n'ai pas réussi à trouver de bons exemples de marquage pour le nettoyage et balayage de la collecte des ordures, sur StackOverflow ou ailleurs.Si vous pouvez fournir un exemple et/ou une explication, je vais marquer que comme une réponse correcte à cette question.

Était-ce utile?

La solution

Ruby mark-and-sweep GC fonctionne en deux étapes.

La première étape marque les objets vivants.Il fonctionne de manière récursive par l'appel de la fonction de marquage de chaque connus "objets vivants".La première série d'objets en direct est produit par la numérisation de la pile C de chaque Ruby thread ou de chacun des objets globaux (il existe une fonction C pour vous inscrire/désinscrire "sous tension" les objets).La fonction de marquage de l'objet X doit ensuite appeler rb_gc_mark pour chacun des objets que X désigne.En d'autres termes, ce que vous faites est exactement ce que vous devriez faire.

Cependant, comme vous l'avez remarqué plus tard, pas toute valeur possible est une VALEUR valide Ruby objet.Cependant, je crois que l'initialisation avec Qnil (c'est à direnéant) serait plus ruby-ish.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top