PpHd : j'ai trouvé comment corriger une partie des pertes de mémoire après un hot reset.
La plus grosse perte provient de deux appels de
WinOpen avec
WF_DUP_SCR comme flag. Il suffit de supprimer les anciens blocs mémoires nécessaires aux duplicate screens. On peut trouver leur handle dans la structure
WINDOW associée. Pour une des 2 fenêtres, le pointeur sur cette structure est très facile à trouver, mais pour l'autre, le pointeur est constant mais n'a pas l'air d'avoir été exporté.
Alors le plus simple c'est de parcourir toute la liste des fenêtres, et de supprimer tous les blocs mémoires des duplicate screens. Ce bout de code fonctionne, si on le rajoute juste avant
AMS_HiddenFunc.
move.l ($c8).w,a2
move.l (a2),a3 ;FirstWindow
move.l (a3),a3
DelDupScreens:
move.w $20(a3),-(a7) ;handle du DupScr
beq.s NoDupScr
move.l HeapFree*4(a2),a0
jsr (a0)
addq.l #4,a7
NoDupScr:
move.l 34(a3),a3 ;NextWindow
move.l a3,d0
Les autres pertes de mémoire proviennent de la création de la barre d'entrée de l'Home, et d'un
MenuBegin. Pour la barre d'entrée, il suffit de supprimer l'handle dans la structure
TEXT_EDIT associée à l'ancienne barre. Mais ici aussi, le pointeur vers la structure est constant, mais il n'est pas exporté...
Pour le MenuBegin, je sais plus exactement, mais ça a pas l'air facile non plus.
Et il y a encore quelques autres handles créés qui proviennent d'un
Plotinit et de 2
CreateEmptyList, mais ça ne mange qu'environ 10 octets.
Avec uniquement la correction pour les duplicate screens, on ne perd plus que 200 octets au hot reset.