#include <testsuite_common_types.h>
#if defined (__linux__) || defined (__GLIBC__)
-#include <malloc.h>
-#elif defined (__FreeBSD__)
-extern "C"
-{
- struct mallinfo
- {
- int uordblks;
- int hblkhd;
- };
+#include <malloc.h> // For mallinfo.
+#endif
- struct mallinfo
- mallinfo(void)
- {
- struct mallinfo m = { (((std::size_t) sbrk (0) + 1023) / 1024), 0 };
- return m;
- }
-}
-#elif !defined (__hpux__)
-extern "C"
+namespace __gnu_test
{
- struct mallinfo
+ struct MallocInfo
{
- int uordblks;
- int hblkhd;
- };
+ MallocInfo() : uordblks(0), hblkhd(0) { }
+ MallocInfo(std::size_t uordblocks, std::size_t hblockhd)
+ : uordblks(uordblocks), hblkhd(hblockhd)
+ { }
- struct mallinfo empty = { 0, 0 };
+ std::size_t uordblks;
+ std::size_t hblkhd;
+ };
- struct mallinfo
- mallinfo(void)
- { return empty; }
-}
+ MallocInfo
+ malloc_info()
+ {
+#if defined (__linux__) || defined (__hpux__) || defined (__GLIBC__)
+#if __GLIBC__ > 2 || __GLIBC__ == 2 && __GLIBC_MINOR__ >= 33
+ struct mallinfo2 mi = mallinfo2();
+#else
+ struct mallinfo mi = mallinfo();
+#endif
+ return MallocInfo(mi.uordblks, mi.hblkhd);
+#elif defined (__FreeBSD__)
+ return MallocInfo((((std::size_t) sbrk (0) + 1023) / 1024), 0);
+#else
+ return MallocInfo();
#endif
+ }
-namespace __gnu_test
-{
class time_counter
{
private:
int who;
rusage rusage_begin;
rusage rusage_end;
- struct mallinfo allocation_begin;
- struct mallinfo allocation_end;
+ MallocInfo allocation_begin;
+ MallocInfo allocation_end;
public:
resource_counter(int i = RUSAGE_SELF) : who(i)
if (getrusage(who, &rusage_begin) != 0 )
memset(&rusage_begin, 0, sizeof(rusage_begin));
void* p __attribute__((unused)) = malloc(0); // Needed for some implementations.
- allocation_begin = mallinfo();
+ allocation_begin = malloc_info();
}
void
{
if (getrusage(who, &rusage_end) != 0 )
memset(&rusage_end, 0, sizeof(rusage_end));
- allocation_end = mallinfo();
+ allocation_end = malloc_info();
}
int