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
|
|
|