/****************************************
 * Sebastien Leriche, Antoine Jacquet   *
 * En-tete du module de gestion memoire *
 * Niveau 4                             *
 ****************************************/

#ifndef _MEMOIRE_
#define _MEMOIRE_

#include <stdio.h>
#define TAILLE_IDENT 20
/* Nombre de caractere maximum des identificateurs */
#define MAX_REF 10
/* Nombre maximum de liens */

extern int cpt_malloc, cpt_free;
extern char politique;
extern FILE *fhistorique;

struct zone_libre
{
  int adresse;
  int taille;
};

struct liste_libre
{
  struct zone_libre bloc;
  struct liste_libre *p_suivant;
};

struct tas_occupe
{
  char ident[TAILLE_IDENT];
  int adresse;
  int taille;
  int compteur_references;
  char liste_ident[MAX_REF][TAILLE_IDENT];
  char drapeau;
};

struct liste_tas
{
  struct tas_occupe tas;
  struct liste_tas *p_suivant;
};

struct programme
{
  char ident[TAILLE_IDENT];
  struct programme *p_suivant;
};

struct memoire
{
  int taille_memoire;
  void *mem;
  struct liste_libre *p_liste_libre;
  struct liste_tas *p_liste_tas;
  struct programme *p_liste_programmes;
};

int initialiser(int t,struct memoire **pp_memoire);
/* Initialise la memoire
   Retourne -1 en cas d'erreur, 0 sinon */

int terminer(struct memoire **pp_memoire);
/* Libere correctement la memoire
   Retourne -1 en cas de mauvaise gestion de la memoire, 0 sinon */

int allouer(int t, struct memoire *p_memoire);
/* Alloue une zone memoire de taille t
   Retourne son adresse, -1 sinon */

int liberer(int adresse_libre, int taille_libre, struct memoire *p_memoire);
/* Libere la zone memoire de taille taille_libre a l'adresse adresse_libre
   Retourne -1 en cas d'erreur, 0 sinon */

int allouer_tas(char identite_tas[], int taille_tas, struct memoire *p_memoire);
/* Ajoute un tas de nom identite_tas et de taille taille_tas
   Retourne -1 en cas d'erreur, 0 sinon */

int liberer_tas(char identite_tas[], struct memoire *p_memoire);
/* Libere le tas de nom identite_tas
   Retourne -1 en cas d'erreur, 0 sinon */

int ajouter_programme(char ident[], struct memoire *p_memoire);
/* Ajoute le programme de nom ident
   Retourne -1 en cas d'erreur, 0 sinon */

int supprimer_programme(char ident[], struct memoire *p_memoire);
/* Supprime le programme de nom ident
   Retourne -1 en cas d'erreur, 0 sinon */

int ajouter_lien(char tas_referencant[], char tas_reference[], struct memoire *p_memoire);
/* Ajoute un lien de tas_referencant vers tas_reference
   Retourne -1 en cas d'echec, 0 sinon */

int supprimer_lien(char tas_referencant[], char tas_reference[], struct memoire *p_memoire);
/* Supprime le lien de tas_referencant vers tas_reference
   Retourne -1 en cas d'echec, 0 sinon */

int ramasse_miettes_compteurs(struct memoire *p_memoire);
/* Libere les tas dont le compteur de reference est a zero
   Retoure -1 si aucun tas n'a ete libere, 0 sinon */

int ramasse_miettes_marquage_balayage(struct memoire *p_memoire);
/* Libere les tas non accessibles depuis les programmes
   Retourne -1 en cas d'erreur, 0 sinon */

#endif