commit eadd9855ae9657076e01f3af4f412ffa6310bc85
parent cd859b7cef13a1860575de3de06d534cf2da8268
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sun, 15 Jan 2023 07:40:31 +0900
Add counters for memory debugging.
counters incremented with malloc and decremented with free
for each structs.
maybe List struct is the source of memory leak.
Diffstat:
5 files changed, 66 insertions(+), 7 deletions(-)
diff --git a/ex9/list.c b/ex9/list.c
@@ -8,6 +8,8 @@ static int __lqsort(List *p, List *tail,
 	int (* cmp)(void *, void *));
 static void __lprint(List *p, List *tail, void (* pfnc)(void *));
 
+static int list_count = 0;
+
 /*
  * Laddfront() adds item in front of List p.
  * Returns NULL if error occured.
@@ -26,6 +28,7 @@ laddfront(List *p, void *item)
 		fprintf(stderr, "laddfront: Error. Could not allocate memory.\n");
 		return NULL;
 	}
+	list_count++;
 	newlp->item = item;
 	newlp->next = p;
 	return newlp;
@@ -41,6 +44,7 @@ lfree(List *p)
 	for (q = p; q != NULL; q = p) {
 		p = q->next;
 		free(q);
+		list_count--;
 	}
 }
 
@@ -55,9 +59,16 @@ lfreei(List *p, void (* ifree)(void *))
 		p = q->next;
 		ifree(q->item);
 		free(q);
+		list_count--;
 	}
 }
 
+int
+get_list_count(void)
+{
+	return list_count;
+}
+
 void
 lprint(List *p, void (* pfnc)(void *))
 {
diff --git a/ex9/list.h b/ex9/list.h
@@ -6,6 +6,7 @@ typedef struct List {
 
 List * laddfront(List *p, void *item);
 void lfree(List *p);
+int get_list_count(void);
 void lfreei(List *p, void (* ifree)(void *));
 void lprint(List *p, void (* pfnc)(void *));
 int lbsort(List *p, int (* cmp)(void *, void *));
diff --git a/ex9/main.c b/ex9/main.c
@@ -317,6 +317,9 @@ game_play(void)
 		}
 	}
 	lfreei(ol, (void (*)(void *))&free_object);
+	printf("obj_count: %d\n", get_obj_count());
+	printf("lld_count: %d\n", get_lld_count());
+	printf("list_count: %d\n", get_list_count());
 }
 
 void
diff --git a/ex9/object.c b/ex9/object.c
@@ -5,10 +5,6 @@
 #include "list.h"
 #include "object.h"
 
-static int test_collision_rr(Object *, Object *);
-static void rect_next_tick(Object *, long);
-static void rect_handle_collision_mf(Object *, Object *);
-
 /*
  * Pair of two objects with their distance.
  * Used by lhandle_collision();
@@ -19,12 +15,24 @@ typedef struct LLD {
 	float dist;
 } LLD;
 
+static int test_collision_rr(Object *, Object *);
+static void rect_next_tick(Object *, long);
+static void rect_handle_collision_mf(Object *, Object *);
+static LLD *create_lld(void);
+static void lldfree(LLD *);
+
+static int obj_count = 0;
+static int lld_count = 0;
+
+
 Object *
 create_object(enum object_type t, uint32_t color,
               float px, float py, float vx, float vy, float ax, float ay,
               int w, int h, int m,
 			  void (*next_tick)(Object *, long))
 {
+	obj_count++;
+
 	Object *o;
 	o = (Object *)malloc(sizeof(Object));
 	o->type = t;
@@ -49,9 +57,16 @@ create_object(enum object_type t, uint32_t color,
 void
 free_object(Object *o)
 {
+	obj_count--;
 	free(o);
 }
 
+int
+get_obj_count(void)
+{
+	return obj_count;
+}
+
 /*
  * 1 if collide, 0 if not
  */
@@ -242,6 +257,29 @@ lldprint(LLD *p)
 	printf(", %2.0f}", p->dist);
 }
 
+static LLD *
+create_lld(void)
+{
+	LLD *p = NULL;
+	p = (LLD *)malloc(sizeof(LLD));
+
+	lld_count++;
+	return p;
+}
+
+static void
+lldfree(LLD *p)
+{
+	lld_count--;
+	free(p);
+}
+
+int
+get_lld_count(void)
+{
+	return lld_count;
+}
+
 /*
  * The order of list p will be changed.
  */
@@ -266,8 +304,12 @@ lhandle_collision(List *p)
 			lld = NULL;
 			for (s = stack; s != NULL && s->next != NULL; s = s->next) {
 				for (t = s->next; t != NULL; t = t->next) {
-					LLD *l;
-					l = (LLD *)malloc(sizeof(LLD));
+					LLD *l = NULL;
+					if((l = create_lld()) == NULL) {
+						fprintf(stderr, "lhandle_collision: Error. creating"
+							"lld.\n");
+						exit(1);
+					}
 					l->o0 = (Object *)s->item;
 					l->o1 = (Object *)t->item;
 					l->dist = object_dist((Object *)s->item,
@@ -289,7 +331,7 @@ lhandle_collision(List *p)
 						((LLD *)tmplld->item)->o1);
 				}
 			}
-			lfreei(lld, &free);
+			lfreei(lld, &lldfree);
 			lfree(stack);
 			stack = NULL;
 		}
diff --git a/ex9/object.h b/ex9/object.h
@@ -64,6 +64,8 @@ Object *create_object(enum object_type, uint32_t,
                              int, int, int,
 							 void (*)(Object *, long));
 void free_object(Object *);
+int get_obj_count(void);
+int get_lld_count(void);
 int is_on_floor(Object *, Object *);
 int is_on_floor_before(Object *, Object *);
 void oprint(Object *);