Pour optimiser son fonctionnement, et augmenter sa réutilisabilité, cette bibliothèque va être réecrite. On trouvera ici les nouveau principes mis en oeuvre.
true pour les fragments libres de taille supérieure à 1.Si les 6 bits de poids faibles sont à 0, on est en présence d'un fragment non-occupé (disponible). Si le bit de poids fort (size flag) est à 0, l'ensemble du fragment est uniquement constitué de cet octet. Si le bit de poids fort est à 1, le ou les prochains octets donneront la taille du fragment. Le fragment sera alors constitué de ce premier octet, du ou des octets de taille, plus n éventuels octets, n étant donné par le ou les octets de taille (et pouvant être nul).
Si les 6 bits de poids faible ne sont pas tous à 0, alors on est en présence d'un fragment occupé (non-disponible). Ces 6 bits, plus éventuellement les octets qui suivent, donnent la taille utile de ce fragment (la taille des données). Si le bit de poids fort (link flag) est à 1, alors le fragment est chainé à un autre fragment, dont la position est donné par les 4 (8 dans une architecture 64 bits ?) octets dont la position est déduite par la taille donnée par le ou les octets de taille.
Un fragment occupé ne peut avoir une taille nulle.
La taille stockée dans un fragment utilisé est la taille des données, et non pas la taille totale du fragment.
La taille stockée dans un fragment libre est la taille totale du fragment.
Les différents fragments libres (sauf les fragments orphelins) sont organisés sous forme d'une double liste circulaire chaîné, chaque fragment contenant un pointeur sur un fragment libre (non orphelin) dit prédécesseur est un fragment libre (également non orphelin) dit successeur.
Un fragment orphelin est un fragment libre dont la taille ne permet pas de stocker l'ensemble des informations sur sa taille et la chaîne des fragments libres.
Dés qu'un fragment libre (orphelin ou non) est crée ou modifié, il fusionne avec l'éventuel fragment libre (orphelin ou non) qui le précède et l'éventuel fragment libre (orphelin ou non) qui le précède. Un fragment libre ne peut donc être que suivi ou précédé d'un fragment occupé (sauf évidemment les cas particulier ou le fragment en question est le premier ou le dernier). C'est ce mécanisme qui permet de récupérer les fragments orphelins.
Fragments libres orphelins :
1 octets : 0x00 2 octets : 0x80 0x02 3 octets : 0x80 0x03 0x03 4 octets : 0x80 0x04 x 0x04 5 octets : 0x80 0x05 x x 0x05 6 octets : 0x80 0x06 x x x 0x06 7 octets : 0x80 0x07 x x x x 0x07 8 octets : 0x80 0x08 x x x x x 0x08 9 octets : 0x80 0x09 x x x x x x 0x09 10 octets : 0x80 0x0a x x x x x x x 0x0A
Fragments libres non orphelins :
11 octets : 0x80 0x0b p1 p2 p3 p4 n1 n2 n3 n4 0x0B 12 octets : 0x80 0x0c p1 p2 p3 p4 n1 n2 n3 n4 x 0x0C 13 octets : 0x80 0x0d p1 p2 p3 p4 n1 n2 n3 n4 x x 0x0D 14 octets : 0x80 0x0e p1 p2 p3 p4 n1 n2 n3 n4 x x x 0x0E 15 octets : 0x80 0x0f p1 p2 p3 p4 n1 n2 n3 n4 b1 b2 b3 b4 0xFF 16 octets : 0x80 0x10 p1 p2 p3 p4 n1 n2 n3 n4 x b1 b2 b3 b4 0xFF 17 octets : 0x80 0x11 p1 p2 p3 p4 n1 n2 n3 n4 x x b1 b2 b3 b4 0xFF 18 octets : 0x80 0x12 p1 p2 p3 p4 n1 n2 n3 n4 x x x b1 b2 b3 b4 0xFF ...
p1, p2, p3, p4 : chacun des octets du pointeur sur le fragment libre précédent,n1, n2, n3, n4 : chacun des octets du pointeur sur le fragment libre suivant,b1, b2, b3, b4 : chacun des octets du pointeur sur le début du fragment,x : octet de valeur quelconque.