--- rpl/src/allocateur.c 2015/01/27 15:41:25 1.4 +++ rpl/src/allocateur.c 2015/01/30 07:53:14 1.5 @@ -240,8 +240,10 @@ liberation_allocateur_buffer(struct_proc for(i = 0; i < longueur_tailles; i++) { +uprintf("L %d ************* %d ********************\n", getpid(), i); for(j = 0; j < (*s_etat_processus).pointeur_cache_buffer[i]; j++) { +uprintf("L %d %p\n", getpid(), (*s_etat_processus).cache_buffer[i][j]); sys_free((*s_etat_processus).cache_buffer[i][j]); } @@ -304,6 +306,7 @@ allocation_buffer(struct_processus *s_et { (*s_buffer).buffer = (*s_etat_processus).cache_buffer[classe] [--(*s_etat_processus).pointeur_cache_buffer[classe]]; +uprintf("Cachée : %d %p\n", getpid(), (*s_buffer).buffer); } else { @@ -315,6 +318,7 @@ allocation_buffer(struct_processus *s_et d_es_allocation_memoire; return(NULL); } +uprintf("Alloué : %d %p\n", getpid(), (*s_buffer).buffer); } } else @@ -325,6 +329,7 @@ allocation_buffer(struct_processus *s_et (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(NULL); } +uprintf("Alloué (non cachée) : %d %p\n", getpid(), (*s_buffer).buffer); } } @@ -362,6 +367,7 @@ liberation_buffer(struct_processus *s_et if ((*s_buffer).buffer != NULL) { sys_free((*s_buffer).buffer); +uprintf("Libération (trop grand) : %d %p\n", getpid(), (*s_buffer).buffer); } } else @@ -372,10 +378,12 @@ liberation_buffer(struct_processus *s_et (*s_etat_processus).cache_buffer[(*s_buffer).classe] [(*s_etat_processus).pointeur_cache_buffer [(*s_buffer).classe]++] = (*s_buffer).buffer; +uprintf("Mise en cache : %d %p\n", getpid(), (*s_buffer).buffer); } else { sys_free((*s_buffer).buffer); +uprintf("Libération (cache plein) : %d %p\n", getpid(), (*s_buffer).buffer); } } @@ -405,13 +413,29 @@ rpl_malloc(struct_processus *s_etat_proc void *pointeur; + if (pthread_mutex_lock(&((*s_etat_processus).mutex_allocation_buffer)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(NULL); + } + if ((s_buffer = allocation_buffer(s_etat_processus, s)) == NULL) { + pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation_buffer)); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(NULL); } pointeur = (*s_buffer).buffer + sizeof(struct_buffer *); + + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation_buffer)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(NULL); + } + return(pointeur); } @@ -440,8 +464,16 @@ rpl_realloc(struct_processus *s_etat_pro void *pointeur; + if (pthread_mutex_lock(&((*s_etat_processus).mutex_allocation_buffer)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(NULL); + } + if ((s_nouveau_buffer = allocation_buffer(s_etat_processus, s)) == NULL) { + pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation_buffer)); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(NULL); } @@ -458,6 +490,13 @@ rpl_realloc(struct_processus *s_etat_pro liberation_buffer(s_etat_processus, s_ancien_buffer); pointeur = (*s_nouveau_buffer).buffer + sizeof(struct_buffer *); + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation_buffer)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(NULL); + } + return(pointeur); } @@ -485,7 +524,22 @@ rpl_free(struct_processus *s_etat_proces } s_buffer = (*((struct_buffer **) (ptr - sizeof(struct_buffer *)))); + + if (pthread_mutex_lock(&((*s_etat_processus).mutex_allocation_buffer)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + liberation_buffer(s_etat_processus, s_buffer); + + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation_buffer)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + return; }