; assembly | /* r2dec pseudo code output */ | /* bdlcc_sharedobjectpool.t/assume @ 0x409600 */ | #include | ; (fcn) sym.BloombergLP::bdlcc::ObjectPool_BloombergLP::bdlcc::SharedObjectPool_Rep__anonymous_namespace_::SpLink__BloombergLP::bdlcc::ObjectPoolFunctors::Reset__anonymous_namespace_::SpLink_____bsl::function_void__void__BloombergLP::bslma::Allocator____BloombergLP::bdlcc::ObjectPoolFunctors::Reset_BloombergLP::bdlcc::SharedObjectPool_Rep__anonymous_namespace_::SpLink__BloombergLP::bdlcc::ObjectPoolFunctors::Reset__anonymous_namespace_::SpLink_______::getObject__ () | int64_t BloombergLP::bdlcc::ObjectPool_BloombergLP::bdlcc::SharedObjectPool_Rep_anonymous_namespace_::SpLink_BloombergLP::bdlcc::ObjectPoolFunctors::Reset_anonymous_namespace_::SpLink_bsl::function_void_void_BloombergLP::bslma::Allocator_BloombergLP::bdlcc::ObjectPoolFunctors::Reset_BloombergLP::bdlcc::SharedObjectPool_Rep_anonymous_namespace_::SpLink_BloombergLP::bdlcc::ObjectPoolFunctors::Reset_anonymous_namespace_::SpLink_::getObject_ (int64_t arg1) { | int64_t var_4h; | int64_t var_8h; | int64_t var_10h; | int64_t var_18h; | int64_t var_20h; | rdi = arg1; | /* BloombergLP::bdlcc::ObjectPool >, bsl::function, BloombergLP::bdlcc::ObjectPoolFunctors::Reset > > >::getObject() */ 0x00409600 push rbp | 0x00409601 push r15 | 0x00409603 push r14 | 0x00409605 push r13 | 0x00409607 push r12 | 0x00409609 push rbx | 0x0040960a sub rsp, 0x28 | 0x0040960e mov rbp, rdi | 0x00409611 lea r14, [rdi + 0x90] | r14 = rdi + 0x90; 0x00409618 lea r15, [rdi + 0x78] | r15 = rdi + 0x78; 0x0040961c lea r12, [rdi + 0x10] | r12 = rdi + 0x10; | label_2: 0x00409620 mov rbx, qword [rbp + 8] | rbx = *((rbp + 8)); 0x00409624 test rbx, rbx | | if (rbx == 0) { 0x00409627 je 0x409692 | goto label_5; | } | label_3: 0x00409629 mov eax, 2 | eax = 2; 0x0040962e lock xadd dword [rbx + 8], eax | __asm ("lock xadd dword [rbx + 8], eax"); 0x00409633 test eax, eax | | if (eax != 0) { 0x00409635 jne 0x4096b0 | goto label_6; | } | label_4: 0x00409637 mov rax, qword [rbp + 8] | rax = *((rbp + 8)); 0x0040963b mov qword [rsp + 0x18], rax | *((rsp + 0x18)) = rax; 0x00409640 mov rax, qword [rsp + 0x18] | rax = *((rsp + 0x18)); 0x00409645 cmp rax, rbx | | if (rax != rbx) { 0x00409648 jne 0x40967a | goto label_1; | } 0x0040964a mov rax, qword [rsp + 0x18] | rax = *((rsp + 0x18)); 0x0040964f mov rcx, qword [rax] | rcx = *(rax); 0x00409652 mov rax, rbx | rax = rbx; 0x00409655 lock cmpxchg qword [rbp + 8], rcx | __asm ("lock cmpxchg qword [rbp + 8], rcx"); 0x0040965b cmp rbx, rax | | if (rbx == rax) { 0x0040965e je 0x4097cf | void (*0x4097cf)() (); | } 0x00409664 jmp 0x40967a | goto label_1; | label_0: 0x00409666 mov edx, ecx | edx = ecx; 0x00409668 xor edx, 1 | edx ^= 1; 0x0040966b mov eax, ecx | eax = ecx; 0x0040966d lock cmpxchg dword [rbx + 8], edx | __asm ("lock cmpxchg dword [rbx + 8], edx"); 0x00409672 cmp ecx, eax | | if (ecx == eax) { 0x00409674 je 0x4097cf | void (*0x4097cf)() (); | } | label_1: 0x0040967a mov ecx, dword [rbx + 8] | ecx = *((rbx + 8)); 0x0040967d test cl, 1 | | if ((cl & 1) != 0) { 0x00409680 jne 0x409666 | goto label_0; | } 0x00409682 lea edx, [rcx - 2] | edx = rcx - 2; 0x00409685 mov eax, ecx | eax = ecx; 0x00409687 lock cmpxchg dword [rbx + 8], edx | __asm ("lock cmpxchg dword [rbx + 8], edx"); 0x0040968c cmp ecx, eax | | if (ecx != eax) { 0x0040968e jne 0x40967a | goto label_1; | } 0x00409690 jmp 0x409620 | goto label_2; | label_5: 0x00409692 mov rdi, r14 | rdi = r14; 0x00409695 call 0x403a50 | pthread_mutex_lock (); 0x0040969a mov rbx, qword [rbp + 8] | rbx = *((rbp + 8)); 0x0040969e test rbx, rbx | | if (rbx == 0) { 0x004096a1 je 0x4096d3 | goto label_7; | } 0x004096a3 mov rdi, r14 | rdi = r14; 0x004096a6 call 0x403b00 | pthread_mutex_unlock (); 0x004096ab jmp 0x409629 | goto label_3; | label_6: 0x004096b0 mov rax, qword [rbp + 8] | rax = *((rbp + 8)); 0x004096b4 cmp rbx, rax | | if (rbx != rax) { 0x004096b7 jne 0x409637 | goto label_4; | } 0x004096bd mov rax, qword [rbp + 8] | rax = *((rbp + 8)); 0x004096c1 cmp rbx, rax | | if (rbx != rax) { 0x004096c4 jne 0x409637 | goto label_4; | } 0x004096ca mov rax, qword [rbp + 8] | rax = *((rbp + 8)); 0x004096ce jmp 0x409637 | goto label_4; | label_7: 0x004096d3 mov eax, dword [rbp + 0x64] | eax = *((rbp + 0x64)); | }