Je reproduis ici mon dernier message sur la DUF:
camllight utilise une pile dynamiquement étendue vers le bas via des mallocs
judicieux. Or dans la version 64 bits, cette pile est soudainement saturée
très rapidement (trop). Qui plus est un free propre de la dernière allocation
plante le système. En fouillant, je me suis aperçu que la première allocation
n’est pas contigue des suivantes. Pour être exact voilà ce que donne la
succession d’appels de la fonction
char *xmallocverbeux(asize_t size) {
char *p;
printf("->demande de %d\n",size);
p=xmalloc(size);
printf("<-0x%16x “,p);
xfree§;
p=xmalloc(size);
printf(”<<-0x%16x\n",p);
return§;
}
(xmalloc étant malloc):
<-0x 5a768010 <<-0x 1bb3820
<-0x 1c17a40 <<-0x 1c17a40
<-0x 1c58aa0 <<-0x 1c58aa0
<-0x 1d50af0 <<-0x 1d50af0
<-0x 1d91b10 <<-0x 1d91b10
<-0x 1dd2b30 <<-0x 1dd2b30
La première ligne est celle qui met le bazar, en effet sans l’appel
malloc-free-malloc (illogique) la première allocation définissnant le sommet de
la pile puis les autres étant des augmentations successives, la pile ne peut
être étendu et bing «Out of memory» (ce qui énerve assez avec 4G de RAM)
Il semble que malloc n’assure pas la continuité des blocs mémoire, realloc le ferait mais au prix d’un déplacement éventuel de la mémoire et surtout sans préserver la fin de la mémoire. Visiblement camllight fait grossir sa pile dans vers le bas, quelqu’un aurait-il une solution (sans toucher le code de malloc)?
PS: En attendant j’ai mis sur mon dépot une nouvelle version avec une rustine temporaire.