SG 1 год назад
Родитель
Сommit
3daa2720a1
3 измененных файлов с 21 добавлено и 4 удалено
  1. 8 0
      entity.c
  2. 2 0
      entity_i.h
  3. 11 4
      main.c

+ 8 - 0
entity.c

@@ -5,6 +5,12 @@
 
 #define ENTITY_DEBUG(...) FURI_LOG_D("Entity", __VA_ARGS__)
 
+static size_t entities_count = 0;
+
+size_t entities_get_count(void) {
+    return entities_count;
+}
+
 struct Entity {
     Vector position;
     const EntityDescription* behaviour;
@@ -12,6 +18,7 @@ struct Entity {
 };
 
 Entity* entity_alloc(const EntityDescription* behaviour) {
+    entities_count++;
     Entity* entity = malloc(sizeof(Entity));
     entity->position = VECTOR_ZERO;
     entity->behaviour = behaviour;
@@ -24,6 +31,7 @@ Entity* entity_alloc(const EntityDescription* behaviour) {
 }
 
 void entity_free(Entity* entity) {
+    entities_count--;
     ENTITY_DEBUG("Freeing entity at %p", entity);
     if(entity->context) {
         free(entity->context);

+ 2 - 0
entity_i.h

@@ -18,6 +18,8 @@ void entity_call_update(Entity* entity, Director* director);
 
 void entity_call_render(Entity* entity, Director* director, Canvas* canvas);
 
+size_t entities_get_count(void);
+
 #ifdef __cplusplus
 }
 #endif

+ 11 - 4
main.c

@@ -1,8 +1,9 @@
 #include <furi.h>
-#include "fgeo/game_engine.h"
-#include "fgeo/director_i.h"
-#include "fgeo/level_manager_i.h"
-#include "fgeo/level_i.h"
+#include "game_engine.h"
+#include "director_i.h"
+#include "level_manager_i.h"
+#include "level_i.h"
+#include "entity_i.h"
 
 void game_setup(Level* level);
 void game_destroy(void);
@@ -43,5 +44,11 @@ int32_t game_app(void* p) {
     level_manager_free(level_manager);
     director_free(director);
 
+    size_t entities = entities_get_count();
+    if(entities != 0) {
+        FURI_LOG_E("Game", "Memory leak detected: %d entities still allocated", entities);
+        return -1;
+    }
+
     return 0;
 }