*\r
*/\r
/*\r
- heap test stuff\r
+ heap check\r
*/\r
\r
#include "src/lib/16_hc.h"\r
#endif\r
\r
//from: https://stackoverflow.com/questions/14386856/c-check-available-ram\r
-void\r
-#ifdef __BORLANDC__\r
- *\r
-#endif\r
-#ifdef __WATCOMC__\r
- __near*\r
-#endif\r
-HC_LargestFreeBlock(size_t* Size)\r
+void __near* HC_LargestFreeBlock(size_t* Size)\r
{\r
size_t s0, s1;\r
-#ifdef __BORLANDC__\r
- void * p;\r
-#endif\r
-#ifdef __WATCOMC__\r
void __near* p;\r
-#endif\r
\r
s0 = ~(size_t)0 ^ (~(size_t)0 >> 1);\r
-#ifdef __BORLANDC__\r
- while (s0 && (p = malloc(s0)) == NULL)\r
-#endif\r
-#ifdef __WATCOMC__\r
while (s0 && (p = _nmalloc(s0)) == NULL)\r
-#endif\r
s0 >>= 1;\r
\r
if (p)\r
-#ifdef __BORLANDC__\r
- free(p);\r
-#endif\r
-#ifdef __WATCOMC__\r
_nfree(p);\r
-#endif\r
\r
s1 = s0 >> 1;\r
while (s1)\r
{\r
-#ifdef __BORLANDC__\r
- if ((p = malloc(s0 + s1)) != NULL)\r
-#endif\r
-#ifdef __WATCOMC__\r
if ((p = _nmalloc(s0 + s1)) != NULL)\r
-#endif\r
{\r
s0 += s1;\r
-#ifdef __BORLANDC__\r
- free(p);\r
-#endif\r
-#ifdef __WATCOMC__\r
_nfree(p);\r
-#endif\r
}\r
s1 >>= 1;\r
}\r
-#ifdef __BORLANDC__\r
- while (s0 && (p = malloc(s0)) == NULL)\r
-#endif\r
-#ifdef __WATCOMC__\r
while (s0 && (p = _nmalloc(s0)) == NULL)\r
-#endif\r
s0 ^= s0 & -s0;\r
\r
*Size = s0;\r
if (largest < sizeof(void __near*))\r
{\r
if (p != NULL)\r
-#ifdef __BORLANDC__\r
- free(p);\r
-#endif\r
-#ifdef __WATCOMC__\r
_nfree(p);\r
-#endif\r
break;\r
}\r
*(void __near* __near*)p = NULL;\r
while (pFirst != NULL)\r
{\r
void __near* p = *(void __near* __near*)pFirst;\r
-#ifdef __BORLANDC__\r
- free(pFirst);\r
-#endif\r
-#ifdef __WATCOMC__\r
_nfree(pFirst);\r
-#endif\r
pFirst = p;\r
}\r
return total;\r
}\r
\r
//far version of above\r
-void far* HC_LargestFarFreeBlock(unsigned long* Size)\r
+void __far* HC_LargestFarFreeBlock(dword* Size)\r
{\r
- unsigned long s0, s1;\r
- void far* p;\r
+ dword s0, s1;\r
+ void __far* p;\r
\r
- s0 = ~(unsigned long)0 ^ (~(unsigned long)0 >> 1);\r
+ s0 = ~(dword)0 ^ (~(dword)0 >> 1);\r
while (s0 && (p = _fmalloc(s0)) == NULL)\r
s0 >>= 1;\r
\r
}\r
\r
//far version of above\r
-unsigned long HC_farcoreleft(void)\r
+dword HC_farcoreleft(void)\r
{\r
- unsigned long total = 0UL;\r
- void far* pFirst = NULL;\r
- void far* pLast = NULL;\r
+ dword total = 0UL;\r
+ void __far* pFirst = NULL;\r
+ void __far* pLast = NULL;\r
for(;;)\r
{\r
- unsigned long largest;\r
- void far* p = HC_LargestFarFreeBlock(&largest);\r
- if (largest < sizeof(void far*))\r
+ dword largest;\r
+ void __far* p = HC_LargestFarFreeBlock(&largest);\r
+ if (largest < sizeof(void __far*))\r
{\r
if (p != NULL)\r
_ffree(p);\r
break;\r
}\r
- *(void far* far*)p = NULL;\r
+ *(void __far* __far*)p = NULL;\r
total += largest;\r
if (pFirst == NULL)\r
pFirst = p;\r
\r
if (pLast != NULL)\r
- *(void far* far*)pLast = p;\r
+ *(void __far* __far*)pLast = p;\r
pLast = p;\r
}\r
\r
while (pFirst != NULL)\r
{\r
- void far* p = *(void far* far*)pFirst;\r
+ void __far* p = *(void __far* __far*)pFirst;\r
_ffree(pFirst);\r
pFirst = p;\r
}\r
+\r
+ //if(total>16) total+=16; total &= 0xfffffff0UL;\r
return total;\r
}\r
\r
-#ifdef __WATCOMC__\r
+//==#ifdef __WATCOMC__\r
/*void huge* LargestHugeFreeBlock(size_t* Size)\r
{\r
size_t s0, s1;\r
{\r
size_t largest;\r
void __based(segu)* p = LargestBasedFreeBlock(&largest);\r
- if (largest < sizeof(void far*))\r
+ if (largest < sizeof(void __far*))\r
{\r
if (p != NULL)\r
_ffree(p);\r
break;\r
}\r
- *(void far* far*)p = NULL;\r
+ *(void __far* __far*)p = NULL;\r
total += largest;\r
if (pFirst == NULL)\r
pFirst = p;\r
\r
if (pLast != NULL)\r
- *(void far* far*)pLast = p;\r
+ *(void __far* __far*)pLast = p;\r
pLast = p;\r
}\r
\r
while (pFirst != NULL)\r
{\r
- void far* p = *(void far* far*)pFirst;\r
+ void __far* p = *(void __far* __far*)pFirst;\r
_ffree(pFirst);\r
pFirst = p;\r
}\r
return total;\r
-}*/\r
-#if 0\r
+}\r
+\r
size_t HC_GetFreeSize(void)\r
{\r
struct _heapinfo h_info;\r
if((h_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") h_used += h_info._size;\r
h_total += h_info._size;\r
}\r
- HCL_heapstat0(heap_status);\r
+ HCL_heapstat(heap_status);\r
return h_free;\r
}\r
-#endif\r
+*/\r
\r
-unsigned long HC_GetFarFreeSize(void)\r
+void HCL_HeapWalking (struct _heapinfo *h_info, hc_use_t *hu, unsigned nearfarswitch)\r
{\r
+ hu->h_free=0; hu->h_total=0; hu->h_used=0;\r
+\r
+ h_info->_pentry = NULL;\r
+ for(;;) {\r
+ if(nearfarswitch==0) hu->heap_status = _nheapwalk( h_info );\r
+ else if(nearfarswitch==1) hu->heap_status = _fheapwalk( h_info );\r
+ if( hu->heap_status != _HEAPOK ) break;\r
+ if((h_info->_useflag == _USEDENTRY ? "USED" : "FREE")=="FREE") hu->h_free += h_info->_size;\r
+ if((h_info->_useflag == _USEDENTRY ? "USED" : "FREE")=="USED") hu->h_used += h_info->_size;\r
+ hu->h_total += h_info->_size;\r
+ }\r
+ HCL_heapstat(hu->heap_status);\r
+}\r
+\r
+dword HC_GetFarFreeSize(void)\r
+{\r
+ struct _heapinfo h_info;\r
+ hc_use_t hu;\r
+ HCL_HeapWalking (&h_info, &hu, 1);\r
+ return hu.h_free;\r
+#if 0\r
struct _heapinfo fh_info;\r
int heap_status;\r
- unsigned long fh_free=0, fh_total=0, fh_used=0;\r
+ dword fh_free=0, fh_total=0, fh_used=0;\r
\r
fh_info._pentry = NULL;\r
for(;;) {\r
if((fh_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") fh_used += fh_info._size;\r
fh_total += fh_info._size;\r
}\r
- HCL_heapstat0(heap_status);\r
+ HCL_heapstat(heap_status);\r
return fh_free;\r
+#endif\r
}\r
\r
size_t HC_GetNearFreeSize(void)\r
{\r
+ struct _heapinfo h_info;\r
+ hc_use_t hu;\r
+ HCL_HeapWalking (&h_info, &hu, 0);\r
+ return hu.h_free;\r
+#if 0\r
struct _heapinfo nh_info;\r
int heap_status;\r
size_t nh_free=0, nh_total=0, nh_used=0;\r
if((nh_info._useflag == _USEDENTRY ? "USED" : "FREE")=="USED") nh_used += nh_info._size;\r
nh_total += nh_info._size;\r
}\r
- HCL_heapstat0(heap_status);\r
+ HCL_heapstat(heap_status);\r
return nh_free;\r
+#endif\r
}\r
\r
void HC_heapdump(global_game_variables_t *gvar)\r
h_total += h_info._size;\r
write(gvar->handle.heaphandle,scratch,strlen(scratch));\r
}\r
- HCL_heapstat(gvar, heap_status, &scratch);\r
+ HCL_heapstatLogWrite(gvar, heap_status, scratch);\r
#endif\r
\r
//near\r
nh_total += nh_info._size;\r
write(gvar->handle.heaphandle,scratch,strlen(scratch));\r
}\r
- HCL_heapstat(gvar, heap_status, &scratch);\r
+ HCL_heapstatLogWrite(gvar, heap_status, scratch);\r
\r
//far\r
strcpy(scratch,"\n == far ==\n\n");\r
fh_total += fh_info._size;\r
write(gvar->handle.heaphandle,scratch,strlen(scratch));\r
}\r
- HCL_heapstat(gvar, heap_status, &scratch);\r
+ HCL_heapstatLogWrite(gvar, heap_status, scratch);\r
\r
strcpy(scratch,"\n");\r
strcat(scratch,kittengets(2,0,"Memory Type Total Used Free\n"));\r
strcat(scratch,"---------------- -------- -------- --------\n");\r
-// printmeminfoline(&scratch, "Default", h_total, h_used, h_free);\r
- printmeminfoline(&scratch, "Near", nh_total, nh_used, nh_free);\r
- printmeminfoline(&scratch, "Far", fh_total, fh_used, fh_free);\r
+//-- printmeminfoline(&scratch, "Default", h_total, h_used, h_free);\r
+ printmeminfoline(scratch, "Near", nh_total, nh_used, nh_free);\r
+ printmeminfoline(scratch, "Far", fh_total, fh_used, fh_free);\r
strcat(scratch,"---------------- -------- -------- --------\n");\r
strcat(scratch,"HC_coreleft = "); ultoa((dword)HC_coreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
strcat(scratch,"HC_farcoreleft = "); ultoa((dword)HC_farcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
-// strcat(scratch,"HC_Newfarcoreleft = "); ultoa((dword)HC_Newfarcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
-// strcat(scratch,"HC_GetFreeSize = "); ultoa((dword)HC_GetFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
- strcat(scratch,"HC_GetNearFreeSize = "); ultoa((dword)HC_GetNearFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
- strcat(scratch,"HC_GetFarFreeSize = "); ultoa((dword)HC_GetFarFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+//-- strcat(scratch,"HC_Newfarcoreleft = "); ultoa((dword)HC_Newfarcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+//-- strcat(scratch,"HC_GetFreeSize = "); ultoa((dword)HC_GetFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+//00 strcat(scratch,"HC_GetNearFreeSize = "); ultoa((dword)HC_GetNearFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
+//00 strcat(scratch,"HC_GetFarFreeSize = "); ultoa((dword)HC_GetFarFreeSize(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
strcat(scratch,"coreleft = "); ultoa((dword)coreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
strcat(scratch,"farcoreleft = "); ultoa((dword)farcoreleft(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
strcat(scratch,"stackavail = "); ultoa((dword)stackavail(),str,10); strcat(scratch,str); strcat(scratch,"\n");\r
HC_CloseDebug(gvar);\r
}\r
\r
-void HCL_heapstat(global_game_variables_t *gvar, int heap_status, byte *str)\r
+void HCL_heapstatLogWrite(global_game_variables_t *gvar, int heap_status, byte *str)\r
{\r
switch( heap_status ) {\r
case _HEAPEND:\r
case _HEAPBADBEGIN:\r
strcpy((str),"ERROR - heap is damaged\n");\r
break;\r
+#ifdef __WATCOMC__\r
case _HEAPBADPTR:\r
strcpy((str),"ERROR - bad pointer to heap\n");\r
break;\r
+#endif\r
case _HEAPBADNODE:\r
strcpy((str),"ERROR - bad node in heap\n");\r
}\r
write(gvar->handle.heaphandle,(str),strlen((str)));\r
}\r
\r
-void HCL_heapstat0(int heap_status)\r
+void HCL_heapstat(int heap_status)\r
{\r
switch( heap_status ) {\r
case _HEAPEND:\r
case _HEAPBADBEGIN:\r
printf("ERROR - heap is damaged\n");\r
break;\r
+#ifdef __WATCOMC__\r
case _HEAPBADPTR:\r
printf("ERROR - bad pointer to heap\n");\r
break;\r
+#endif\r
case _HEAPBADNODE:\r
printf("ERROR - bad node in heap\n");\r
}\r
}\r
\r
-unsigned long farcoreleft()\r
+//++\r
+#ifdef __WATCOMC__\r
+dword farcoreleft()\r
{\r
//---- _fheapgrow();\r
+// #ifdef __BORLANDC__\r
+// return 0x90000UL-16UL;\r
+// #endif\r
+\r
+#if !defined(__LARGE__) && !defined(__COMPACT__) && !defined(__HUGE__)\r
+//----\r
+ return 0x90000UL+16UL;\r
+//---- return 589824UL+16UL;\r
+#else\r
+//++++\r
return HC_farcoreleft();\r
//stack overflows return HC_GetFarFreeSize();\r
+#endif\r
}\r
\r
-unsigned long coreleft()\r
+dword coreleft()\r
{\r
_nheapgrow();\r
return _memavl();\r