Commit d82de784 authored by Hugo's avatar Hugo
Browse files

partie 2 faite

parent 7f157ab8
......@@ -37,7 +37,6 @@ void
efree(void *ptr)
/* ecrire votre code ici */
Alloc a = mark_check_and_get_alloc(ptr);
switch( a.kind ) {
......@@ -44,8 +44,7 @@ mark_check_and_get_alloc(void *ptr)
//on renseigne les valeurs de a a retourner
a.ptr = (void*)pointeur;
a.size = *(unsigned long*)a.ptr;
a.kind = (MemKind)magicLu;
a.kind = (MemKind)(magicLu<<62 );assert(a.kind==0x0);
uint64_t magicParCalcul = knuth_mmix_one_round((unsigned long)((void*)pointeur)) & ~(0b11UL);
assert(magicLu == magicParCalcul) ;//verifie magic
char* pointeur2 = (char*)(pointeur+a.size-16);//pointeur2 pointe vers l'octet du debut de marquage de fin
......@@ -7,7 +7,7 @@
#include <assert.h>
#include "mem.h"
#include "mem_internals.h"
#include <inttypes.h>
// list_chunk creer_list(){
......@@ -27,34 +27,42 @@
void *
emalloc_small(unsigned long size)
if(size<=0){return NULL;}
void *ptr = NULL;
ptr = mark_memarea_and_get_user_ptr(arena.chunkpool,size,SMALL_KIND);//appelle la fonction de marquage
unsigned int taille = mem_realloc_small();
unsigned int compteur = 0;
void* pointeur=arena.chunkpool;
while(compteur<taille){//tant qu'on sort pas du bloc
*(int16_t*)(pointeur+compteur)=(int16_t) 96;
if(compteur+96>taille){//pour le dernier bloc
*(int16_t*)(pointeur+compteur+16) = (int16_t)0;//equivaut a NULL en ASCII
//si liste vide
unsigned int taille = mem_realloc_small();//on realloue une liste 2 fois plus grande
unsigned int compteur;
void* pointeur= arena.chunkpool;//pour parcourir chaque bloc et donc chainer les blocs
for(compteur = 0;compteur<taille;compteur+=CHUNKSIZE){//tant qu'on sort pas du bloc
if(compteur+CHUNKSIZE<taille){//tous les blocs sauf le dernier
void** universal_ptr = pointeur;
*universal_ptr = pointeur+CHUNKSIZE;
else{//tous les blocs sauf le dernier
*(int16_t*)(pointeur+compteur+16) = *(int16_t*) (pointeur+compteur+96);
else{//pour le dernier bloc
void** universal_ptr = (void*)pointeur;
*universal_ptr = (void*)NULL;
// allocation taille small
void* ptr = mark_memarea_and_get_user_ptr(arena.chunkpool-CHUNKSIZE,size+32,SMALL_KIND);
return ptr;//renvoie le resultat obtenu par la fonction de marquage
void efree_small(Alloc a) {
//on chaine a avec l'ancienne liste
void**A = a.ptr;
*A = (void*)(*(uint64_t*)arena.chunkpool);
//ajoute a en tete de liste
arena.chunkpool = a.ptr;
void** ptr_tampon = &arena.chunkpool;//enregistre ancienne valeur du chunkpool
arena.chunkpool=a.ptr;//on ajoute la callule a a la liste
*(int16_t*)arena.chunkpool=(int16_t)a.size;//on ecrit sa taille
*ptr_tampon = (void*)(arena.chunkpool+16);//on la chaine avec le reste de la liste grace au ptr_tampon
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment