Browse Source

RI_free funcs now properly check if something was already freed

Iver 4 months ago
parent
commit
15b47c0bc1

BIN
build/librasteriver.so


BIN
build/main.bin


BIN
compiled_libs/librasteriver.so


+ 5 - 5
src/headers/functions.h

@@ -56,19 +56,19 @@ void RI_wipe_texture(RI_texture *target_texture, uint32_t color);
 // ----- memory
 
 // Unallocated a scene
-void RI_free_scene(RI_scene *scene);
+void RI_free_scene(RI_scene **scene);
 
 // Unallocates a texture 
-void RI_free_texture(RI_texture *texture);
+void RI_free_texture(RI_texture **texture);
 
 // Unallocates a material (NOT it's references)
-void RI_free_material(RI_material *material);
+void RI_free_material(RI_material **material);
 
 // Unallocated a mesh
-void RI_free_mesh(RI_mesh *mesh);
+void RI_free_mesh(RI_mesh **mesh);
 
 // Unallocated an actor (NOT it's references)
-void RI_free_actor(RI_actor *actor);
+void RI_free_actor(RI_actor **actor);
 
 // ------ other
 

+ 9 - 9
src/launch_program/main.c

@@ -14,7 +14,7 @@ int main(){
     // get RasterIver context
     RasterIver *ri = RI_get_ri();
 
-    ri->debug_memory = 1;
+    ri->debug_memory = 0;
 
     RI_init(700, 700, "This is RasterIver 2.0!!");
 
@@ -112,18 +112,18 @@ int main(){
 
     free(fps_string);
 
-    RI_free_texture(bill_material->texture_reference);
-    RI_free_texture(text_plane_material->texture_reference);
+    RI_free_texture(&bill_material->texture_reference);
+    RI_free_texture(&text_plane_material->texture_reference);
 
-    RI_free_material(bill_material);
-    RI_free_material(text_plane_material);
+    RI_free_material(&bill_material);
+    RI_free_material(&text_plane_material);
 
-    RI_free_mesh(plane_mesh);
+    RI_free_mesh(&plane_mesh);
     
-    RI_free_actor(bill_plane);
-    RI_free_actor(text_plane);
+    RI_free_actor(&bill_plane);
+    RI_free_actor(&text_plane);
 
-    RI_free_scene(scene);
+    RI_free_scene(&scene);
 
     RI_stop(0);
 

+ 38 - 22
src/library/rasteriver.c

@@ -1223,56 +1223,72 @@ int sdl_init(int RI_window_width, int RI_window_height, char *RI_window_title){
     return 0;
 }
 
-void RI_free_scene(RI_scene *scene){
-    if (!scene){
+// these functions take in a pointer to the pointer to the thing being freed.
+// this is so you can reset the pointer to NULL and then check if it was previously freed and then not try to free it
+
+void RI_free_scene(RI_scene **scene){
+    if (!scene || !*scene){
         debug("[RI_free_scene] Cannot free scene, already frung");
         return;
     } 
 
-    if (scene->actors) RI_free(scene->actors);
-    if (scene->faces_to_render) RI_free(scene->faces_to_render);
-    RI_free(scene);
+    if ((*scene)->actors) RI_free((*scene)->actors);
+    if ((*scene)->faces_to_render) RI_free((*scene)->faces_to_render);
+ 
+    RI_free(*scene);
+
+    *scene = NULL;
 }
 
-void RI_free_texture(RI_texture *texture){
-    if (!texture){
+void RI_free_texture(RI_texture **texture){
+    if (!texture || !*texture){
         debug("[RI_free_texture] Cannot free texture, already frung");
         return;
     } 
 
-    if (texture->image_buffer) RI_free(texture->image_buffer);
-    RI_free(texture);
+    if ((*texture)->image_buffer) RI_free((*texture)->image_buffer);
+
+    RI_free(*texture);
+
+    *texture = NULL;
 }
 
-void RI_free_material(RI_material *material){
-    if (!material){
+void RI_free_material(RI_material **material){
+    if (!material || !*material){
         debug("[RI_free_material] Cannot free material, already frung");
         return;
     } 
 
-    RI_free(material);
+    RI_free(*material);
+
+    *material = NULL;
 }
 
-void RI_free_mesh(RI_mesh *mesh){
-    if (!mesh){
+void RI_free_mesh(RI_mesh **mesh){
+    if (!mesh || !*mesh){
         debug("[RI_free_mesh] Cannot free mesh, already frung");
         return;
     } 
 
-    if (mesh->faces) RI_free(mesh->faces);
-    if (mesh->normals) RI_free(mesh->normals);
-    if (mesh->uvs) RI_free(mesh->uvs);
-    if (mesh->vertex_positions) RI_free(mesh->vertex_positions);
-    RI_free(mesh);
+    if ((*mesh)->faces) RI_free((*mesh)->faces);
+    if ((*mesh)->normals) RI_free((*mesh)->normals);
+    if ((*mesh)->uvs) RI_free((*mesh)->uvs);
+    if ((*mesh)->vertex_positions) RI_free((*mesh)->vertex_positions);
+
+    RI_free(*mesh);
+
+    *mesh = NULL;
 }
 
-void RI_free_actor(RI_actor *actor){
-    if (!actor){
+void RI_free_actor(RI_actor **actor){
+    if (!actor || !*actor){
         debug("[RI_free_actor] Cannot free actor, already frung");
         return;
     } 
 
-    RI_free(actor);
+    RI_free(*actor);
+
+    *actor = NULL;
 }
 
 int RI_stop(int result){