Question

Juste pour le plaisir pur de celui-ci, je l'ai décidé de créer un Scheme liant à libpython afin vous pouvez intégrer dans les programmes Python Scheme. Je suis déjà en mesure d'appeler dans l'API Python C, mais je ne l'ai pas vraiment pensé à la gestion de la mémoire.

La façon de FFI mzscheme fonctionne est que je peux appeler une fonction, et si cette fonction renvoie un pointeur sur un PyObject, alors je peux l'avoir incrémente automatiquement le compte de référence. Ensuite, je peux enregistrer un finaliseur qui décrémenter le compte de référence lorsque l'objet Scheme reçoit les déchets collectés. Je l'ai regardé la documentation pour le comptage de référence , et ne pas voir des problèmes avec ce à première vue (bien qu'il puisse être sous-optimale dans certains cas). Y at-il gotchas je suis absent?

En outre, je ne parviens pas à faire ni queue ni tête de la documentation du garbage collector cyclique . Quelles sont les choses que je devrai garder à l'esprit ici? En particulier, comment puis-je faire Python conscient que j'ai une référence à quelque chose il ne recueille pas pendant que je suis encore l'utiliser?

Était-ce utile?

La solution

Votre lien vers http://docs.python.org/extending/extending .html # référence compte est au bon endroit. Les sections extension et Embedding et API Python / C de la documentation sont ceux qui expliquent comment utiliser l'API C.

comptage de référence est l'une des parties ennuyeuses de l'utilisation de l'API C. Le principal Gotcha garde tout droit: En fonction de la fonction API que vous appelez, vous pouvez ou ne pas posséder la référence à l'objet que vous obtenez. Veillez à comprendre si vous êtes propriétaire (et ne peut donc pas oublier de DECREF ou donner à quelque chose qui va le voler) ou empruntent (et doit INCREF pour le garder et peut-être utiliser pendant votre fonction). Le plus de bugs communs impliquant ce sont 1) se rappeler de manière incorrecte si vous possédez une référence retournée par une fonction particulière et 2) vous êtes en sécurité croyant emprunter une référence pour un temps plus long que vous.

Vous ne devez pas faire quelque chose de spécial pour le garbage collector cyclique. Il est juste là pour colmater une faille dans le comptage de référence et ne nécessite pas un accès direct.

Autres conseils

Le plus grand Gotcha Je sais avec comptage ref et l'API C est la chose __del__. Lorsque vous avez une référence empruntée à quelque chose, vous pensez que vous pouvez vous en sortir sans INCREF'ing parce que vous ne donnez pas le GIL pendant que vous utilisez cette référence. Mais, si vous finissez par la suppression d'un objet (par exemple, la suppression dans une liste), il est possible que vous déclenchez un appel __del__, ce qui pourrait supprimer la référence que vous empruntez sous vos pieds. Très délicat.

Si vous INCREF (puis DECREF, bien sûr) toutes les références empruntées dès que vous les obtenez, il ne devrait pas y avoir de problème.

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