Doxygen Source Code Documentation
mem.h File Reference
Go to the source code of this file.
Data Structures | |
struct | qhmemT |
Defines | |
#define | qhmem_ERRmem 4 |
#define | qhmem_ERRqhull 5 |
#define | qh_memalloc_(size, freelistp, object, type) |
#define | qh_memfree_(object, size, freelistp) |
Typedefs | |
typedef unsigned long | ptr_intT |
typedef qhmemT | qhmemT |
Functions | |
void * | qh_memalloc (int insize) |
void | qh_memfree (void *object, int size) |
void | qh_memfreeshort (int *curlong, int *totlong) |
void | qh_meminit (FILE *ferr) |
void | qh_meminitbuffers (int tracelevel, int alignment, int numsizes, int bufsize, int bufinit) |
void | qh_memsetup (void) |
void | qh_memsize (int size) |
void | qh_memstatistics (FILE *fp) |
Variables | |
qhmemT | qhmem |
Define Documentation
|
Value: {\ freelistp= qhmem.freelists + qhmem.indextable[size];\ if ((object= (type*)*freelistp)) {\ qhmem.cntquick++; \ *freelistp= *((void **)*freelistp);\ }else object= (type*)qh_memalloc (size);} Definition at line 131 of file mem.h. Referenced by qh_appendmergeset(), qh_newfacet(), qh_newridge(), qh_projectpoint(), qh_setfacetplane(), and qh_setnew(). |
|
Value: {\ if (object) { \ qhmem .freeshort++;\ freelistp= qhmem.freelists + qhmem.indextable[size];\ *((void **)object)= *freelistp;\ *freelistp= object;}} Definition at line 154 of file mem.h. Referenced by qh_all_merges(), qh_delfacet(), qh_delridge(), qh_makenew_nonsimplicial(), qh_mergecycle_ridges(), and qh_setfree(). |
|
Definition at line 49 of file mem.h. Referenced by qh_memalloc(), qh_meminitbuffers(), and qh_memsetup(). |
|
Definition at line 50 of file mem.h. Referenced by qh_memalloc(), qh_meminitbuffers(), qh_memsize(), qh_setaddnth(), qh_setcheck(), qh_setdelnth(), qh_setdelnthsorted(), qh_setnew_delnthsorted(), qh_setreplace(), qh_setsize(), qh_settempfree(), qh_settemppop(), qh_settruncate(), and qh_setzero(). |
Typedef Documentation
|
Definition at line 62 of file mem.h. Referenced by qh_gethash(). |
|
|
Function Documentation
|
Definition at line 99 of file qhulldir/mem.c. References qhmemT::ALIGNmask, qhmemT::BUFinit, qhmemT::BUFsize, qhmemT::cntlong, qhmemT::cntquick, qhmemT::cntshort, qhmemT::curbuffer, qhmemT::curlong, qhmemT::ferr, qhmemT::freelists, qhmemT::freemem, qhmemT::freesize, qhmemT::indextable, qhmemT::IStracing, qhmemT::LASTsize, malloc, qhmemT::maxlong, object, qh_errexit(), qhmem_ERRmem, qhmem_ERRqhull, qhmemT::sizetable, qhmemT::totlong, and qhmemT::totshort. Referenced by qh_findbestsharp(), qh_getcenter(), qh_initqhull_buffers(), qh_newvertex(), qh_printafacet(), qh_projectinput(), qh_setduplicate(), qh_setnew(), and qh_voronoi_center().
00099 { 00100 void **freelistp, *newbuffer; 00101 int index, size; 00102 int outsize, bufsize; 00103 void *object; 00104 00105 if ((unsigned) insize <= (unsigned) qhmem.LASTsize) { 00106 index= qhmem.indextable[insize]; 00107 freelistp= qhmem.freelists+index; 00108 if ((object= *freelistp)) { 00109 qhmem.cntquick++; 00110 *freelistp= *((void **)*freelistp); /* replace freelist with next object */ 00111 return (object); 00112 }else { 00113 outsize= qhmem.sizetable[index]; 00114 qhmem.cntshort++; 00115 if (outsize > qhmem .freesize) { 00116 if (!qhmem.curbuffer) 00117 bufsize= qhmem.BUFinit; 00118 else 00119 bufsize= qhmem.BUFsize; 00120 qhmem.totshort += bufsize; 00121 if (!(newbuffer= malloc(bufsize))) { 00122 fprintf(qhmem.ferr, "qhull error (qh_memalloc): insufficient memory\n"); 00123 qh_errexit(qhmem_ERRmem, NULL, NULL); 00124 } 00125 *((void **)newbuffer)= qhmem.curbuffer; /* prepend newbuffer to curbuffer 00126 list */ 00127 qhmem.curbuffer= newbuffer; 00128 size= (sizeof(void **) + qhmem.ALIGNmask) & ~qhmem.ALIGNmask; 00129 qhmem.freemem= (void *)((char *)newbuffer+size); 00130 qhmem.freesize= bufsize - size; 00131 } 00132 object= qhmem.freemem; 00133 qhmem.freemem= (void *)((char *)qhmem.freemem + outsize); 00134 qhmem.freesize -= outsize; 00135 return object; 00136 } 00137 }else { /* long allocation */ 00138 if (!qhmem.indextable) { 00139 fprintf (qhmem.ferr, "qhull internal error (qh_memalloc): qhmem has not been initialized.\n"); 00140 qh_errexit(qhmem_ERRqhull, NULL, NULL); 00141 } 00142 outsize= insize; 00143 qhmem .cntlong++; 00144 qhmem .curlong++; 00145 qhmem .totlong += outsize; 00146 if (qhmem.maxlong < qhmem.totlong) 00147 qhmem.maxlong= qhmem.totlong; 00148 if (!(object= malloc(outsize))) { 00149 fprintf(qhmem.ferr, "qhull error (qh_memalloc): insufficient memory\n"); 00150 qh_errexit(qhmem_ERRmem, NULL, NULL); 00151 } 00152 if (qhmem.IStracing >= 5) 00153 fprintf (qhmem.ferr, "qh_memalloc long: %d bytes at %p\n", outsize, object); 00154 } 00155 return (object); 00156 } /* memalloc */ |
|
|
Definition at line 206 of file qhulldir/mem.c.
00206 { 00207 void *buffer, *nextbuffer; 00208 00209 *curlong= qhmem .cntlong - qhmem .freelong; 00210 *totlong= qhmem .totlong; 00211 for(buffer= qhmem.curbuffer; buffer; buffer= nextbuffer) { 00212 nextbuffer= *((void **) buffer); 00213 free(buffer); 00214 } 00215 qhmem.curbuffer= NULL; 00216 if (qhmem .LASTsize) { 00217 free (qhmem .indextable); 00218 free (qhmem .freelists); 00219 free (qhmem .sizetable); 00220 } 00221 memset((char *)&qhmem, 0, sizeof qhmem); /* every field is 0, FALSE, NULL */ 00222 } /* memfreeshort */ |
|
Definition at line 231 of file qhulldir/mem.c.
00231 { 00232 00233 memset((char *)&qhmem, 0, sizeof qhmem); /* every field is 0, FALSE, NULL */ 00234 qhmem.ferr= ferr; 00235 if (sizeof(void*) < sizeof(int)) { 00236 fprintf (ferr, "qhull internal error (qh_meminit): sizeof(void*) < sizeof(int). qset.c will not work\n"); 00237 exit (1); /* can not use qh_errexit() */ 00238 } 00239 } /* meminit */ |
|
Definition at line 252 of file qhulldir/mem.c. References qhmemT::ALIGNmask, qhmemT::BUFinit, qhmemT::BUFsize, calloc, qhmemT::ferr, qhmemT::freelists, qhmemT::IStracing, qhmemT::NUMsizes, qh_errexit(), qhmem_ERRmem, qhmem_ERRqhull, and qhmemT::sizetable. Referenced by qh_initqhull_mem().
00252 { 00253 00254 qhmem.IStracing= tracelevel; 00255 qhmem.NUMsizes= numsizes; 00256 qhmem.BUFsize= bufsize; 00257 qhmem.BUFinit= bufinit; 00258 qhmem.ALIGNmask= alignment-1; 00259 if (qhmem.ALIGNmask & ~qhmem.ALIGNmask) { 00260 fprintf (qhmem.ferr, "qhull internal error (qh_meminit): memory alignment %d is not a power of 2\n", alignment); 00261 qh_errexit (qhmem_ERRqhull, NULL, NULL); 00262 } 00263 qhmem.sizetable= (int *) calloc (numsizes, sizeof(int)); 00264 qhmem.freelists= (void **) calloc (numsizes, sizeof(void *)); 00265 if (!qhmem.sizetable || !qhmem.freelists) { 00266 fprintf(qhmem.ferr, "qhull error (qh_meminit): insufficient memory\n"); 00267 qh_errexit (qhmem_ERRmem, NULL, NULL); 00268 } 00269 if (qhmem.IStracing >= 1) 00270 fprintf (qhmem.ferr, "qh_meminitbuffers: memory initialized with alignment %d\n", alignment); 00271 } /* meminitbuffers */ |
|
Definition at line 279 of file qhulldir/mem.c. References qhmemT::BUFinit, qhmemT::BUFsize, qhmemT::ferr, i, qhmemT::indextable, qhmemT::LASTsize, malloc, qh_errexit(), qh_intcompare(), qhmem_ERRmem, qhmemT::sizetable, and qhmemT::TABLEsize. Referenced by qh_initqhull_mem().
00279 { 00280 int k,i; 00281 00282 qsort(qhmem.sizetable, qhmem.TABLEsize, sizeof(int), qh_intcompare); 00283 qhmem.LASTsize= qhmem.sizetable[qhmem.TABLEsize-1]; 00284 if (qhmem .LASTsize >= qhmem .BUFsize || qhmem.LASTsize >= qhmem .BUFinit) { 00285 fprintf (qhmem.ferr, "qhull error (qh_memsetup): largest mem size %d is >= buffer size %d or initial buffer size %d\n", 00286 qhmem .LASTsize, qhmem .BUFsize, qhmem .BUFinit); 00287 qh_errexit(qhmem_ERRmem, NULL, NULL); 00288 } 00289 if (!(qhmem.indextable= (int *)malloc((qhmem.LASTsize+1) * sizeof(int)))) { 00290 fprintf(qhmem.ferr, "qhull error (qh_memsetup): insufficient memory\n"); 00291 qh_errexit(qhmem_ERRmem, NULL, NULL); 00292 } 00293 for(k=qhmem.LASTsize+1; k--; ) 00294 qhmem.indextable[k]= k; 00295 i= 0; 00296 for(k= 0; k <= qhmem.LASTsize; k++) { 00297 if (qhmem.indextable[k] <= qhmem.sizetable[i]) 00298 qhmem.indextable[k]= i; 00299 else 00300 qhmem.indextable[k]= ++i; 00301 } 00302 } /* memsetup */ |
|
Definition at line 310 of file qhulldir/mem.c. References qhmemT::ALIGNmask, qhmemT::ferr, qhmemT::LASTsize, qhmemT::NUMsizes, qh_errexit(), qhmem_ERRqhull, qhmemT::sizetable, and qhmemT::TABLEsize. Referenced by qh_initqhull_mem().
00310 { 00311 int k; 00312 00313 if (qhmem .LASTsize) { 00314 fprintf (qhmem .ferr, "qhull error (qh_memsize): called after qhmem_setup\n"); 00315 qh_errexit (qhmem_ERRqhull, NULL, NULL); 00316 } 00317 size= (size + qhmem.ALIGNmask) & ~qhmem.ALIGNmask; 00318 for(k= qhmem.TABLEsize; k--; ) { 00319 if (qhmem.sizetable[k] == size) 00320 return; 00321 } 00322 if (qhmem.TABLEsize < qhmem.NUMsizes) 00323 qhmem.sizetable[qhmem.TABLEsize++]= size; 00324 else 00325 fprintf(qhmem.ferr, "qhull warning (memsize): free list table has room for only %d sizes\n", qhmem.NUMsizes); 00326 } /* memsize */ |
|
Definition at line 338 of file qhulldir/mem.c. References qhmemT::BUFinit, qhmemT::BUFsize, qhmemT::cntlarger, qhmemT::cntlong, qhmemT::cntshort, qhmemT::freelists, qhmemT::freelong, qhmemT::freeshort, qhmemT::freesize, i, qhmemT::maxlong, object, qhmemT::sizetable, qhmemT::TABLEsize, qhmemT::totlarger, qhmemT::totlong, and qhmemT::totshort. Referenced by qh_errexit(), qh_printallstatistics(), and qh_produce_output().
00338 { 00339 int i, count, totfree= 0; 00340 void *object; 00341 00342 for (i=0; i < qhmem.TABLEsize; i++) { 00343 count=0; 00344 for (object= qhmem .freelists[i]; object; object= *((void **)object)) 00345 count++; 00346 totfree += qhmem.sizetable[i] * count; 00347 } 00348 fprintf (fp, "\nmemory statistics:\n\ 00349 %7d quick allocations\n\ 00350 %7d short allocations\n\ 00351 %7d long allocations\n\ 00352 %7d short frees\n\ 00353 %7d long frees\n\ 00354 %7d bytes of short memory in use\n\ 00355 %7d bytes of short memory in freelists\n\ 00356 %7d bytes of long memory allocated (except for input)\n\ 00357 %7d bytes of long memory in use (in %d pieces)\n\ 00358 %7d bytes per memory buffer (initially %d bytes)\n", 00359 qhmem .cntquick, qhmem.cntshort, qhmem.cntlong, 00360 qhmem .freeshort, qhmem.freelong, 00361 qhmem .totshort - qhmem .freesize - totfree, 00362 totfree, 00363 qhmem .maxlong, qhmem .totlong, qhmem .cntlong - qhmem .freelong, 00364 qhmem .BUFsize, qhmem .BUFinit); 00365 if (qhmem.cntlarger) { 00366 fprintf (fp, "%7d calls to qh_setlarger\n%7.2g average copy size\n", 00367 qhmem.cntlarger, ((float) qhmem.totlarger)/ qhmem.cntlarger); 00368 fprintf (fp, " freelists (bytes->count):"); 00369 } 00370 for (i=0; i < qhmem.TABLEsize; i++) { 00371 count=0; 00372 for (object= qhmem .freelists[i]; object; object= *((void **)object)) 00373 count++; 00374 fprintf (fp, " %d->%d", qhmem.sizetable[i], count); 00375 } 00376 fprintf (fp, "\n\n"); 00377 } /* memstatistics */ |
Variable Documentation
|
|