#include <stdio.h>
#include <stdlib.h>
void* AllocateLargestFreeBlock(size_t* Size)
{
size_t s0, s1;
void* p;
s0 = ~(size_t)0 ^ (~(size_t)0 >> 1);
while (s0
&& (p
= malloc(s0
)) == NULL
) s0 >>= 1;
if (p)
s1 = s0 >> 1;
while (s1)
{
if ((p
= malloc(s0
+ s1
)) != NULL
) {
s0 += s1;
}
s1 >>= 1;
}
while (s0
&& (p
= malloc(s0
)) == NULL
) s0 ^= s0 & -s0;
*Size = s0;
return p;
}
size_t GetFreeSize(void)
{
size_t total = 0;
void* pFirst = NULL;
void* pLast = NULL;
for (;;)
{
size_t largest;
void* p = AllocateLargestFreeBlock(&largest);
if (largest < sizeof(void*))
{
if (p != NULL)
break;
}
*(void**)p = NULL;
total += largest;
if (pFirst == NULL)
pFirst = p;
if (pLast != NULL)
*(void**)pLast = p;
pLast = p;
}
while (pFirst != NULL)
{
void* p = *(void**)pFirst;
pFirst = p;
}
return total;
}
int main(void)
{
printf("Total free: %zu\n", GetFreeSize
()); printf("Total free: %zu\n", GetFreeSize
()); printf("Total free: %zu\n", GetFreeSize
()); printf("Total free: %zu\n", GetFreeSize
()); printf("Total free: %zu\n", GetFreeSize
()); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnZvaWQqIEFsbG9jYXRlTGFyZ2VzdEZyZWVCbG9jayhzaXplX3QqIFNpemUpCnsKICBzaXplX3QgczAsIHMxOwogIHZvaWQqIHA7CgogIHMwID0gfihzaXplX3QpMCBeICh+KHNpemVfdCkwID4+IDEpOwoKICB3aGlsZSAoczAgJiYgKHAgPSBtYWxsb2MoczApKSA9PSBOVUxMKQogICAgczAgPj49IDE7CgogIGlmIChwKQogICAgZnJlZShwKTsKCiAgczEgPSBzMCA+PiAxOwoKICB3aGlsZSAoczEpCiAgewogICAgaWYgKChwID0gbWFsbG9jKHMwICsgczEpKSAhPSBOVUxMKQogICAgewogICAgICBzMCArPSBzMTsKICAgICAgZnJlZShwKTsKICAgIH0KICAgIHMxID4+PSAxOwogIH0KCiAgd2hpbGUgKHMwICYmIChwID0gbWFsbG9jKHMwKSkgPT0gTlVMTCkKICAgIHMwIF49IHMwICYgLXMwOwoKICAqU2l6ZSA9IHMwOwogIHJldHVybiBwOwp9CgpzaXplX3QgR2V0RnJlZVNpemUodm9pZCkKewogIHNpemVfdCB0b3RhbCA9IDA7CiAgdm9pZCogcEZpcnN0ID0gTlVMTDsKICB2b2lkKiBwTGFzdCA9IE5VTEw7CgogIGZvciAoOzspCiAgewogICAgc2l6ZV90IGxhcmdlc3Q7CiAgICB2b2lkKiBwID0gQWxsb2NhdGVMYXJnZXN0RnJlZUJsb2NrKCZsYXJnZXN0KTsKCiAgICBpZiAobGFyZ2VzdCA8IHNpemVvZih2b2lkKikpCiAgICB7CiAgICAgIGlmIChwICE9IE5VTEwpCiAgICAgICAgZnJlZShwKTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgKih2b2lkKiopcCA9IE5VTEw7CgogICAgdG90YWwgKz0gbGFyZ2VzdDsKCiAgICBpZiAocEZpcnN0ID09IE5VTEwpCiAgICAgIHBGaXJzdCA9IHA7CgogICAgaWYgKHBMYXN0ICE9IE5VTEwpCiAgICAgICoodm9pZCoqKXBMYXN0ID0gcDsKCiAgICBwTGFzdCA9IHA7CiAgfQoKICB3aGlsZSAocEZpcnN0ICE9IE5VTEwpCiAgewogICAgdm9pZCogcCA9ICoodm9pZCoqKXBGaXJzdDsKICAgIGZyZWUocEZpcnN0KTsKICAgIHBGaXJzdCA9IHA7CiAgfQoKICByZXR1cm4gdG90YWw7Cn0KCmludCBtYWluKHZvaWQpCnsKICBwcmludGYoIlRvdGFsIGZyZWU6ICV6dVxuIiwgR2V0RnJlZVNpemUoKSk7CiAgcHJpbnRmKCJUb3RhbCBmcmVlOiAlenVcbiIsIEdldEZyZWVTaXplKCkpOwogIHByaW50ZigiVG90YWwgZnJlZTogJXp1XG4iLCBHZXRGcmVlU2l6ZSgpKTsKICBwcmludGYoIlRvdGFsIGZyZWU6ICV6dVxuIiwgR2V0RnJlZVNpemUoKSk7CiAgcHJpbnRmKCJUb3RhbCBmcmVlOiAlenVcbiIsIEdldEZyZWVTaXplKCkpOwogIHJldHVybiAwOwp9Cg==