X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_hc.c;h=d6cb6ced1c042867f25b7a3db261ada305a7eea0;hb=04fe364b1c5b4fdddca823044c2d584531691af6;hp=26fe62480b15c0e39ba166e955972fcc2bd88ece;hpb=8fe59539760b4d569c902912818c12bb5ffa9dde;p=16.git diff --git a/src/lib/16_hc.c b/src/lib/16_hc.c index 26fe6248..d6cb6ced 100755 --- a/src/lib/16_hc.c +++ b/src/lib/16_hc.c @@ -1,5 +1,5 @@ /* Project 16 Source Code~ - * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover + * Copyright (C) 2012-2021 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover * * This file is part of Project 16. * @@ -20,18 +20,18 @@ * */ /* - heap test stuff + heap check */ #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__ -#define FARCORELEFTPTR __huge -long HC_farcoreleft() +long HC_Newfarcoreleft() { - void FARCORELEFTPTR *hp; static long rc=736L; long s_rc; + void __huge *hp; static long rc=736L; long s_rc; s_rc=rc; rc+=2L; do @@ -49,74 +49,39 @@ long HC_farcoreleft() } while(hp!=NULL); return((rc-16L)*1024L); } -//#endif - -void -#ifdef __BORLANDC__ - * -#endif -#ifdef __WATCOMC__ - __near* #endif -HC_LargestFreeBlock(size_t* Size) + +//from: https://stackoverflow.com/questions/14386856/c-check-available-ram +void NPTR* HC_LargestFreeBlock(size_t* Size) { size_t s0, s1; -#ifdef __BORLANDC__ - void * p; -#endif -#ifdef __WATCOMC__ - void __near* p; -#endif + void NPTR* p; s0 = ~(size_t)0 ^ (~(size_t)0 >> 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; } +//from: https://stackoverflow.com/questions/14386856/c-check-available-ram size_t HC_coreleft(void) { size_t total = 0; @@ -129,12 +94,7 @@ size_t HC_coreleft(void) if (largest < sizeof(void __near*)) { if (p != NULL) -#ifdef __BORLANDC__ - free(p); -#endif -#ifdef __WATCOMC__ _nfree(p); -#endif break; } *(void __near* __near*)p = NULL; @@ -150,23 +110,19 @@ size_t HC_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* HC_LargestFarFreeBlock(size_t* Size) +//far version of above +void __far* HC_LargestFarFreeBlock(dword* Size) { - size_t s0, s1; - void far* p; + dword s0, s1; + void __far* p; - s0 = ~(size_t)0 ^ (~(size_t)0 >> 1); + s0 = ~(dword)0 ^ (~(dword)0 >> 1); while (s0 && (p = _fmalloc(s0)) == NULL) s0 >>= 1; @@ -190,41 +146,44 @@ void far* HC_LargestFarFreeBlock(size_t* Size) return p; } -size_t HC_farcoreleft_(void) +//far version of above +dword HC_farcoreleft(void) { - size_t total = 0; - void far* pFirst = NULL; - void far* pLast = NULL; + dword total = 0UL; + void __far* pFirst = NULL; + void __far* pLast = NULL; for(;;) { - size_t largest; - void far* p = HC_LargestFarFreeBlock(&largest); - if (largest < sizeof(void far*)) + dword largest; + void __far* p = HC_LargestFarFreeBlock(&largest); + if (largest < sizeof(void __far*)) { if (p != NULL) _ffree(p); break; } - *(void far* far*)p = NULL; + *(void __far* __far*)p = NULL; total += largest; if (pFirst == NULL) pFirst = p; if (pLast != NULL) - *(void far* far*)pLast = p; + *(void __far* __far*)pLast = p; pLast = p; } while (pFirst != NULL) { - void far* p = *(void far* far*)pFirst; + void __far* p = *(void __far* __far*)pFirst; _ffree(pFirst); pFirst = p; } + + //if(total>16) total+=16; total &= 0xfffffff0UL; return total; } -#ifdef __WATCOMC__ +//==#ifdef __WATCOMC__ /*void huge* LargestHugeFreeBlock(size_t* Size) { size_t s0, s1; @@ -337,30 +296,30 @@ size_t _basedcoreleft(void) { size_t largest; void __based(segu)* p = LargestBasedFreeBlock(&largest); - if (largest < sizeof(void far*)) + if (largest < sizeof(void __far*)) { if (p != NULL) _ffree(p); break; } - *(void far* far*)p = NULL; + *(void __far* __far*)p = NULL; total += largest; if (pFirst == NULL) pFirst = p; if (pLast != NULL) - *(void far* far*)pLast = p; + *(void __far* __far*)pLast = p; pLast = p; } while (pFirst != NULL) { - void far* p = *(void far* far*)pFirst; + void __far* p = *(void __far* __far*)pFirst; _ffree(pFirst); pFirst = p; } return total; -}*/ +} size_t HC_GetFreeSize(void) { @@ -376,15 +335,37 @@ size_t HC_GetFreeSize(void) if((h_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") h_used += h_info._size; h_total += h_info._size; } - HC_heapstat0(heap_status); + HCL_heapstat(heap_status); return h_free; } +*/ -size_t HC_GetFarFreeSize(void) +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); +} + +dword 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; + dword fh_free=0, fh_total=0, fh_used=0; fh_info._pentry = NULL; for(;;) { @@ -394,12 +375,18 @@ size_t HC_GetFarFreeSize(void) if((fh_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") fh_used += fh_info._size; fh_total += fh_info._size; } - HC_heapstat0(heap_status); + HCL_heapstat(heap_status); return fh_free; +#endif } 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; @@ -412,8 +399,9 @@ size_t HC_GetNearFreeSize(void) if((nh_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") nh_used += nh_info._size; nh_total += nh_info._size; } - HC_heapstat0(heap_status); + HCL_heapstat(heap_status); return nh_free; +#endif } void HC_heapdump(global_game_variables_t *gvar) @@ -441,7 +429,7 @@ void HC_heapdump(global_game_variables_t *gvar) h_total += h_info._size; write(gvar->handle.heaphandle,scratch,strlen(scratch)); } - HC_heapstat(gvar, heap_status, &scratch); + HCL_heapstatLogWrite(gvar, heap_status, scratch); #endif //near @@ -463,7 +451,7 @@ nh_info._pentry, nh_info._size );*/ nh_total += nh_info._size; write(gvar->handle.heaphandle,scratch,strlen(scratch)); } - HC_heapstat(gvar, heap_status, &scratch); + HCL_heapstatLogWrite(gvar, heap_status, scratch); //far strcpy(scratch,"\n == far ==\n\n"); @@ -484,27 +472,31 @@ fh_info._pentry, fh_info._size );*/ fh_total += fh_info._size; write(gvar->handle.heaphandle,scratch,strlen(scratch)); } - HC_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,"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_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,"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"); +#if defined(__LARGE__) || defined(__COMPACT__) || defined(__HUGE__) + 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"); +#endif +//-- 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"); +//00 strcat(scratch,"HC_GetNearFreeSize = "); ultoa((dword)HC_GetNearFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n"); +//00 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 HC_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: @@ -517,16 +509,18 @@ void HC_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 HC_heapstat0(int heap_status) +void HCL_heapstat(int heap_status) { switch( heap_status ) { case _HEAPEND: @@ -538,14 +532,44 @@ void HC_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__ +dword farcoreleft() +{ +//---- _fheapgrow(); +// #ifdef __BORLANDC__ +// return 0x90000UL-16UL; +// #endif + +#if !defined(__LARGE__) && !defined(__COMPACT__) && !defined(__HUGE__) +//---- + return 0x90000UL+16UL; +//---- return 589824UL+16UL; +#else +//++++ + return HC_farcoreleft(); +//stack overflows return HC_GetFarFreeSize(); #endif +} + +dword coreleft() +{ + _nheapgrow(); + return _memavl(); +// return HC_GetNearFreeSize(); +} +#endif + /* ============================ = @@ -578,17 +602,3 @@ void HC_CloseDebug(global_game_variables_t *gvar) strcpy(gvar->handle.heapdumpfilename, "heap.16w"); #endif } - -#ifdef __WATCOMC__ -unsigned long farcoreleft() -{ - _fheapgrow(); - return HC_farcoreleft(); -} - -unsigned long coreleft() -{ - _nheapgrow(); - return _memavl(); -} -#endif