Advertisement
Guest User

MALLOOOOOOOOC

a guest
May 27th, 2015
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.85 KB | None | 0 0
  1. /*
  2.  * fake-malloc.c    -- Implementation de malloc, free, calloc, realloc
  3.  *
  4.  * Implémentation first-fit pour malloc
  5.  *
  6.  *           Author: Erick Gallesio [eg@unice.fr]
  7.  *    Creation date: 11-May-2015 17:26 (eg)
  8.  * Last file update: 11-May-2015 20:55 (eg)
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include "my-malloc.h"
  13.  
  14.  
  15. /* Une version de my-malloc.c qu'il faudra vite remplacer par quelque chose de
  16.  * plus "raisonnable". Ce code n'est juste là que pour pouvoir lancer
  17.  * les programmes de test.
  18.  */
  19. static int nb_alloc   = 0;      /* Nombre de fois où on alloué     */
  20. static int nb_dealloc = 0;      /* Nombre de fois où on désalloué  */
  21. static int nb_sbrk    = 0;      /* nombre de fois où a appelé sbrk */
  22.  
  23. #define MOST_RESTRICTING_TYPE double
  24. typedef union header {
  25.   struct {
  26.     unsigned int size;
  27.     union header *ptr;
  28.   } info;
  29.   MOST_RESTRICTING_TYPE dummy;
  30. } Header;
  31. static int headerSize = sizeof(Header);
  32. static Header base;
  33.  
  34.  
  35. void *mymalloc(size_t size) {
  36.   Header *pnew;
  37.   nb_alloc += 1;
  38.   if(nb_sbrk==0) { // Initialisation de la zone mémoire
  39.     pnew = sbrk(headerSize*101);
  40.     pnew->info.size = size;
  41.     pnew->info.ptr = &base;
  42.     base.info.ptr = pnew;
  43.     nb_sbrk++;
  44.     return pnew;
  45.   }
  46.   pnew = &base;
  47.   while(pnew->info.ptr!=&base) { // On cherche un bloc libre assez gros
  48.     if(pnew->info.size>=(size/headerSize)*headerSize+headerSize) {
  49.       pnew->info.size = pnew->info.size - ((size/headerSize)*headerSize+headerSize);
  50.       return pnew+pnew->info.size; // Nouveau bloc sera après bloc où on a crée
  51.     }
  52.     pnew=pnew->info.ptr; // Pas trouvé, on passe au prochain
  53.   }
  54.   // Si on a pas eu assez de place, on va devoir agrandir mem allouée avec sbrk
  55.   nb_sbrk++;
  56.   pnew = sbrk(headerSize*101);
  57.   pnew->info.size = headerSize*100;
  58.   pnew->info.ptr = &base;
  59.   //return malloc(size);
  60. }
  61.  
  62.  
  63. void myfree(void *ptr) {
  64.   Header *ph = ptr - headerSize;
  65.   Header *pprev = &base;
  66.   while(pprev->info.ptr < ph) {
  67.     pprev = pprev->info.ptr;
  68.   }
  69.   ph->info.ptr = pprev->info.ptr;
  70.   // ***** Fusion avec les potentiels blocs libres suivants
  71.   while(ph+ph->info.size+headerSize == ph->info.ptr) {
  72.     ph->info.size += ph->info.ptr->info.size + headerSize;
  73.     ph->info.ptr = ph->info.ptr->info.ptr;
  74.   }
  75.   // ***** Fin de la fusion
  76.   pprev->info.ptr = ph;
  77.   nb_dealloc += 1;
  78.   //free(ptr);
  79. }
  80.  
  81. void *mycalloc(size_t nmemb, size_t size) {
  82.   //nb_alloc += 1;
  83.   return mymalloc(nmemb*size);
  84.   //return calloc(nmemb, size);
  85. }
  86.  
  87. void *myrealloc(void *ptr, size_t size) {
  88.   /* il faudrait probablement changer les valeur de nballoc et
  89.    * nb_dealloc dans une véritable implémentation
  90.    */
  91.   if(ptr = NULL) { // avoir ptr NULL équivaut à avoir un malloc
  92.     return mymalloc(size);
  93.   }
  94.   else if(size==0) { //  size 0 équivaut à avoir un free
  95.     free(ptr);
  96.   }
  97.   else { // Si aucun de ces cas, on fait un realloc 'standard'
  98.     Header *p = (Header*)ptr;
  99.     p->info.size = size;
  100.     return p;
  101.   }
  102.   //return realloc(ptr, size);
  103. }
  104.  
  105. #ifdef MALLOC_DBG
  106. void mymalloc_infos(char *msg) {
  107.   if (msg) fprintf(stderr, "**********\n*** %s\n", msg);
  108.  
  109.   fprintf(stderr, "# allocs = %3d - # deallocs = %3d - # sbrk = %3d\n\n",
  110.       nb_alloc, nb_dealloc, nb_sbrk);
  111.   /* Ca pourrait être pas mal d'afficher ici les blocs dans la liste libre */
  112.   // ******************** FAIT ICI ********************
  113.   Header *pnew = &base;
  114.   int i = 0;
  115.   while(pnew->info.ptr!=&base) { // On cherche un bloc libre assez gros
  116.     i++;
  117.     fprintf(stderr, "=== Block No. %d ===\n", i);
  118.     fprintf(stderr, "Current adress : %d\n", pnew);
  119.     fprintf(stderr, "Next free block : %d\n", pnew->info.ptr);
  120.     fprintf(stderr, "Block size : %d\n\n", pnew->info.size);
  121.     pnew=pnew->info.ptr; // Pas trouvé, on passe au prochain
  122.   }
  123.   // ******************** FAIT ICI ********************
  124.  
  125.   if (msg) fprintf(stderr, "**********\n\n");
  126. }
  127. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement