ref: c6b9f1912fd3821f9806f74fa9b81ff9ba4d7b4e
parent: 2621771b920cecec2c0232a174a5aea4e1bd027f
author: rodri <rgl@antares-labs.eu>
date: Mon Dec 18 17:03:02 EST 2023
fix memory leak when counting faces during shading. since the model won't change, instead of freeing the elems on every run i decided to make the relevant counts statically allocated, and do the counting once.
--- a/main.c
+++ b/main.c
@@ -712,32 +712,35 @@
void
shade(Framebuf *fb, Shader *s)
{
- int i, nelems, nparts, nworkers;
+ static int nparts, nworkers;
+ static OBJElem **elems = nil;
+ int i, nelems;
uvlong time;
OBJObject *o;
- OBJElem **elems, *e;
+ OBJElem *e;
OBJIndexArray *idxtab;
SUparams *params;
Channel *donec;
- elems = nil;
- nelems = 0;
- for(i = 0; i < nelem(model->objtab); i++)
- for(o = model->objtab[i]; o != nil; o = o->next)
- for(e = o->child; e != nil; e = e->next){
- idxtab = &e->indextab[OBJVGeometric];
- /* discard non-triangles */
- if(e->type != OBJEFace || idxtab->nindex != 3)
- continue;
- elems = erealloc(elems, ++nelems*sizeof(*elems));
- elems[nelems-1] = e;
- }
- if(nelems < nprocs){
- nworkers = nelems;
- nparts = 1;
- }else{
- nworkers = nprocs;
- nparts = nelems/nprocs;
+ if(elems == nil){
+ nelems = 0;
+ for(i = 0; i < nelem(model->objtab); i++)
+ for(o = model->objtab[i]; o != nil; o = o->next)
+ for(e = o->child; e != nil; e = e->next){
+ idxtab = &e->indextab[OBJVGeometric];
+ /* discard non-triangles */
+ if(e->type != OBJEFace || idxtab->nindex != 3)
+ continue;
+ elems = erealloc(elems, ++nelems*sizeof(*elems));
+ elems[nelems-1] = e;
+ }
+ if(nelems < nprocs){
+ nworkers = nelems;
+ nparts = 1;
+ }else{
+ nworkers = nprocs;
+ nparts = nelems/nprocs;
+ }
}
time = nanosec();
--
⑨