2010-07-12 5 views
2

Je transfère un garbage collector imprécis de Windows vers MacOS X. Dans celui-ci, il doit analyser la pile pour identifier les pointeurs potentiels dans le tas, puis les utiliser comme racines GC. Pour ce faire, j'ai besoin de la base de la pile ainsi que de sa longueur. Sous Windows, ce code utilise un algorithme similaire à ce qui est décrit ici:Comment trouver l'adresse de base et la taille de la pile sur MacOS X?

Stack and Stack Base Address

Comment puis-je faire sur Mac OS X? Notez que, pour l'instant, je me soucie seulement du sujet principal. L'interpréteur qui utilise ce GC est mono-thread et je peux garantir qu'il n'y a aucune référence sur d'autres threads./

Répondre

0

Hans Boehm's conservative GC for C fonctionne sous MacOS X et est open-source. Donc, vous pourriez éventuellement jeter un oeil sur le code source de ce GC pour voir comment il localise la pile. Alternativement, en fonction du degré de contrôle du code appelant, vous pouvez simplement prendre l'adresse d'une variable locale quelque part "haut" (par exemple dans la fonction main() ou son équivalent MacOS X, ou dans la fonction de démarrage de la variable concernée fil). Peut-être, vous pourriez simplement choisir l'adresse de la pile et la taille lors de la création du fil (avec les discussions Posix, cela est fait avec pthread_attr_setstack() - Posix discussions peuvent être utilisés avec MacOS X).

2

Vous pouvez également obtenir la taille et la longueur totale de la pile avec les fonctions spécifiques Darwin:

pthread_t self = pthread_self(); 
    void* addr = pthread_get_stackaddr_np(self); 
    size_t size = pthread_get_stacksize_np(self); 
    printf("addr=%p size=%zx\n", addr, size); 
Questions connexes