Index: trunk/src/board.c =================================================================== --- trunk/src/board.c (revision 12232) +++ trunk/src/board.c (revision 12233) @@ -52,6 +52,7 @@ pcb_ratspatch_destroy(pcb); pcb_data_free(pcb->Data); free(pcb->Data); + /* release font symbols */ pcb_fontkit_free(&pcb->fontkit); for (i = 0; i < PCB_NUM_NETLISTS; i++) @@ -58,6 +59,9 @@ pcb_lib_free(&(pcb->NetlistLib[i])); vtroutestyle_uninit(&pcb->RouteStyle); pcb_attribute_free(&pcb->Attributes); + + pcb_layergroup_free_stack(&pcb->LayerGroups); + /* clear struct */ memset(pcb, 0, sizeof(pcb_board_t)); } Index: trunk/src/layer_grp.c =================================================================== --- trunk/src/layer_grp.c (revision 12232) +++ trunk/src/layer_grp.c (revision 12233) @@ -183,6 +183,12 @@ return pcb_true; } +static int pcb_layergrp_free_fields(pcb_layergrp_t *g) +{ + free(g->name); +} + + int pcb_layergrp_free(pcb_board_t *pcb, pcb_layergrp_id_t id) { pcb_layer_stack_t *stack = &pcb->LayerGroups; @@ -189,12 +195,11 @@ if ((id >= 0) && (id < stack->len)) { int n; pcb_layergrp_t *g = stack->grp + id; - if (g->name != NULL) - free(g->name); for(n = 0; n < g->len; n++) { pcb_layer_t *layer = pcb->Data->Layer + g->lid[n]; layer->meta.real.grp = -1; } + pcb_layergrp_free_fields(g); memset(g, 0, sizeof(pcb_layergrp_t)); return 0; } @@ -832,7 +837,18 @@ return 0; } +void pcb_layergroup_free_stack(pcb_layer_stack_t *st) +{ + int n; + for(n = 0; n < st->len; n++) + pcb_layergrp_free_fields(st->grp + n); + + free(st->cache.copper); + st->cache.copper = NULL; + st->cache.copper_len = st->cache.copper_alloced = 0; +} + static pcb_layergrp_id_t pcb_layergrp_get_cached(pcb_board_t *pcb, pcb_layer_id_t *cache, unsigned int loc, unsigned int typ) { pcb_layergrp_t *g; Index: trunk/src/layer_grp.h =================================================================== --- trunk/src/layer_grp.h (revision 12232) +++ trunk/src/layer_grp.h (revision 12233) @@ -56,8 +56,15 @@ struct pcb_layer_stack_s { pcb_cardinal_t len; pcb_layergrp_t grp[PCB_MAX_LAYERGRP]; + struct { /* cache copper groups from top to bottom for fast padstack ("bbvia") lookup */ + int copper_len, copper_alloced; + pcb_layergrp_id_t *copper; + } cache; }; +/* Free all fields of a layer stack */ +void pcb_layergroup_free_stack(pcb_layer_stack_t *st); + /* Return the layer group for an id, or NULL on error (range check) */ pcb_layergrp_t *pcb_get_layergrp(pcb_board_t *pcb, pcb_layergrp_id_t gid);