From b1a951a9e66b332ea4029ee84de2f95f0ff91427 Mon Sep 17 00:00:00 2001
From: Georges Da Costa <dacosta@irit.fr>
Date: Tue, 5 May 2020 00:01:59 +0200
Subject: [PATCH] corrects a memory leaks

---
 mojitos.c |  8 +++++---
 rapl.c    | 19 ++++++++++++-------
 rapl.h    |  8 +++++---
 3 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/mojitos.c b/mojitos.c
index ffc9869..3c34a0f 100644
--- a/mojitos.c
+++ b/mojitos.c
@@ -210,7 +210,7 @@ int main(int argc, char **argv) {
     get_load(load_values);
   
   // RAPL initialization
-  rapl_t rapl=NULL;
+  _rapl_t* rapl=NULL;
   size_t rapl_size=0;
   uint64_t * rapl_values=NULL;
   uint64_t * tmp_rapl_values=NULL;
@@ -218,8 +218,10 @@ int main(int argc, char **argv) {
     rapl = init_rapl(nbzones, rapl_zones);
     // prepare rapl data stores
     rapl_size = rapl->nbpackages*rapl->nbzones * sizeof(uint64_t);
-    rapl_values = malloc(rapl_size);
-    tmp_rapl_values = malloc(rapl_size);
+    //rapl_values = malloc(rapl_size);
+    rapl_values = calloc(sizeof(char), rapl_size);
+    //tmp_rapl_values = malloc(rapl_size);
+    tmp_rapl_values = calloc(sizeof(char), rapl_size);
     // initialize with dummy values
     get_rapl(rapl_values, rapl);
   }
diff --git a/rapl.c b/rapl.c
index 3cc0b02..da171da 100644
--- a/rapl.c
+++ b/rapl.c
@@ -20,12 +20,14 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+
 #include "rapl.h"
 
 #define MAX_LEN_NAME 100
-rapl_t init_rapl(const uint32_t nb_zones, const int *rapl_zones) {
+_rapl_t* init_rapl(const uint32_t nb_zones, const int *rapl_zones) {
   // get number of processor sockets
-  rapl_t rapl = malloc(sizeof(struct _rapl_t));
+  _rapl_t* rapl = malloc(sizeof(struct _rapl_t));
   rapl->nbzones = nb_zones;
   rapl->zones = rapl_zones;
 
@@ -41,12 +43,15 @@ rapl_t init_rapl(const uint32_t nb_zones, const int *rapl_zones) {
       exit(-1);
     }
 
-  rapl->names = malloc(sizeof(char*)* rapl->nbzones*rapl->nbpackages);
+  rapl->names = malloc(sizeof(char*) * (rapl->nbzones) * (rapl->nbpackages) );
+  char _name[MAX_LEN_NAME+1];
+
   for (int package = 0; package < rapl->nbpackages; package++) {
     for(int zone=0; zone<rapl->nbzones; zone++) {
-      rapl->names[package*rapl->nbzones+zone]=malloc(MAX_LEN_NAME);
       powercap_rapl_get_name(&rapl->pkgs[package], rapl_zones[zone],
-			     rapl->names[package*rapl->nbzones+zone], MAX_LEN_NAME);
+			     _name, MAX_LEN_NAME);
+      rapl->names[package*rapl->nbzones+zone] = malloc(sizeof(char) * (strlen(_name)+1));
+      strcpy(rapl->names[package*rapl->nbzones+zone], _name);
     }
   }
   return rapl;
@@ -55,7 +60,7 @@ rapl_t init_rapl(const uint32_t nb_zones, const int *rapl_zones) {
 
 
 // values [zone + package *nbzones] microjoules
-void get_rapl(uint64_t *values, rapl_t rapl) {
+void get_rapl(uint64_t *values, _rapl_t* rapl) {
   for (int package = 0; package < rapl->nbpackages; package++) {
     for(int zone=0; zone<rapl->nbzones; zone++) {
       powercap_rapl_get_energy_uj(&rapl->pkgs[package], rapl->zones[zone], &values[package*rapl->nbzones+zone]);
@@ -63,7 +68,7 @@ void get_rapl(uint64_t *values, rapl_t rapl) {
   }
 }
 
-void clean_rapl(rapl_t rapl) {
+void clean_rapl(_rapl_t* rapl) {
   for (int package = 0; package < rapl->nbpackages; package++) {
     if (powercap_rapl_destroy(&rapl->pkgs[package]))
       perror("powercap_rapl_destroy");
diff --git a/rapl.h b/rapl.h
index 62b2484..1af8cf4 100644
--- a/rapl.h
+++ b/rapl.h
@@ -30,6 +30,8 @@ struct _rapl_t {
 
 typedef struct _rapl_t* rapl_t;
 
-rapl_t init_rapl(const uint32_t nb_zones, const int *rapl_zones);
-void get_rapl(uint64_t *values, rapl_t rapl);
-void clean_rapl(rapl_t rapl);
+typedef struct _rapl_t _rapl_t;
+
+_rapl_t* init_rapl(const uint32_t nb_zones, const int *rapl_zones);
+void get_rapl(uint64_t *values, _rapl_t* rapl);
+void clean_rapl(_rapl_t* rapl);
-- 
GitLab