star-cad

Geometric operators for computer-aided design
git clone git://git.meso-star.fr/star-cad.git
Log | Files | Refs | README | LICENSE

commit 508b076e2b1147f348d23a1271be0f02c02616cf
parent b78fa5611f0ac12be18b016b084f8da0a85ce56b
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed,  3 Sep 2025 11:03:24 +0200

Improve context destruction code

Use geometry ref_put instead of a special code to release gmsh tags
directly.

Diffstat:
Msrc/scad_device.c | 60+++++-------------------------------------------------------
1 file changed, 5 insertions(+), 55 deletions(-)

diff --git a/src/scad_device.c b/src/scad_device.c @@ -30,58 +30,6 @@ /******************************************************************************* * Local functions ******************************************************************************/ -static void -device_release_tags_of_dim - (struct scad_device* dev, - const int dim) -{ - struct htable_tags2desc* table; - struct htable_tags2desc_iterator it, end; - int fst = 1; - int ierr; - ASSERT(dev); - CHK(dim == 2 || dim == 3); /* other dims not managed yet */ - - table = dev->tags2desc + dim - 2; - htable_tags2desc_begin(table, &it); - htable_tags2desc_end(table, &end); - while(!htable_tags2desc_iterator_eq(&it, &end)) { - int dt[2], tag = *htable_tags2desc_iterator_key_get(&it); - struct tag_desc* desc = device_get_description(dim, tag); - ASSERT(desc->refcount > 0); - htable_tags2desc_iterator_next(&it); - /* desc is a descriptor for a non-released tag */ - if(fst) { - fst = 0; - logger_print(dev->logger, dev->log_type, - "Some tags were not removed properly.\n"); - } - logger_print(dev->logger, dev->log_type, "Tag %d.%d (refcount = %lu).\n", - dim, tag, (long unsigned)desc->refcount); - /* Remove tag according to policy */ - dt[0] = dim; - dt[1] = tag; - switch(desc->delete_policy) { - case Scad_do_not_delete: - logger_print(dev->logger, dev->log_type, - "Tag %d.%d not deleted due to policy.\n", - dim, tag); - break; - case Scad_delete_non_recursive: - logger_print(dev->logger, dev->log_type, - "Tag %d.%d non-recursively deleted due to policy.\n", - dim, tag); - gmshModelOccRemove(dt, 2, 0, &ierr); - break; - case Scad_delete_recursive: - gmshModelOccRemove(dt, 2, 1, &ierr); - break; - default: FATAL("Invalid enum value"); - } - } - htable_tags2desc_release(table); -} - static res_T device_release(struct scad_device* dev) { @@ -113,13 +61,15 @@ device_release(struct scad_device* dev) } while(!htable_geometries_iterator_eq(&it, &end)) { struct scad_geometry* geom = *htable_geometries_iterator_key_get(&it); - SCAD(geometry_ref_put(geom)); + while(geom->ref > 0) { + SCAD(geometry_ref_put(geom)); + } htable_geometries_iterator_next(&it); } htable_names_release(&dev->geometry_names); htable_geometries_release(&dev->allgeom); - device_release_tags_of_dim(dev, 2); - device_release_tags_of_dim(dev, 3); + htable_tags2desc_release(dev->tags2desc); + htable_tags2desc_release(dev->tags2desc+1); htable_size_modifiers_release(&dev->size_modifiers_by_dim[0]); htable_size_modifiers_release(&dev->size_modifiers_by_dim[1]); htable_size_modifiers_release(&dev->size_modifiers_by_dim[2]);