2016-01-28 14:52:40 +01:00
|
|
|
/** @file
|
|
|
|
|
*
|
|
|
|
|
* @par History
|
|
|
|
|
* - 2006/10/06 Shinigami: Win needs malloc.h for _HEAPINFO
|
|
|
|
|
*/
|
2016-02-11 22:54:43 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "allocd.h"
|
|
|
|
|
|
2018-01-29 21:55:48 +01:00
|
|
|
#include <cstddef>
|
2016-02-11 22:54:43 +01:00
|
|
|
#ifdef _WIN32
|
2018-02-04 15:00:15 +01:00
|
|
|
#include "../clib/logfacility.h"
|
2024-01-16 17:55:42 +01:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
#include <malloc.h>
|
2016-02-11 22:54:43 +01:00
|
|
|
#endif
|
|
|
|
|
|
2026-01-17 10:30:21 +01:00
|
|
|
|
|
|
|
|
namespace Pol::Core
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
size_t last_blocks_used = 0;
|
|
|
|
|
size_t last_bytes_used = 0;
|
|
|
|
|
size_t last_blocks_free = 0;
|
|
|
|
|
size_t last_bytes_free = 0;
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
void PrintAllocationData()
|
|
|
|
|
{
|
2016-02-11 22:54:43 +01:00
|
|
|
#ifdef _WIN32
|
2016-02-19 19:26:35 +01:00
|
|
|
_HEAPINFO hinfo;
|
|
|
|
|
int heapstatus;
|
2018-07-31 14:30:29 +02:00
|
|
|
hinfo._pentry = nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
size_t blocks_used = 0, bytes_used = 0, blocks_free = 0, bytes_free = 0;
|
|
|
|
|
while ( ( heapstatus = _heapwalk( &hinfo ) ) == _HEAPOK )
|
|
|
|
|
{
|
|
|
|
|
if ( hinfo._useflag == _USEDENTRY )
|
|
|
|
|
{
|
|
|
|
|
++blocks_used;
|
|
|
|
|
bytes_used += hinfo._size;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
++blocks_free;
|
|
|
|
|
bytes_free += hinfo._size;
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-01-10 18:29:10 +01:00
|
|
|
std::string tmp;
|
|
|
|
|
tmp += fmt::format( "Heap: Used {} blocks, {} bytes, Free {} blocks, {} bytes\n", blocks_used,
|
|
|
|
|
bytes_used, blocks_free, bytes_free );
|
|
|
|
|
tmp += fmt::format( "Delta: Used {} blocks, {} bytes, Free {} blocks, {} bytes\n",
|
|
|
|
|
blocks_used - last_blocks_used, bytes_used - last_bytes_used,
|
|
|
|
|
blocks_free - last_blocks_free, bytes_free - last_bytes_free );
|
2016-02-19 19:26:35 +01:00
|
|
|
last_blocks_used = blocks_used;
|
|
|
|
|
last_bytes_used = bytes_used;
|
|
|
|
|
last_blocks_free = blocks_free;
|
|
|
|
|
last_bytes_free = bytes_free;
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
switch ( heapstatus )
|
|
|
|
|
{
|
|
|
|
|
case _HEAPEMPTY:
|
2024-01-10 18:29:10 +01:00
|
|
|
tmp += "OK - empty heap\n";
|
2016-02-19 19:26:35 +01:00
|
|
|
break;
|
|
|
|
|
case _HEAPEND:
|
2024-01-10 18:29:10 +01:00
|
|
|
tmp += "OK - end of heap\n";
|
2016-02-19 19:26:35 +01:00
|
|
|
break;
|
|
|
|
|
case _HEAPBADPTR:
|
2024-01-10 18:29:10 +01:00
|
|
|
tmp += "ERROR - bad pointer to heap\n";
|
2016-02-19 19:26:35 +01:00
|
|
|
break;
|
|
|
|
|
case _HEAPBADBEGIN:
|
2024-01-10 18:29:10 +01:00
|
|
|
tmp += "ERROR - bad start of heap\n";
|
2016-02-19 19:26:35 +01:00
|
|
|
break;
|
|
|
|
|
case _HEAPBADNODE:
|
2024-01-10 18:29:10 +01:00
|
|
|
tmp += "ERROR - bad node in heap\n";
|
2016-02-19 19:26:35 +01:00
|
|
|
break;
|
2016-02-11 22:54:43 +01:00
|
|
|
}
|
2024-01-10 18:29:10 +01:00
|
|
|
INFO_PRINTLN( tmp );
|
2016-02-19 19:26:35 +01:00
|
|
|
#endif
|
|
|
|
|
}
|
2026-01-17 10:30:21 +01:00
|
|
|
} // namespace Pol::Core
|