// File: ninjabear[P]dr-doom/src/memory.cpp
// Function: consume_memory()
void consume_memory() {
   std::thread::id thread_id = std::this_thread::get_id();
   std::vector<void*> mem_ptrs;

   for (;;) {
       void* ptr = malloc(ALLOC_SIZE);
       if (ptr == NULL) {
           // reached peak?
           break;
       }
       
       std::memset(ptr, 0, ALLOC_SIZE);
       mem_ptrs.push_back(ptr);
   } 
   
   std::cout << "thread(" << thread_id << "): allocated " << (((mem_ptrs.size() * ALLOC_SIZE) / 1024.0) / 1024.0) << " MiB total" << std::endl;
   std::cout << "thread(" << thread_id << "): unwinding..." << std::endl;
   
   for (auto & ptr : mem_ptrs) { // we'll probably never get here
       free(ptr);
   }

   std::cout << "thread(" << thread_id << "): done." << std::endl;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xd0, %rsp
callq 0x52e0
movq %rax, -0x8(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x5310
movl $0x1000, %edi           # imm = 0x1000
callq 0x22b0
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x5074
jmp 0x50af
movq -0x28(%rbp), %rdi
xorl %esi, %esi
movl $0x1000, %edx           # imm = 0x1000
callq 0x2110
leaq -0x20(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x5330
jmp 0x5093
jmp 0x505d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x5510
jmp 0x52cd
movq 0x7f1a(%rip), %rdi      # 0xcfd0
leaq 0x352b(%rip), %rsi      # 0x85e8
callq 0x21f0
movq %rax, -0x78(%rbp)
jmp 0x50c8
movq -0x78(%rbp), %rdi
movq -0x8(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rsi
callq 0x53a0
movq %rax, -0x80(%rbp)
jmp 0x50e3
movq -0x80(%rbp), %rdi
leaq 0x3502(%rip), %rsi      # 0x85f0
callq 0x21f0
movq %rax, -0x88(%rbp)
jmp 0x50fc
leaq -0x20(%rbp), %rdi
callq 0x5410
movq -0x88(%rbp), %rdi
shlq $0xc, %rax
movq %rax, %xmm0
movaps 0x34a4(%rip), %xmm1     # 0x85c0
punpckldq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
movapd 0x34a8(%rip), %xmm1     # 0x85d0
subpd %xmm1, %xmm0
movaps %xmm0, %xmm1
unpckhpd %xmm0, %xmm0            # xmm0 = xmm0[1,1]
addsd %xmm1, %xmm0
movsd 0x34a1(%rip), %xmm1     # 0x85e0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
callq 0x23e0
movq %rax, -0x90(%rbp)
jmp 0x5155
movq -0x90(%rbp), %rdi
leaq 0x349b(%rip), %rsi      # 0x85fe
callq 0x21f0
movq %rax, -0x98(%rbp)
jmp 0x5171
movq -0x98(%rbp), %rdi
movq 0x7e31(%rip), %rsi      # 0xcfb0
callq 0x2230
jmp 0x5186
movq 0x7e43(%rip), %rdi      # 0xcfd0
leaq 0x3454(%rip), %rsi      # 0x85e8
callq 0x21f0
movq %rax, -0xa0(%rbp)
jmp 0x51a2
movq -0xa0(%rbp), %rdi
movq -0x8(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rsi
callq 0x53a0
movq %rax, -0xa8(%rbp)
jmp 0x51c3
movq -0xa8(%rbp), %rdi
leaq 0x3438(%rip), %rsi      # 0x8609
callq 0x21f0
movq %rax, -0xb0(%rbp)
jmp 0x51df
movq -0xb0(%rbp), %rdi
movq 0x7dc3(%rip), %rsi      # 0xcfb0
callq 0x2230
jmp 0x51f4
leaq -0x20(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rdi
callq 0x5430
movq %rax, -0x58(%rbp)
movq -0x50(%rbp), %rdi
callq 0x5460
movq %rax, -0x60(%rbp)
leaq -0x58(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x5490
testb $0x1, %al
jne 0x5229
jmp 0x524d
leaq -0x58(%rbp), %rdi
callq 0x54d0
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq (%rax), %rdi
callq 0x2290
leaq -0x58(%rbp), %rdi
callq 0x54f0
jmp 0x5216
movq 0x7d7c(%rip), %rdi      # 0xcfd0
leaq 0x338d(%rip), %rsi      # 0x85e8
callq 0x21f0
movq %rax, -0xb8(%rbp)
jmp 0x5269
movq -0xb8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rsi
callq 0x53a0
movq %rax, -0xc0(%rbp)
jmp 0x528a
movq -0xc0(%rbp), %rdi
leaq 0x3381(%rip), %rsi      # 0x8619
callq 0x21f0
movq %rax, -0xc8(%rbp)
jmp 0x52a6
movq -0xc8(%rbp), %rdi
movq 0x7cfc(%rip), %rsi      # 0xcfb0
callq 0x2230
jmp 0x52bb
leaq -0x20(%rbp), %rdi
callq 0x5510
addq $0xd0, %rsp
popq %rbp
retq
movq -0x30(%rbp), %rdi
callq 0x2390
nopw %cs:(%rax,%rax)