commit f968ffa8cdb1c097cb5ae8335a69ea1c7f0fb307
parent b249dc676de87f160c6e50a19241a27a1f4fad52
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 7 Jan 2020 16:35:15 +0100
Fix a memleak
Diffstat:
2 files changed, 4 insertions(+), 241 deletions(-)
diff --git a/src/senc_scene.c b/src/senc_scene.c
@@ -113,8 +113,10 @@ senc_scene_create
OK(darray_enclosure_resize(&scn->analyze.enclosures, 1));
scn->analyze.enclosures_count = 1;
- if(!scn || !indices || !position || !nverts || !ntris)
- return RES_BAD_ARG;
+ if(!scn || !indices || !position || !nverts || !ntris) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
OK(darray_position_reserve(&scn->vertices, scn->nverts));
OK(darray_triangle_in_reserve(&scn->triangles_in, scn->ntris));
@@ -298,7 +300,6 @@ senc_scene_get_vertex
const unsigned ivert,
double coord[3])
{
-
const union double3* v;
if(!scn || !coord
|| ivert >= darray_position_size_get(&scn->vertices))
diff --git a/src/test_senc_descriptor.c b/src/test_senc_descriptor.c
@@ -1,238 +0,0 @@
-/* Copyright (C) |Meso|Star> 2016-2018 (contact@meso-star.com)
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
-#include "senc.h"
-#include "test_senc_utils.h"
-
-#include <rsys/float3.h>
-#include <rsys/double3.h>
-
-int
-main(int argc, char** argv)
-{
- struct mem_allocator allocator;
- struct senc_device* dev = NULL;
- struct senc_scene* scn = NULL;
- struct descriptor* desc = NULL;
- struct senc_enclosure* enc = NULL;
- struct context ctx = CONTEXT_NULL__;
- unsigned count, maxm;
- unsigned indices[3];
- double coord[3];
- unsigned media[2];
- unsigned enclosures[2];
- (void)argc, (void)argv;
-
- CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK);
- CHK(senc_device_create(NULL, &allocator, SENC_NTHREADS_DEFAULT, 1, &dev)
- == RES_OK);
-
- CHK(senc_scene_create(dev,
- SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE, &scn) == RES_OK);
-
- /* A 3D cube */
- ctx.positions = box_vertices;
- ctx.indices = box_indices;
- ctx.scale = 1;
- ctx.reverse_vrtx = 0;
- ctx.reverse_med = 0;
- d3(ctx.offset, 0, 0, 0);
- ctx.front_media = medium0;
- ctx.back_media = medium1;
-
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
-
- CHK(senc_scene_analyze(scn, &desc) == RES_OK);
-
- CHK(senc_descriptor_ref_get(desc) == RES_OK);
- CHK(senc_descriptor_ref_get(NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_ref_put(NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_ref_put(desc) == RES_OK);
-
- CHK(senc_descriptor_get_max_medium(NULL, &maxm) == RES_BAD_ARG);
- CHK(senc_descriptor_get_max_medium(desc, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_max_medium(NULL, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_max_medium(desc, &maxm) == RES_OK);
-
- CHK(maxm == 1);
-
- CHK(senc_descriptor_get_enclosure_count(NULL, &count) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_count(desc, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_count(NULL, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_count(desc, &count) == RES_OK);
-
- CHK(count == 2);
-
- CHK(senc_descriptor_get_enclosure_count_by_medium(NULL, 0, &count) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_count_by_medium(desc, 9, &count) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_count_by_medium(desc, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_count_by_medium(NULL, 9, &count) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_count_by_medium(NULL, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_count_by_medium(desc, 9, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_count_by_medium(NULL, 9, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_count_by_medium(desc, 0, &count) == RES_OK);
-
- CHK(count == 1);
-
- CHK(senc_descriptor_get_enclosure(NULL, 0, &enc) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure(desc, 9, &enc) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure(desc, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure(NULL, 9, &enc) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure(NULL, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure(desc, 9, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure(NULL, 9, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure(desc, 0, &enc) == RES_OK);
-
- CHK(senc_enclosure_ref_put(enc) == RES_OK);
-
- CHK(senc_descriptor_get_enclosure_by_medium(desc, 0, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(desc, 0, 9, &enc) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(desc, 0, 9, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(desc, 9, 0, &enc) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(desc, 9, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(desc, 9, 9, &enc) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(desc, 9, 9, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(NULL, 0, 0, &enc) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(NULL, 0, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(NULL, 0, 9, &enc) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(NULL, 0, 9, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(NULL, 9, 0, &enc) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(NULL, 9, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(NULL, 9, 9, &enc) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(NULL, 9, 9, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_enclosure_by_medium(desc, 0, 0, &enc) == RES_OK);
-
- CHK(senc_descriptor_get_vertices_count(NULL, &count) == RES_BAD_ARG);
- CHK(senc_descriptor_get_vertices_count(desc, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_vertices_count(desc, &count) == RES_OK);
- CHK(count == nvertices);
-
- CHK(senc_descriptor_get_triangles_count(NULL, &count) == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangles_count(desc, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangles_count(desc, &count) == RES_OK);
- CHK(count == ntriangles);
-
- CHK(senc_descriptor_get_triangle(NULL, 0, indices) == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle(NULL, ntriangles, indices)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle(desc, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle(desc, 0, indices) == RES_OK);
- CHK(indices[0] == box_indices[0]
- && indices[1] == box_indices[1]
- && indices[2] == box_indices[2]);
-
- CHK(senc_descriptor_get_vertex(NULL, 0, coord) == RES_BAD_ARG);
- CHK(senc_descriptor_get_vertex(NULL, nvertices, coord)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_vertex(desc, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_vertex(desc, 0, coord) == RES_OK);
- CHK(coord[0] == box_vertices[0]
- && coord[1] == box_vertices[1]
- && coord[2] == box_vertices[2]);
-
- CHK(senc_descriptor_get_triangle_media(NULL, 0, media)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle_media(NULL, nvertices, media)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle_media(desc, 0, NULL)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle_media(desc, 0, media) == RES_OK);
- CHK(media[0] == ctx.front_media[0]
- && media[1] == ctx.back_media[1]);
-
- CHK(senc_descriptor_get_triangle_enclosures(
- NULL, 0, enclosures) == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle_enclosures(
- NULL, nvertices, enclosures) == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle_enclosures(desc, 0, NULL)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle_enclosures(desc, 0, enclosures)
- == RES_OK);
- CHK(enclosures[0] == 0 && enclosures[1] == 1);
-
- CHK(senc_descriptor_get_triangle_global_id(NULL, 0, indices)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle_global_id(NULL, nvertices, indices)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle_global_id(desc, 0, NULL)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_triangle_global_id(desc, 0, indices)
- == RES_OK);
- /* No duplicates: user id is unique vertex id */
- CHK(indices[0] == 0);
-
- /* Add valid duplicate geometry */
- CHK(senc_descriptor_ref_put(desc) == RES_OK);
- desc = NULL;
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
- CHK(senc_scene_analyze(scn, &desc) == RES_OK);
-
- CHK(senc_descriptor_get_vertices_count(desc, &count) == RES_OK);
- /* Duplicate vertices have been replaced */
- CHK(count == nvertices);
-
- CHK(senc_descriptor_get_triangles_count(desc, &count) == RES_OK);
- /* Duplicate triangles have been replaced */
- CHK(count == ntriangles);
-
- /* Add invalid duplicate geometry */
- CHK(senc_descriptor_ref_put(desc) == RES_OK);
- desc = NULL;
- ctx.front_media = medium1;
- ctx.back_media = medium0;
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- nvertices, get_position, NULL, NULL, &ctx) == RES_BAD_ARG);
-
- CHK(senc_scene_ref_put(scn) == RES_OK);
- if(desc) CHK(senc_descriptor_ref_put(desc) == RES_OK);
- desc = NULL;
- CHK(senc_enclosure_ref_put(enc) == RES_OK);
-
- /* Same cube with a hole (last triangle is missing) */
- CHK(senc_scene_create(dev,
- SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE, &scn)
- == RES_OK);
-
- CHK(senc_scene_add_geometry(scn, ntriangles - 1, get_indices, get_media,
- nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
-
- CHK(senc_scene_analyze(scn, &desc) == RES_OK);
-
- CHK(senc_descriptor_get_frontier_segments_count(NULL, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_frontier_segments_count(desc, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_frontier_segments_count(NULL, &count) == RES_BAD_ARG);
- CHK(senc_descriptor_get_frontier_segments_count(desc, &count) == RES_OK);
-
- CHK(senc_descriptor_get_frontier_segment(NULL, count, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_frontier_segment(desc, count, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_frontier_segment(NULL, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_frontier_segment(NULL, count, indices) == RES_BAD_ARG);
- CHK(senc_descriptor_get_frontier_segment(desc, 0, NULL) == RES_BAD_ARG);
- CHK(senc_descriptor_get_frontier_segment(desc, count, indices) == RES_BAD_ARG);
- CHK(senc_descriptor_get_frontier_segment(NULL, 0, indices) == RES_BAD_ARG);
- CHK(senc_descriptor_get_frontier_segment(desc, 0, indices) == RES_OK);
-
- CHK(senc_scene_ref_put(scn) == RES_OK);
- CHK(senc_device_ref_put(dev) == RES_OK);
- if(desc) CHK(senc_descriptor_ref_put(desc) == RES_OK);
-
- check_memory_allocator(&allocator);
- mem_shutdown_proxy_allocator(&allocator);
- CHK(mem_allocated_size() == 0);
-
- return 0;
-}