L'avantage du flat est:
+ Pas de pertes de place du aux bouts qui rentrent pas tout a fait.
+ Taille entree > 64K.
Inconvenient:
+ Consommation peut etre accrue de la Flash (Pas sur a verifier par des simu).
Une entree possedera donc comme struct:
FLAGS.w: UNUSED / IN_USE / DELETED + le type d'entree (VOID, ARCHIVE_SIZE,PEDROM_APPS, SWAP_MEMORY, ...)
SIZE.l: Taille
Ex de GC:
ArcPtr = ArchiveMemoryBegin; Pass1. Recherche d'un secteur avec une entree marquee comme a effacer. Pass2: tant que (ok) { ok = NextSector(); EraseSector(); ReCopySector(); } NextSector: remaining = 65536, HeapPtr = HeapPtrInit; if (entry_size > 0) CopyEntry(); while (remaining > 0) switch (ArcPtr->Flags) case IN_USE: entry_size = ArcPtr->size; CopyEntry(); break; case DELETED: ArcPtr += ArcPtr->size; case UNUSED: ok = 0; default: Arg!!!!!!!!!!!!!!! } CopyEntry: cp_size = min(remaining, entry_size) ; entry_size -= cp_size; remaining -= cp_size; HeapPtr = Copy(ArcPtr, HeapPtr, cp_size); ArcPtr += cp_size;
Evidement c'est simplifie.