X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Flib%2F16_hc.c;h=6cc16f5fe511b1ec4760509fca6ae8b1482257c7;hb=4707910e09b11ac19bdaea78875db29f1343d27f;hp=d2ecddacdfc28c9cb19b70fae21355ab128d5645;hpb=53acdb7d0d8aebdc481eb91bd9369f3b49f8218d;p=proj16%2F16.git diff --git a/src/lib/16_hc.c b/src/lib/16_hc.c index d2ecddac..6cc16f5f 100755 --- a/src/lib/16_hc.c +++ b/src/lib/16_hc.c @@ -24,13 +24,42 @@ */ #include "src/lib/16_hc.h" +#include +//from ftp://213.85.246.177/pub/FreeBSD/ports/archivers/arj/work/arj-3.10.22/environ.c +#if 0 +//#ifdef __WATCOMC__ +long HC_Newfarcoreleft() +{ + void __huge *hp; static long rc=736L; long s_rc; + + s_rc=rc; rc+=2L; + do + hp=halloc(rc-=2L, 1024); + while(hp==NULL&&rc>0L); + if(hp!=NULL) + hfree(hp); + if(rc> 1); -#ifdef __BORLANDC__ - while (s0 && (p = malloc(s0)) == NULL) -#endif -#ifdef __WATCOMC__ while (s0 && (p = _nmalloc(s0)) == NULL) -#endif s0 >>= 1; if (p) -#ifdef __BORLANDC__ - free(p); -#endif -#ifdef __WATCOMC__ _nfree(p); -#endif s1 = s0 >> 1; while (s1) { -#ifdef __BORLANDC__ - if ((p = malloc(s0 + s1)) != NULL) -#endif -#ifdef __WATCOMC__ if ((p = _nmalloc(s0 + s1)) != NULL) -#endif { s0 += s1; -#ifdef __BORLANDC__ - free(p); -#endif -#ifdef __WATCOMC__ _nfree(p); -#endif } s1 >>= 1; } -#ifdef __BORLANDC__ - while (s0 && (p = malloc(s0)) == NULL) -#endif -#ifdef __WATCOMC__ while (s0 && (p = _nmalloc(s0)) == NULL) -#endif s0 ^= s0 & -s0; *Size = s0; return p; } -size_t _coreleft(void) +//from: https://stackoverflow.com/questions/14386856/c-check-available-ram +size_t HC_coreleft(void) { size_t total = 0; void __near* pFirst = NULL; @@ -97,16 +102,11 @@ size_t _coreleft(void) for(;;) { size_t largest; - void __near* p = (void __near *)LargestFreeBlock(&largest); + void __near* p = (void __near *)HC_LargestFreeBlock(&largest); if (largest < sizeof(void __near*)) { if (p != NULL) -#ifdef __BORLANDC__ - free(p); -#endif -#ifdef __WATCOMC__ _nfree(p); -#endif break; } *(void __near* __near*)p = NULL; @@ -122,23 +122,19 @@ size_t _coreleft(void) while (pFirst != NULL) { void __near* p = *(void __near* __near*)pFirst; -#ifdef __BORLANDC__ - free(pFirst); -#endif -#ifdef __WATCOMC__ _nfree(pFirst); -#endif pFirst = p; } return total; } -void far* LargestFarFreeBlock(size_t* Size) +//far version of above +void far* HC_LargestFarFreeBlock(unsigned long* Size) { - size_t s0, s1; + unsigned long s0, s1; void far* p; - s0 = ~(size_t)0 ^ (~(size_t)0 >> 1); + s0 = ~(unsigned long)0 ^ (~(unsigned long)0 >> 1); while (s0 && (p = _fmalloc(s0)) == NULL) s0 >>= 1; @@ -162,15 +158,16 @@ void far* LargestFarFreeBlock(size_t* Size) return p; } -size_t _farcoreleft(void) +//far version of above +unsigned long HC_farcoreleft(void) { - size_t total = 0; + unsigned long total = 0UL; void far* pFirst = NULL; void far* pLast = NULL; for(;;) { - size_t largest; - void far* p = LargestFarFreeBlock(&largest); + unsigned long largest; + void far* p = HC_LargestFarFreeBlock(&largest); if (largest < sizeof(void far*)) { if (p != NULL) @@ -196,8 +193,8 @@ size_t _farcoreleft(void) return total; } -#ifdef __WATCOMC__ -void huge* LargestHugeFreeBlock(size_t* Size) +//==#ifdef __WATCOMC__ +/*void huge* LargestHugeFreeBlock(size_t* Size) { size_t s0, s1; void huge* p; @@ -260,7 +257,7 @@ size_t _hugecoreleft(void) return total; } -/*void __based(__self)* LargestBasedFreeBlock(size_t* Size) +void __based(__self)* LargestBasedFreeBlock(size_t* Size) { __segment segu; size_t s0, s1; @@ -297,11 +294,11 @@ size_t _basedcoreleft(void) void __based(segu)* pFirst = NULL; void __based(segu)* pLast = NULL; // allocate based heap - segu = _bheapseg( 1024 ); + segu = _bHC_heapseg( 1024 ); if( segu == _NULLSEG ) { printf( "Unable to allocate based heap\n" ); return 0; - + } else @@ -332,9 +329,9 @@ size_t _basedcoreleft(void) pFirst = p; } return total; -}*/ +} -size_t GetFreeSize(void) +size_t HC_GetFreeSize(void) { struct _heapinfo h_info; int heap_status; @@ -348,15 +345,37 @@ size_t GetFreeSize(void) if((h_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") h_used += h_info._size; h_total += h_info._size; } - heapstat0(heap_status); + HCL_heapstat(heap_status); return h_free; } +*/ + +void HCL_HeapWalking (struct _heapinfo *h_info, hc_use_t *hu, unsigned nearfarswitch) +{ + hu->h_free=0; hu->h_total=0; hu->h_used=0; + + h_info->_pentry = NULL; + for(;;) { + if(nearfarswitch==0) hu->heap_status = _nheapwalk( h_info ); + else if(nearfarswitch==1) hu->heap_status = _fheapwalk( h_info ); + if( hu->heap_status != _HEAPOK ) break; + if((h_info->_useflag == _USEDENTRY ? "USED" : "FREE")=="FREE") hu->h_free += h_info->_size; + if((h_info->_useflag == _USEDENTRY ? "USED" : "FREE")=="USED") hu->h_used += h_info->_size; + hu->h_total += h_info->_size; + } + HCL_heapstat(hu->heap_status); +} -size_t GetFarFreeSize(void) +unsigned long HC_GetFarFreeSize(void) { + struct _heapinfo h_info; + hc_use_t hu; + HCL_HeapWalking (&h_info, &hu, 1); + return hu.h_free; +#if 0 struct _heapinfo fh_info; int heap_status; - size_t fh_free=0, fh_total=0, fh_used=0; + unsigned long fh_free=0, fh_total=0, fh_used=0; fh_info._pentry = NULL; for(;;) { @@ -366,12 +385,18 @@ size_t GetFarFreeSize(void) if((fh_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") fh_used += fh_info._size; fh_total += fh_info._size; } - heapstat0(heap_status); + HCL_heapstat(heap_status); return fh_free; +#endif } -size_t GetNearFreeSize(void) +size_t HC_GetNearFreeSize(void) { + struct _heapinfo h_info; + hc_use_t hu; + HCL_HeapWalking (&h_info, &hu, 0); + return hu.h_free; +#if 0 struct _heapinfo nh_info; int heap_status; size_t nh_free=0, nh_total=0, nh_used=0; @@ -384,19 +409,21 @@ size_t GetNearFreeSize(void) if((nh_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") nh_used += nh_info._size; nh_total += nh_info._size; } - heapstat0(heap_status); + HCL_heapstat(heap_status); return nh_free; +#endif } -void heapdump(global_game_variables_t *gvar) +void HC_heapdump(global_game_variables_t *gvar) { - struct _heapinfo fh_info, nh_info, h_info; + struct _heapinfo fh_info, nh_info;//, h_info; int heap_status; - size_t h_free, nh_free, fh_free, h_total, nh_total, fh_total, h_used, nh_used, fh_used; - byte scratch[1024],str[16]; + size_t nh_free, fh_free, nh_total, fh_total, nh_used, fh_used;//, h_free, h_total, h_used; + byte scratch[1024],str[16]; HC_OpenDebug(gvar); +#if 0 strcpy(scratch,"\n == default ==\n\n"); write(gvar->handle.heaphandle,scratch,strlen(scratch)); h_info._pentry = NULL; @@ -404,13 +431,16 @@ void heapdump(global_game_variables_t *gvar) for(;;) { heap_status = _heapwalk( &h_info ); if( heap_status != _HEAPOK ) break; - strcpy(scratch," "); strcat(scratch,(h_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at "); ultoa((dword)h_info._pentry,str,16); strcat(scratch,str); strcat(scratch," of size "); ultoa(h_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n"); + strcpy(scratch," "); strcat(scratch,(h_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at "); + sprintf(str, "%Fp", h_info._pentry); //ultoa((dword)h_info._pentry,str,16); + strcat(scratch,str); strcat(scratch," of size "); ultoa(h_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n"); if((h_info._useflag == _USEDENTRY ? "USED" : "FREE")=="FREE") h_free += h_info._size; if((h_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") h_used += h_info._size; h_total += h_info._size; write(gvar->handle.heaphandle,scratch,strlen(scratch)); } - heapstat(gvar, heap_status, &scratch); + HCL_heapstatLogWrite(gvar, heap_status, scratch); +#endif //near strcpy(scratch,"\n == near ==\n\n"); @@ -420,7 +450,9 @@ void heapdump(global_game_variables_t *gvar) for(;;) { heap_status = _nheapwalk( &nh_info ); if( heap_status != _HEAPOK ) break; - strcpy(scratch," "); strcat(scratch,(h_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at "); ultoa((dword)nh_info._pentry,str,16); strcat(scratch,str); strcat(scratch," of size "); ultoa(nh_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n"); + strcpy(scratch," "); strcat(scratch,(nh_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at "); + sprintf(str, "%Fp", nh_info._pentry); //ultoa((dword)nh_info._pentry,str,16); + strcat(scratch,str); strcat(scratch," of size "); ultoa(nh_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n"); /* printf( " %s block at %Fp of size %4.4X\n", (nh_info._useflag == _USEDENTRY ? "USED" : "FREE"), nh_info._pentry, nh_info._size );*/ @@ -429,7 +461,7 @@ nh_info._pentry, nh_info._size );*/ nh_total += nh_info._size; write(gvar->handle.heaphandle,scratch,strlen(scratch)); } - heapstat(gvar, heap_status, &scratch); + HCL_heapstatLogWrite(gvar, heap_status, scratch); //far strcpy(scratch,"\n == far ==\n\n"); @@ -439,7 +471,9 @@ nh_info._pentry, nh_info._size );*/ for(;;) { heap_status = _fheapwalk( &fh_info ); if( heap_status != _HEAPOK ) break; - strcpy(scratch," "); strcat(scratch,(h_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at "); ultoa((dword)fh_info._pentry,str,16); strcat(scratch,str); strcat(scratch," of size "); ultoa(fh_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n"); + strcpy(scratch," "); strcat(scratch,(fh_info._useflag == _USEDENTRY ? "USED" : "FREE")); strcat(scratch," block at "); + sprintf(str, "%Fp", fh_info._pentry); //ultoa((dword)fh_info._pentry,str,16); + strcat(scratch,str); strcat(scratch," of size "); ultoa(fh_info._size,str,10); strcat(scratch,str); strcat(scratch,"\n"); /*printf( " %s block at %Fp of size %4.4X\n", (fh_info._useflag == _USEDENTRY ? "USED" : "FREE"), fh_info._pentry, fh_info._size );*/ @@ -448,27 +482,29 @@ fh_info._pentry, fh_info._size );*/ fh_total += fh_info._size; write(gvar->handle.heaphandle,scratch,strlen(scratch)); } - heapstat(gvar, heap_status, &scratch); + HCL_heapstatLogWrite(gvar, heap_status, scratch); strcpy(scratch,"\n"); strcat(scratch,kittengets(2,0,"Memory Type Total Used Free\n")); strcat(scratch,"---------------- -------- -------- --------\n"); - printmeminfoline(&scratch, "Default", h_total, h_used, h_free); - printmeminfoline(&scratch, "Near", nh_total, nh_used, nh_free); - printmeminfoline(&scratch, "Far", fh_total, fh_used, fh_free); +// printmeminfoline(&scratch, "Default", h_total, h_used, h_free); + printmeminfoline(scratch, "Near", nh_total, nh_used, nh_free); + printmeminfoline(scratch, "Far", fh_total, fh_used, fh_free); strcat(scratch,"---------------- -------- -------- --------\n"); - strcat(scratch,"coreleft = "); ultoa((dword)_coreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n"); - strcat(scratch,"farcoreleft = "); ultoa((dword)_farcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n"); - strcat(scratch,"GetFreeSize = "); ultoa((dword)GetFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n"); - strcat(scratch,"GetNearFreeSize = "); ultoa((dword)GetNearFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n"); - strcat(scratch,"GetFarFreeSize = "); ultoa((dword)GetFarFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n"); - strcat(scratch,"memavl = "); ultoa((dword)_memavl(),str,10); strcat(scratch,str); strcat(scratch,"\n"); - strcat(scratch,"stackavail = "); ultoa((dword)stackavail(),str,10); strcat(scratch,str); strcat(scratch,"\n"); + strcat(scratch,"HC_coreleft = "); ultoa((dword)HC_coreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n"); + strcat(scratch,"HC_farcoreleft = "); ultoa((dword)HC_farcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n"); +// strcat(scratch,"HC_Newfarcoreleft = "); ultoa((dword)HC_Newfarcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n"); +// strcat(scratch,"HC_GetFreeSize = "); ultoa((dword)HC_GetFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n"); + strcat(scratch,"HC_GetNearFreeSize = "); ultoa((dword)HC_GetNearFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n"); + strcat(scratch,"HC_GetFarFreeSize = "); ultoa((dword)HC_GetFarFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n"); + strcat(scratch,"coreleft = "); ultoa((dword)coreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n"); + strcat(scratch,"farcoreleft = "); ultoa((dword)farcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n"); + strcat(scratch,"stackavail = "); ultoa((dword)stackavail(),str,10); strcat(scratch,str); strcat(scratch,"\n"); write(gvar->handle.heaphandle,scratch,strlen(scratch)); HC_CloseDebug(gvar); } -void heapstat(global_game_variables_t *gvar, int heap_status, byte *str) +void HCL_heapstatLogWrite(global_game_variables_t *gvar, int heap_status, byte *str) { switch( heap_status ) { case _HEAPEND: @@ -481,16 +517,18 @@ void heapstat(global_game_variables_t *gvar, int heap_status, byte *str) case _HEAPBADBEGIN: strcpy((str),"ERROR - heap is damaged\n"); break; +#ifdef __WATCOMC__ case _HEAPBADPTR: strcpy((str),"ERROR - bad pointer to heap\n"); break; +#endif case _HEAPBADNODE: strcpy((str),"ERROR - bad node in heap\n"); } write(gvar->handle.heaphandle,(str),strlen((str))); } -void heapstat0(int heap_status) +void HCL_heapstat(int heap_status) { switch( heap_status ) { case _HEAPEND: @@ -502,14 +540,33 @@ void heapstat0(int heap_status) case _HEAPBADBEGIN: printf("ERROR - heap is damaged\n"); break; +#ifdef __WATCOMC__ case _HEAPBADPTR: printf("ERROR - bad pointer to heap\n"); break; +#endif case _HEAPBADNODE: printf("ERROR - bad node in heap\n"); } } + +//++ +#ifdef __WATCOMC__ +unsigned long farcoreleft() +{ +//---- _fheapgrow(); + return HC_farcoreleft(); +//stack overflows return HC_GetFarFreeSize(); +} + +unsigned long coreleft() +{ + _nheapgrow(); + return _memavl(); +// return HC_GetNearFreeSize(); +} #endif + /* ============================ = @@ -523,15 +580,22 @@ void HC_OpenDebug(global_game_variables_t *gvar) { #ifdef __BORLANDC__ unlink("heap.16b"); - gvar->handle.heaphandle = open("heap.16b", O_CREAT | O_WRONLY | O_TEXT); + gvar->handle.heaphandle = open(gvar->handle.heapdumpfilename, O_CREAT | O_WRONLY | O_TEXT); #endif #ifdef __WATCOMC__ unlink("heap.16w"); - gvar->handle.heaphandle = open("heap.16w", O_CREAT | O_WRONLY | O_TEXT); + gvar->handle.heaphandle = open(gvar->handle.heapdumpfilename, O_CREAT | O_WRONLY | O_TEXT); #endif } void HC_CloseDebug(global_game_variables_t *gvar) { close(gvar->handle.heaphandle); + +#ifdef __BORLANDC__ + strcpy(gvar->handle.heapdumpfilename, "heap.16b"); +#endif +#ifdef __WATCOMC__ + strcpy(gvar->handle.heapdumpfilename, "heap.16w"); +#endif }