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:
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]);