Doxygen Source Code Documentation
niml_malloc.c File Reference
#include "niml_private.h"Go to the source code of this file.
Data Structures | |
| struct | NI_mallitem |
Defines | |
| #define | MAGIC ((char) 0xd7) |
| #define | NEXTRA (2*sizeof(int)) |
| #define | UINT unsigned int |
| #define | SLOTS 1031 |
| #define | INLINE |
| #define | shift_tracker(fff) ptr_tracker( ((char *)(fff)) - NEXTRA ) |
| #define | JBASE 32768 |
| #define | QS_STACK 1024 |
| #define | QS_SWAPF(x, y) ( temp=(x),(x)=(y),(y)= temp) |
| #define | QS_SWAPI(i, j) (itemp=(i),(i)=(j),(j)=itemp) |
| #define | QS_CUTOFF 10 |
Functions | |
| int | NI_malloc_replace (void *(*um)(size_t), void *(*ur)(void *, size_t), void(*uf)(void *)) |
| NI_mallitem * | ptr_tracker (void *) |
| NI_mallitem * | find_empty_slot (int) |
| void | add_tracker (void *, size_t, char *, int) |
| void * | malloc_track (size_t, char *, int) |
| void | probe_track (NI_mallitem *, char *, int) |
| void * | realloc_track (NI_mallitem *, size_t, char *, int) |
| void * | calloc_track (size_t, size_t, char *, int) |
| void | free_track (NI_mallitem *) |
| void | qsort_intint (int, int *, int *) |
| INLINE UINT | mallkey (char *fred) |
| char * | NI_malloc_status (void) |
| void | NI_malloc_dump (void) |
| void | NI_malloc_enable_tracking (void) |
| int | NI_malloc_tracking_enabled (void) |
| void * | hidden_NI_malloc (size_t n, char *fnam, int lnum) |
| void * | hidden_NI_realloc (void *fred, size_t n, char *fnam, int lnum) |
| void | hidden_NI_free (void *fred, char *fnam, int lnum) |
| void | isort_intint (int n, int *ar, int *iar) |
| void | qsrec_intint (int n, int *ar, int *iar, int cutoff) |
| void | NI_free (void *p) |
Variables | |
| void *(* | user_malloc )(size_t)=NULL |
| void *(* | user_realloc )(void *, size_t)=NULL |
| void(* | user_free )(void *)=NULL |
| int | use_userfunc = 0 |
| int | ni_mall_used = 0 |
| NI_mallitem ** | htab = NULL |
| int * | nhtab = NULL |
| UINT | serial = 0 |
| int | use_tracking = 0 |
Define Documentation
|
|
Definition at line 147 of file niml_malloc.c. Referenced by mallkey(). |
|
|
|
|
|
18 Nov 2002: keep track of mallocs, as in mcw_malloc.[ch] ****** Definition at line 111 of file niml_malloc.c. Referenced by malloc_track(), probe_track(), and realloc_track(). |
|
|
Definition at line 112 of file niml_malloc.c. Referenced by malloc_track(), probe_track(), and realloc_track(). |
|
|
Sort an array partially recursively, and partially insertion. Definition at line 760 of file niml_malloc.c. Referenced by qsort_intint(). |
|
|
Recursive part of quicksort (stack implementation). Definition at line 673 of file niml_malloc.c. Referenced by qsrec_intint(). |
|
|
Definition at line 674 of file niml_malloc.c. |
|
|
Definition at line 675 of file niml_malloc.c. |
|
|
Definition at line 205 of file niml_malloc.c. |
|
|
set hash table size (to a prime number, please) * Definition at line 131 of file niml_malloc.c. Referenced by add_tracker(), NI_malloc_dump(), NI_malloc_enable_tracking(), NI_malloc_status(), ptr_tracker(), and realloc_track(). |
|
|
Definition at line 115 of file niml_malloc.c. Referenced by mallkey(), and NI_malloc_status(). |
Function Documentation
|
||||||||||||||||||||
|
Add an entry to the hash table, given the address, the user's size, and the filename and line number. ------------------------------------------------------------------ Definition at line 240 of file niml_malloc.c. References find_empty_slot(), mallkey(), NI_mallitem::pfn, NI_mallitem::pln, NI_mallitem::pmt, NI_mallitem::pss, NI_mallitem::psz, serial, and SLOTS. Referenced by malloc_track(), and realloc_track().
00241 {
00242 int jj ;
00243 NI_mallitem *ip ;
00244
00245 if( fred == NULL ) return ; /* bad news */
00246
00247 jj = mallkey((char *)fred) % SLOTS ; /* which hash list to use */
00248 ip = find_empty_slot(jj) ; /* get an empty slot in this list */
00249
00250 /* now put the data into the hash table */
00251
00252 ip->pmt = fred ;
00253 ip->psz = n ;
00254 ip->pfn = fn ;
00255 ip->pln = ln ;
00256 ip->pss = ++serial ;
00257
00258 return ;
00259 }
|
|
||||||||||||||||||||
|
Tracking replacement for calloc(). ------------------------------------------------------------------- Definition at line 366 of file niml_malloc.c. References malloc_track(). Referenced by hidden_NI_malloc(), mcw_calloc(), and mcw_XtCalloc().
00367 {
00368 void *fred ;
00369 size_t nn = n*m ;
00370
00371 fred = malloc_track(nn,fn,ln) ; if( fred == NULL ) return NULL ;
00372 memset( fred , 0 , nn ) ;
00373 return fred ;
00374 }
|
|
|
Find an empty entry in the hash table list [jj] and return a pointer to it. Will create the entry, if need be. ------------------------------------------------------------------- Definition at line 212 of file niml_malloc.c. References malloc, nhtab, NI_mallitem::pmt, and realloc. Referenced by add_tracker().
00213 {
00214 int kk ;
00215
00216 if( htab[jj] == NULL ){ /* must make new list */
00217 htab[jj] = (NI_mallitem *) malloc(sizeof(NI_mallitem)) ; /* of length 1 at [jj] */
00218 nhtab[jj] = 1 ;
00219 kk = 0 ;
00220 htab[jj][0].pmt = NULL ; /* mark as empty */
00221 } else {
00222 for( kk=nhtab[jj]-1 ; kk >= 0 ; kk-- ) /* scan (backwards) for NULL entry */
00223 if( htab[jj][kk].pmt == NULL ) break ; /* found it? */
00224
00225 if( kk < 0 ){ /* must make list longer */
00226 kk = nhtab[jj] ; nhtab[jj]++ ;
00227 htab[jj] = (NI_mallitem *) realloc( htab[jj], sizeof(NI_mallitem)*nhtab[jj] ) ;
00228 htab[jj][kk].pmt = NULL ; /* mark as empty */
00229 }
00230 }
00231
00232 return (htab[jj]+kk) ;
00233 }
|
|
|
Tracking replacement for free(). ------------------------------------------------------------------- Definition at line 380 of file niml_malloc.c. References free, ni_mall_used, NI_mallitem::pmt, and probe_track(). Referenced by hidden_NI_free(), mcw_free(), and mcw_XtFree().
00381 {
00382 char *cfred ;
00383
00384 if( ip == NULL ) return ;
00385 cfred = (char *) ip->pmt ;
00386 if( cfred == NULL ) return ;
00387
00388 probe_track(ip,NULL,0) ; /* check for integrity before freeing */
00389
00390 ni_mall_used = 1 ;
00391 free(cfred) ; ip->pmt = NULL ; return ;
00392 }
|
|
||||||||||||||||
|
Definition at line 623 of file niml_malloc.c. References free, free_track(), NI_dpr(), shift_tracker, use_tracking, and user_free. Referenced by NI_free().
00624 {
00625 NI_mallitem *ip ;
00626
00627 if( fred == NULL ) return ;
00628
00629 if( use_userfunc ) user_free(fred) ;
00630 else if( use_tracking && (ip=shift_tracker(fred)) != NULL ) free_track( ip ) ;
00631 else free( fred ) ;
00632
00633 #ifdef NIML_DEBUG
00634 NI_dpr("hidden_NI_free: called from %s#%d\n",fnam,lnum) ;
00635 #endif
00636
00637 }
|
|
||||||||||||||||
|
Allocate memory (actually uses calloc); calls exit() if it fails. ---------------------------------------------------------------------------- Definition at line 568 of file niml_malloc.c. References calloc, calloc_track(), NI_dpr(), NI_sleep(), p, and user_malloc. Referenced by hidden_NI_realloc().
00569 {
00570 void *p ;
00571
00572 if( use_userfunc ){ p = user_malloc(n); if(p)memset(p,0,n); }
00573 else if( use_tracking ) p = calloc_track(1,n,fnam,lnum) ;
00574 else p = calloc(1,n) ;
00575
00576 if( p == NULL ){
00577 fprintf(stderr,"** ERROR: NI_malloc() fails. Aauugghh!\n") ;
00578 NI_sleep(333); exit(1);
00579 }
00580
00581 #ifdef NIML_DEBUG
00582 NI_dpr("hidden_NI_malloc: called from %s#%d\n",fnam,lnum) ;
00583 #endif
00584
00585 return p ;
00586 }
|
|
||||||||||||||||||||
|
Reallocate memory; calls exit() if it fails. ---------------------------------------------------------------------------- Definition at line 592 of file niml_malloc.c. References hidden_NI_malloc(), NI_dpr(), NI_sleep(), q, realloc, realloc_track(), shift_tracker, use_tracking, and user_realloc.
00593 {
00594 NI_mallitem *ip ;
00595 void *q ;
00596
00597 if( fred == NULL )
00598 return hidden_NI_malloc( n , fnam , lnum ) ;
00599
00600 if( use_userfunc )
00601 q = user_realloc( fred , n ) ;
00602 else if( use_tracking && (ip=shift_tracker(fred)) != NULL )
00603 q = realloc_track( ip , n , fnam,lnum ) ;
00604 else
00605 q = realloc( fred , n ) ;
00606
00607 if( q == NULL && n > 0 ){
00608 fprintf(stderr,"** ERROR: NI_realloc() fails. Ooooogg!\n");
00609 NI_sleep(333); exit(1);
00610 }
00611
00612 #ifdef NIML_DEBUG
00613 NI_dpr("hidden_NI_realloc: called from %s#%d\n",fnam,lnum) ;
00614 #endif
00615
00616 return q ;
00617 }
|
|
||||||||||||||||
|
Insertion_sort : sort an array of int + int. Definition at line 642 of file niml_malloc.c. Referenced by qsort_intint().
00643 {
00644 register int j , p ; /* array indices */
00645 register int temp ; /* a[j] holding place */
00646 register int itemp ;
00647 register int * a = ar ;
00648 register int * ia = iar ;
00649
00650 if( n < 2 ) return ;
00651
00652 for( j=1 ; j < n ; j++ ){
00653
00654 if( a[j] < a[j-1] ){ /* out of order */
00655 p = j ;
00656 temp = a[j] ; itemp = ia[j] ;
00657
00658 do{
00659 a[p] = a[p-1] ; /* at this point, a[p-1] > temp, so move it up */
00660 ia[p] = ia[p-1] ;
00661 p-- ;
00662 } while( p > 0 && temp < a[p-1] ) ;
00663
00664 a[p] = temp ; /* finally, put temp in its place */
00665 ia[p] = itemp ;
00666 }
00667 }
00668 }
|
|
|
Compute a unique non-negative integer key from an address ----------------------------------------------------------------- Definition at line 171 of file niml_malloc.c. References INLINE, q, and UINT. Referenced by add_tracker(), ptr_tracker(), and realloc_track().
|
|
||||||||||||||||
|
The tracking replacement for malloc(). ------------------------------------------------------------------- Definition at line 265 of file niml_malloc.c. References add_tracker(), MAGIC, malloc, NEXTRA, and ni_mall_used. Referenced by calloc_track(), mcw_malloc(), and mcw_XtMalloc().
00266 {
00267 char *fred ;
00268 size_t nn = n + 2*NEXTRA ;
00269 int ii ;
00270
00271 fred = (char *)malloc(nn) ;
00272 if( fred == NULL ) return NULL ; /* real bad news */
00273
00274 /* mark overrun buffers */
00275
00276 memset( fred , MAGIC , NEXTRA ) ;
00277 memset( fred+(n+NEXTRA), MAGIC , NEXTRA ) ;
00278
00279 ni_mall_used = 1 ;
00280 add_tracker(fred,n,fn,ln) ; /* put in hash table */
00281 return (void *)(fred+NEXTRA) ;
00282 }
|
|
|
17 Dec 2003: In case a true NI_free() call gets thru somehow. Definition at line 777 of file niml_malloc.c. References hidden_NI_free(), and p.
00778 {
00779 hidden_NI_free( p , (char *)"Nada" , 0 ) ;
00780 }
|
|
|
Write a file with lots of info about the current status. ------------------------------------------------------------------- Definition at line 425 of file niml_malloc.c. References free, malloc, nhtab, NI_is_file, NI_malloc_status(), NI_mallitem::pmt, NI_mallitem::pss, qsort_intint(), SLOTS, and use_tracking.
00426 {
00427 int ii,jj,kk ;
00428 char fname[32] , *str ;
00429 FILE *fp = NULL ;
00430 int nptr=0 ;
00431 int *ss , *jk ;
00432
00433 if( ! use_tracking ) return ;
00434
00435 /* find and open an output file */
00436
00437 for( ii=1 ; ii < 1000 ; ii++ ){
00438 sprintf(fname,"NI_malldump.%03d",ii) ;
00439 if( NI_is_file(fname) ) continue ;
00440 fp = fopen( fname , "w" ) ;
00441 if( fp == NULL ){
00442 fprintf(stderr,"** Unable to open file %s for malloc table dump!\n",
00443 fname ) ;
00444 return ;
00445 }
00446 break ;
00447 }
00448
00449 if( fp == NULL ){
00450 fprintf(stderr,"** Attempt to exceed 999 malloc table dump files!\n") ;
00451 return ;
00452 }
00453
00454 /* count number of entries in the hash table */
00455
00456 for( jj=0 ; jj < SLOTS ; jj++ ){
00457 for( kk=0 ; kk < nhtab[jj] ; kk++ ){
00458 if( htab[jj][kk].pmt != NULL ) nptr++ ;
00459 }
00460 }
00461
00462 if( nptr < 1 ){
00463 fprintf(fp ,"--- Nothing is malloc()-ed !? ---\n") ;
00464 fprintf(stderr,"--- Nothing is malloc()-ed !? ---\n") ;
00465 fclose(fp) ;
00466 }
00467
00468 /* setup to sort by serial number */
00469
00470 ss = (int *) malloc(sizeof(int)*nptr) ; /* serial number */
00471 jk = (int *) malloc(sizeof(int)*nptr) ; /* holds combination of jj and kk */
00472
00473 #define JBASE 32768 /* JBASE * SLOTS must be less than max int */
00474
00475 /* scan table for non-NULL entries */
00476
00477 for( ii=jj=0 ; jj < SLOTS ; jj++ ){
00478 for( kk=0 ; kk < nhtab[jj] ; kk++ ){
00479 if( htab[jj][kk].pmt != NULL ){
00480 ss[ii] = htab[jj][kk].pss ; /* save serial number */
00481 jk[ii] = JBASE*jj + kk ; /* save jj and kk */
00482 ii++ ;
00483 }
00484 }
00485 }
00486
00487 qsort_intint( nptr , ss , jk ) ; /* sort by ss, carrying jk along */
00488
00489 /* now print table in serial number order */
00490
00491 fprintf(fp, "MCW Malloc Table Dump:\n"
00492 "serial# size source file line# address hash(j,k)\n"
00493 "------- ---------- -------------------- ----- ---------- ---------\n") ;
00494
00495 for( ii=0 ; ii < nptr ; ii++ ){
00496 jj = jk[ii] / JBASE ; /* retrieve jj and kk */
00497 kk = jk[ii] % JBASE ;
00498 if( htab[jj][kk].pmt != NULL ){
00499 fprintf(fp,"%7u %10u %-20.30s %5d %10p %5d %3d",
00500 htab[jj][kk].pss , (unsigned int)htab[jj][kk].psz ,
00501 htab[jj][kk].pfn , htab[jj][kk].pln , htab[jj][kk].pmt ,
00502 jj,kk ) ;
00503 fprintf(fp,"\n") ;
00504 }
00505 else
00506 fprintf(fp,"*** Error at ii=%d jj=%d kk=%d\n",ii,jj,kk) ;
00507 }
00508
00509 free(ss) ; free(jk) ;
00510
00511 /* and print out the summary line (to the file and screen) */
00512
00513 str = NI_malloc_status() ;
00514 fprintf(fp,"----- Summary: %s\n",str) ;
00515 fclose(fp) ;
00516
00517 fprintf(stderr,"** Malloc table dumped to file %s\n",fname) ;
00518 fprintf(stderr,"** Summary: %s\n",str) ;
00519
00520 return ;
00521 }
|
|
|
Turn on use of the tracking routines. ------------------------------------------------------------------ Definition at line 527 of file niml_malloc.c. References getenv(), malloc, nhtab, ni_mall_used, SLOTS, and use_tracking. Referenced by NI_stream_open().
00528 {
00529 char *str ;
00530
00531 if( use_userfunc ) return ; /* 25 Mar 2003 */
00532 ni_mall_used = 1 ;
00533
00534 if( use_tracking ) return ; /* 05 Nov 2001 */
00535
00536 str = getenv("AFNI_NO_MCW_MALLOC") ;
00537 if( str == NULL )
00538 str = getenv("NIML_MALLOC_DISABLE") ;
00539
00540 use_tracking = 1 ;
00541 if( str!=NULL && ( *str=='y' || *str=='Y') ) use_tracking = 0 ;
00542
00543 if( use_tracking && htab == NULL ){ /* initialize hash table */
00544 int jj ;
00545 htab = (NI_mallitem **) malloc( SLOTS * sizeof(NI_mallitem *) ) ;
00546 nhtab = (int *) malloc( SLOTS * sizeof(int) ) ;
00547 for( jj=0 ; jj < SLOTS ; jj++ ){
00548 htab[jj] = NULL ; nhtab[jj] = 0 ;
00549 }
00550 }
00551
00552 return ;
00553 }
|
|
||||||||||||||||
|
Allow user to replace malloc(), realloc(), and free() functions used in NI_malloc(), NI_realloc(), and NI_free().
Definition at line 31 of file niml_malloc.c. References ni_mall_used, use_userfunc, user_free, user_malloc, and user_realloc.
00033 {
00034
00035 if( ni_mall_used ||
00036 use_userfunc ||
00037 um == NULL ||
00038 ur == NULL ||
00039 uf == NULL ) return 0 ;
00040
00041 user_malloc = um ;
00042 user_realloc = ur ;
00043 user_free = uf ;
00044 use_userfunc = 1 ;
00045 return 1 ;
00046 }
|
|
|
Definition at line 401 of file niml_malloc.c. References nhtab, NI_mallitem::pmt, probe_track(), NI_mallitem::psz, SLOTS, UINT, and use_tracking. Referenced by NI_dpr(), and NI_malloc_dump().
00402 {
00403 static char buf[128] = "\0" ;
00404 int jj,kk , nptr=0 ; size_t nbyt=0 ;
00405
00406 if( ! use_tracking ) return "not enabled" ;
00407
00408 for( jj=0 ; jj < SLOTS ; jj++ ){
00409 for( kk=0 ; kk < nhtab[jj] ; kk++ ){
00410 if( htab[jj][kk].pmt != NULL ){
00411 probe_track( htab[jj]+kk , NULL,0 ) ; /* check for integrity */
00412 nptr++ ; nbyt += htab[jj][kk].psz ;
00413 }
00414 }
00415 }
00416
00417 sprintf(buf,"chunks=%d bytes=%u",nptr,(UINT)nbyt) ;
00418 return buf ;
00419 }
|
|
|
Lets the user check if the tracking routines are in use. ----------------------------------------------------------------- Definition at line 559 of file niml_malloc.c. References use_tracking.
00560 {
00561 return (use_tracking != 0) ;
00562 }
|
|
||||||||||||||||
|
Check an entry in the hash table for local overrun integrity. ------------------------------------------------------------------- Definition at line 288 of file niml_malloc.c. References MAGIC, NEXTRA, NI_mallitem::pfn, NI_mallitem::pln, NI_mallitem::pmt, NI_mallitem::pss, and NI_mallitem::psz. Referenced by free_track(), mcw_malloc_status(), NI_malloc_status(), and realloc_track().
00289 {
00290 int ii ;
00291 size_t n ;
00292 char *fred ;
00293
00294 if( ip == NULL ) return ; /* error */
00295 fred = (char *) ip->pmt ; if( fred == NULL ) return ;
00296 n = ip->psz ;
00297
00298 for( ii=0 ; ii < NEXTRA ; ii++ )
00299 if( fred[ii] != MAGIC ){
00300 fprintf(stderr,"*** NI_malloc pre-corruption! "
00301 "serial=%u size=%u source=%s line#=%d\n",
00302 ip->pss,(unsigned int)ip->psz,ip->pfn,ip->pln ) ;
00303 if( fn != NULL ) fprintf(stderr," Caller=%s line#=%d\n",fn,ln) ;
00304 break ;
00305 }
00306
00307 for( ii=0 ; ii < NEXTRA ; ii++ )
00308 if( fred[n+NEXTRA+ii] != MAGIC ){
00309 fprintf(stderr,"*** NI_malloc post-corruption! "
00310 "serial=%u size=%u source=%s line#=%d\n",
00311 ip->pss,(unsigned int)ip->psz,ip->pfn,ip->pln ) ;
00312 if( fn != NULL ) fprintf(stderr," Caller=%s line#=%d\n",fn,ln) ;
00313 break ;
00314 }
00315
00316 return ;
00317 }
|
|
|
Find an address in the hash table; returns a pointer to the NI_mallitem that owns it (or NULL) ------------------------------------------------------------------ Definition at line 186 of file niml_malloc.c. References mallkey(), nhtab, NI_mallitem::pmt, and SLOTS.
00187 {
00188 int jj,kk ;
00189
00190 if( fred == NULL ) return NULL ;
00191
00192 jj = mallkey((char *)fred) % SLOTS ; /* hash table location */
00193
00194 if( htab[jj] == NULL ) return NULL ; /* nothing there */
00195
00196 for( kk=0 ; kk < nhtab[jj] ; kk++ ) /* scan for match */
00197 if( htab[jj][kk].pmt == fred ) return (htab[jj]+kk) ;
00198
00199 return NULL ; /* no match found */
00200 }
|
|
||||||||||||||||
|
Definition at line 763 of file niml_malloc.c. References a, isort_intint(), QS_CUTOFF, and qsrec_intint(). Referenced by mcw_malloc_dump(), mri_watershedize(), NI_malloc_dump(), rgb_to_XImage_clever(), and SUMA_make_vnlist().
00764 {
00765 qsrec_intint( n , a , ia , QS_CUTOFF ) ;
00766 isort_intint( n , a , ia ) ;
00767 return ;
00768 }
|
|
||||||||||||||||||||
|
Definition at line 677 of file niml_malloc.c. References a, i, left, QS_STACK, QS_SWAPF, QS_SWAPI, and right. Referenced by qsort_intint().
00678 {
00679 register int i , j ; /* scanning indices */
00680 register int temp , pivot ; /* holding places */
00681 register int itemp , ipivot ;
00682 register int * a = ar ;
00683 register int * ia = iar ;
00684
00685 int left , right , mst , stack[QS_STACK] , nnew ;
00686
00687 /* return if too short (insertion sort will clean up) */
00688
00689 if( cutoff < 3 ) cutoff = 3 ;
00690 if( n < cutoff ) return ;
00691
00692 /* initialize stack to start with whole array */
00693
00694 stack[0] = 0 ;
00695 stack[1] = n-1 ;
00696 mst = 2 ;
00697
00698 /* loop while the stack is nonempty */
00699
00700 while( mst > 0 ){
00701 right = stack[--mst] ; /* work on subarray from left -> right */
00702 left = stack[--mst] ;
00703
00704 i = ( left + right ) / 2 ; /* middle of subarray */
00705
00706 /* sort the left, middle, and right a[]'s */
00707
00708 if( a[left] > a[i] ){ QS_SWAPF(a[left] ,a[i] ); QS_SWAPI(ia[left] ,ia[i] ); }
00709 if( a[left] > a[right] ){ QS_SWAPF(a[left] ,a[right]); QS_SWAPI(ia[left] ,ia[right]); }
00710 if( a[i] > a[right] ){ QS_SWAPF(a[right],a[i] ); QS_SWAPI(ia[right],ia[i] ); }
00711
00712 pivot = a[i] ; /* a[i] is the median-of-3 pivot! */
00713 a[i] = a[right] ;
00714 ipivot = ia[i] ;
00715 ia[i] = ia[right] ;
00716
00717 i = left ; /* initialize scanning */
00718 j = right ;
00719
00720 /*----- partition: move elements bigger than pivot up and elements
00721 smaller than pivot down, scanning in from ends -----*/
00722
00723 do{
00724 for( ; a[++i] < pivot ; ) ; /* scan i up, until a[i] >= pivot */
00725 for( ; a[--j] > pivot ; ) ; /* scan j down, until a[j] <= pivot */
00726
00727 if( j <= i ) break ; /* if j meets i, quit */
00728
00729 QS_SWAPF( a[i] , a[j] ) ; QS_SWAPI( ia[i] , ia[j] ) ;
00730 } while( 1 ) ;
00731
00732 /*----- at this point, the array is partitioned -----*/
00733
00734 a[right] = a[i] ; /*restore the pivot*/
00735 a[i] = pivot ;
00736 ia[right] = ia[i] ;
00737 ia[i] = ipivot ;
00738
00739 /*----- push subarrays [left..i-1] and [i+1..right] onto stack, if big -----*/
00740
00741 nnew = 0 ;
00742 if( (i-left) > cutoff ){ stack[mst++] = left ; stack[mst++] = i-1 ; nnew++ ; }
00743 if( (right-i) > cutoff ){ stack[mst++] = i+1 ; stack[mst++] = right ; nnew++ ; }
00744
00745 /* if just added two subarrays to stack, make sure shorter one comes first */
00746
00747 if( nnew == 2 && stack[mst-3] - stack[mst-4] > stack[mst-1] - stack[mst-2] ){
00748 QS_SWAPI( stack[mst-4] , stack[mst-2] ) ;
00749 QS_SWAPI( stack[mst-3] , stack[mst-1] ) ;
00750 }
00751
00752 } /* end of while stack is non-empty */
00753
00754 }
|
|
||||||||||||||||||||
|
The tracking replacement for realloc(). --------------------------------------------------------------------- Definition at line 323 of file niml_malloc.c. References add_tracker(), MAGIC, mallkey(), NEXTRA, ni_mall_used, NI_mallitem::pfn, NI_mallitem::pln, NI_mallitem::pmt, probe_track(), NI_mallitem::pss, NI_mallitem::psz, realloc, serial, and SLOTS. Referenced by hidden_NI_realloc(), mcw_realloc(), and mcw_XtRealloc().
00324 {
00325 char *nfred , *cfred ;
00326 size_t nn = n + 2*NEXTRA ;
00327 int ii , cjj,njj , kk ;
00328
00329 if( ip == NULL ) return NULL ; /* should not happen */
00330
00331 probe_track(ip,fn,ln) ; /* check for integrity before reallocation */
00332 cfred = (char *)ip->pmt ; /* old address */
00333
00334 ni_mall_used = 1 ;
00335 nfred = (char *)realloc( (void *)cfred , nn ) ;
00336 if( nfred == NULL ) return NULL ; /* this is bad - real bad */
00337
00338 memset( nfred , MAGIC , NEXTRA ) ;
00339 memset( nfred+(n+NEXTRA), MAGIC , NEXTRA ) ;
00340
00341 cjj = mallkey(cfred) % SLOTS ; /* hash table list for old */
00342 njj = mallkey(nfred) % SLOTS ; /* and for new address */
00343
00344 if( cjj == njj ){ /* can just update old hashtable entry */
00345
00346 ip->pmt = nfred ;
00347 ip->psz = n ;
00348 ip->pfn = fn ;
00349 ip->pln = ln ;
00350 ip->pss = ++serial ;
00351
00352 } else { /* must move into a different list */
00353
00354 add_tracker( nfred , n , fn , ln ) ;
00355
00356 ip->pmt = NULL ; /* mark old entry as free */
00357 }
00358
00359 return (void *)(nfred+NEXTRA) ;
00360 }
|
Variable Documentation
|
|
define SLOTS 32003 * Definition at line 139 of file niml_malloc.c. |
|
|
Definition at line 140 of file niml_malloc.c. Referenced by find_empty_slot(), NI_malloc_dump(), NI_malloc_enable_tracking(), NI_malloc_status(), and ptr_tracker(). |
|
|
Definition at line 14 of file niml_malloc.c. Referenced by free_track(), malloc_track(), NI_malloc_enable_tracking(), NI_malloc_replace(), and realloc_track(). |
|
|
Definition at line 141 of file niml_malloc.c. Referenced by add_tracker(), and realloc_track(). |
|
|
Return a status string about the situation. This is stored in a static buffer, so don't free it. ------------------------------------------------------------------- Definition at line 399 of file niml_malloc.c. Referenced by hidden_NI_free(), hidden_NI_realloc(), NI_malloc_dump(), NI_malloc_enable_tracking(), NI_malloc_status(), and NI_malloc_tracking_enabled(). |
|
|
Definition at line 13 of file niml_malloc.c. Referenced by NI_malloc_replace(). |
|
|
Definition at line 12 of file niml_malloc.c. Referenced by hidden_NI_free(), and NI_malloc_replace(). |
|
|
25 Mar 2003: allow user to replace malloc, realloc, free functions * Definition at line 10 of file niml_malloc.c. Referenced by hidden_NI_malloc(), and NI_malloc_replace(). |
|
|
Definition at line 11 of file niml_malloc.c. Referenced by hidden_NI_realloc(), and NI_malloc_replace(). |