; assembly | /* r2dec pseudo code output */ | /* bdlmt_signaler.t/none @ 0x417be0 */ | #include | ; (fcn) method.BloombergLP::bdlmt::Signaler_Invocable_BloombergLP::bdlmt.Signaler_void__BloombergLP::bdlcc::Deque__anonymous_namespace_::u::DoubleTI_____void__BloombergLP::bdlcc::Deque__anonymous_namespace_::u::DoubleTI___::operator___BloombergLP::bdlcc::Deque () | int64_t method_BloombergLP::bdlmt::Signaler_Invocable_BloombergLP::bdlmt_Signaler_void_BloombergLP::bdlcc::Deque_anonymous_namespace_::u::DoubleTI_void_BloombergLP::bdlcc::Deque_anonymous_namespace_::u::DoubleTI_::operator_BloombergLP::bdlcc::Deque (int64_t arg2, int64_t arg1) { | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlmt::Signaler_Invocable*)>, void (BloombergLP::bdlcc::Deque<(anonymous namespace)::u::DoubleTI>*)>::operator()(BloombergLP::bdlcc::Deque<(anonymous namespace)::u::DoubleTI>*) const */ 0x00417be0 push rbp | 0x00417be1 push r15 | 0x00417be3 push r14 | 0x00417be5 push r13 | 0x00417be7 push r12 | 0x00417be9 push rbx | 0x00417bea sub rsp, 0x108 | 0x00417bf1 mov r15, rsi | r15 = rsi; 0x00417bf4 mov r14, qword [rdi] | r14 = *(rdi); 0x00417bf7 mov rax, qword [r14 + 0x10] | rax = *((r14 + 0x10)); 0x00417bfb movabs rcx, 0x1fffffff00000000 | rcx = 0x1fffffff00000000; 0x00417c05 nop word cs:[rax + rax] | 0x00417c0f nop | | do { 0x00417c10 test rax, rcx | | if ((rax & rcx) != 0) { 0x00417c13 jne 0x417c23 | goto label_6; | } 0x00417c15 lea rdx, [rax + 1] | rdx = rax + 1; 0x00417c19 lock cmpxchg qword [r14 + 0x10], rdx | __asm ("lock cmpxchg qword [r14 + 0x10], rdx"); 0x00417c1f jne 0x417c10 | | } while ((rax & rcx) != 0); 0x00417c21 jmp 0x417c3c | goto label_7; | label_6: 0x00417c23 lea rbx, [r14 + 0x18] | rbx = r14 + 0x18; 0x00417c27 mov rdi, rbx | rdi = rbx; 0x00417c2a call 0x404b80 | pthread_mutex_lock (); 0x00417c2f lock inc qword [r14 + 0x10] | *((r14 + 0x10))++; 0x00417c34 mov rdi, rbx | rdi = rbx; 0x00417c37 call 0x404c60 | pthread_mutex_unlock (); | label_7: 0x00417c3c lea r12, [r14 + 0x80] | r12 = r14 + 0x80; 0x00417c43 mov rdi, r12 | rdi = r12; 0x00417c46 call 0x404b80 | pthread_mutex_lock (); 0x00417c4b mov rax, qword [r14 + 0x70] | rax = *((r14 + 0x70)); 0x00417c4f mov r13, qword [rax + 0x20] | r13 = *((rax + 0x20)); 0x00417c53 cmp r13, qword [r14 + 0x78] | | if (r13 == *((r14 + 0x78))) { 0x00417c57 je 0x417ddd | goto label_8; | } 0x00417c5d mov rdi, r13 | 0x00417c60 call 0x431950 | BloombergLP::bdlcc::SkipList_Control::incrementRefCount() (r13); 0x00417c65 mov rdi, r12 | rdi = r12; 0x00417c68 call 0x404c60 | pthread_mutex_unlock (); 0x00417c6d test r13, r13 | | if (r13 != 0) { 0x00417c70 jne 0x417c96 | goto label_9; | } 0x00417c72 jmp 0x417de5 | goto label_5; | do { 0x00417c80 xor ebx, ebx | ebx = 0; | label_0: 0x00417c82 mov rdi, r12 | rdi = r12; 0x00417c85 call 0x404c60 | pthread_mutex_unlock (); | label_4: 0x00417c8a mov r13, rbx | r13 = rbx; 0x00417c8d test rbx, rbx | | if (rbx == 0) { 0x00417c90 je 0x417de5 | goto label_5; | } | label_9: 0x00417c96 mov rdi, qword [r13 + 8] | rdi = *((r13 + 8)); 0x00417c9a mov rbp, qword [r13 + 0x18] | rbp = *((r13 + 0x18)); 0x00417c9e mov eax, dword [rdi + 0x10] | eax = *((rdi + 0x10)); 0x00417ca1 cmp eax, 1 | | if (eax == 1) { 0x00417ca4 jne 0x417cbc | 0x00417ca6 mov rax, qword [rdi + 0x70] | rax = *((rdi + 0x70)); 0x00417caa test rax, rax | | if (rax == 0) { 0x00417cad je 0x417eaf | goto label_10; | } 0x00417cb3 add rdi, 0x30 | rdi += 0x30; 0x00417cb7 mov rsi, r15 | rsi = r15; 0x00417cba call rax | void (*rax)() (); | } 0x00417cbc mov rdi, r12 | rdi = r12; 0x00417cbf call 0x404b80 | pthread_mutex_lock (); 0x00417cc4 cmp qword [r13 + 0x20], 0 | | if (*((r13 + 0x20)) == 0) { 0x00417cc9 je 0x417cf0 | goto label_11; | } 0x00417ccb mov rdi, r13 | 0x00417cce call 0x431920 | BloombergLP::bdlcc::SkipList_Control::decrementRefCount() (r13); 0x00417cd3 mov rbx, qword [r13 + 0x20] | rbx = *((r13 + 0x20)); 0x00417cd7 cmp qword [r14 + 0x78], rbx | 0x00417cdb je 0x417c80 | | } while (*((r14 + 0x78)) == rbx); 0x00417cdd mov rdi, rbx | 0x00417ce0 call 0x431950 | BloombergLP::bdlcc::SkipList_Control::incrementRefCount() (rbx); 0x00417ce5 jmp 0x417c82 | goto label_0; | label_11: 0x00417cf0 mov rdi, r12 | rdi = r12; 0x00417cf3 call 0x404c60 | pthread_mutex_unlock (); 0x00417cf8 mov rdi, r12 | rdi = r12; 0x00417cfb call 0x404b80 | pthread_mutex_lock (); 0x00417d00 mov rbx, qword [r14 + 0x70] | rbx = *((r14 + 0x70)); 0x00417d04 mov eax, dword [r14 + 0x68] | eax = *((r14 + 0x68)); 0x00417d08 test eax, eax | | if (eax < 0) { 0x00417d0a js 0x417d78 | goto label_12; | } 0x00417d0c mov r8, rbp | r8 = rbp; 0x00417d0f shr r8, 0x20 | r8 >>= 0x20; 0x00417d13 mov r9, qword [r14 + 0x78] | r9 = *((r14 + 0x78)); 0x00417d17 jmp 0x417d2f | goto label_13; | label_2: 0x00417d19 mov rbx, rsi | rbx = rsi; | do { 0x00417d1c mov rcx, r9 | rcx = r9; | label_1: 0x00417d1f mov qword [rsp + rax*8], rcx | *((rsp + rax*8)) = rcx; 0x00417d23 lea rcx, [rax - 1] | rcx = rax - 1; 0x00417d27 test rax, rax | 0x00417d2a mov rax, rcx | rax = rcx; | if (rax <= 0) { 0x00417d2d jle 0x417d7c | goto label_14; | } | label_13: 0x00417d2f mov rdi, rax | rdi = rax; 0x00417d32 shl rdi, 4 | rdi <<= 4; 0x00417d36 mov rcx, qword [rbx + rdi + 0x20] | rcx = *((rbx + rdi + 0x20)); 0x00417d3b cmp rcx, r9 | 0x00417d3e je 0x417d1c | | } while (rcx == r9); 0x00417d40 mov edx, dword [rcx + 0x18] | edx = *((rcx + 0x18)); 0x00417d43 cmp edx, ebp | | if (edx > ebp) { 0x00417d45 jg 0x417d1f | goto label_1; | } 0x00417d47 nop word [rax + rax] | | label_3: 0x00417d50 mov rsi, rcx | rsi = rcx; 0x00417d53 cmp edx, ebp | | if (edx >= ebp) { 0x00417d55 jl 0x417d5d | 0x00417d57 cmp dword [rsi + 0x1c], r8d | | if (*((rsi + 0x1c)) > r8d) { 0x00417d5b ja 0x417d73 | goto label_15; | } | } 0x00417d5d mov rcx, qword [rsi + rdi + 0x20] | rcx = *((rsi + rdi + 0x20)); 0x00417d62 cmp rcx, r9 | | if (rcx == r9) { 0x00417d65 je 0x417d19 | goto label_2; | } 0x00417d67 mov edx, dword [rcx + 0x18] | edx = *((rcx + 0x18)); 0x00417d6a mov rbx, rsi | rbx = rsi; 0x00417d6d cmp edx, ebp | | if (edx <= ebp) { 0x00417d6f jle 0x417d50 | goto label_3; | } 0x00417d71 jmp 0x417d1f | goto label_1; | label_15: 0x00417d73 mov rcx, rsi | rcx = rsi; 0x00417d76 jmp 0x417d1f | goto label_1; | label_12: 0x00417d78 mov r9, qword [r14 + 0x78] | r9 = *((r14 + 0x78)); | label_14: 0x00417d7c mov rbx, qword [rsp] | rbx = *(rsp); 0x00417d80 cmp rbx, r9 | | if (rbx != r9) { 0x00417d83 je 0x417d8f | 0x00417d85 mov rdi, rbx | 0x00417d88 call 0x431950 | BloombergLP::bdlcc::SkipList_Control::incrementRefCount() (rbx); 0x00417d8d jmp 0x417d91 | | } else { 0x00417d8f xor ebx, ebx | ebx = 0; | } 0x00417d91 mov rdi, r12 | rdi = r12; 0x00417d94 call 0x404c60 | pthread_mutex_unlock (); 0x00417d99 test rbx, rbx | | if (rbx == 0) { 0x00417d9c je 0x417e74 | goto label_16; | } 0x00417da2 test r13, r13 | | if (r13 == 0) { 0x00417da5 je 0x417c8a | goto label_4; | } 0x00417dab mov rdi, r13 | 0x00417dae call 0x431920 | eax = BloombergLP::bdlcc::SkipList_Control::decrementRefCount() (r13); 0x00417db3 test eax, eax | | if (eax != 0) { 0x00417db5 jne 0x417c8a | goto label_4; | } 0x00417dbb mov rdi, qword [r13 + 0x10] | rdi = *((r13 + 0x10)); 0x00417dbf test rdi, rdi | | if (rdi != 0) { 0x00417dc2 je 0x417dc9 | 0x00417dc4 call 0x4326f0 | BloombergLP::bslma::SharedPtrRep::releaseRef() (rdi); | } 0x00417dc9 mov rdi, qword [r14 + 0xb0] | 0x00417dd0 mov rsi, r13 | 0x00417dd3 call 0x431f00 | BloombergLP::bdlcc::SkipList_PoolUtil::deallocate(BloombergLP::bdlcc::SkipList_PoolManager*,void*) (*((r14 + 0xb0)), r13); 0x00417dd8 jmp 0x417c8a | goto label_4; | label_8: 0x00417ddd mov rdi, r12 | rdi = r12; 0x00417de0 call 0x404c60 | pthread_mutex_unlock (); | do { | label_5: 0x00417de5 mov rax, qword [r14 + 0x10] | rax = *((r14 + 0x10)); 0x00417de9 test eax, eax | | if (eax != 0) { 0x00417deb je 0x417e36 | 0x00417ded mov rax, 0xffffffffffffffff | rax = 0xffffffffffffffff; 0x00417df4 lock xadd qword [r14 + 0x10], rax | __asm ("lock xadd qword [r14 + 0x10], rax"); 0x00417dfa dec rax | rax--; 0x00417dfd movabs rcx, 0x10000000ffffffff | rcx = 0x10000000ffffffff; 0x00417e07 and rcx, rax | rcx &= rax; 0x00417e0a movabs rax, 0x1000000000000000 | rax = 0x1000000000000000; 0x00417e14 cmp rcx, rax | | if (rcx != rax) { 0x00417e17 jne 0x417e62 | goto label_17; | } 0x00417e19 add r14, 0x40 | r14 += 0x40; 0x00417e1d mov rdi, r14 | rdi = r14; 0x00417e20 add rsp, 0x108 | 0x00417e27 pop rbx | 0x00417e28 pop r12 | 0x00417e2a pop r13 | 0x00417e2c pop r14 | 0x00417e2e pop r15 | 0x00417e30 pop rbp | 0x00417e31 jmp 0x404a00 | void (*0x404a00)() (); | } 0x00417e36 movabs rax, 0xf000000000000000 | rax = 0xf000000000000000; 0x00417e40 lock add qword [r14 + 0x10], rax | *((r14 + 0x10)) += rax; 0x00417e45 add r14, 0x18 | r14 += 0x18; 0x00417e49 mov rdi, r14 | rdi = r14; 0x00417e4c add rsp, 0x108 | 0x00417e53 pop rbx | 0x00417e54 pop r12 | 0x00417e56 pop r13 | 0x00417e58 pop r14 | 0x00417e5a pop r15 | 0x00417e5c pop rbp | 0x00417e5d jmp 0x404c60 | void (*0x404c60)() (); | label_17: 0x00417e62 add rsp, 0x108 | 0x00417e69 pop rbx | 0x00417e6a pop r12 | 0x00417e6c pop r13 | 0x00417e6e pop r14 | 0x00417e70 pop r15 | 0x00417e72 pop rbp | 0x00417e73 ret | return rax; | label_16: 0x00417e74 test r13, r13 | 0x00417e77 je 0x417de5 | | } while (r13 == 0); 0x00417e7d mov rdi, r13 | 0x00417e80 call 0x431920 | eax = BloombergLP::bdlcc::SkipList_Control::decrementRefCount() (r13); 0x00417e85 test eax, eax | | if (eax != 0) { 0x00417e87 jne 0x417de5 | goto label_5; | } 0x00417e8d mov rdi, qword [r13 + 0x10] | rdi = *((r13 + 0x10)); 0x00417e91 test rdi, rdi | | if (rdi != 0) { 0x00417e94 je 0x417e9b | 0x00417e96 call 0x4326f0 | BloombergLP::bslma::SharedPtrRep::releaseRef() (rdi); | } 0x00417e9b mov rdi, qword [r14 + 0xb0] | 0x00417ea2 mov rsi, r13 | 0x00417ea5 call 0x431f00 | BloombergLP::bdlcc::SkipList_PoolUtil::deallocate(BloombergLP::bdlcc::SkipList_PoolManager*,void*) (*((r14 + 0xb0)), r13); 0x00417eaa jmp 0x417de5 | goto label_5; | label_10: 0x00417eaf mov edi, 8 | edi = 8; 0x00417eb4 call 0x4046d0 | cxa_allocate_exception (); 0x00417eb9 mov qword [rax], 0x442a58 | *(rax) = sym.imp.std::exception::exception__; 0x00417ec0 mov esi, 0x442a30 | 0x00417ec5 mov edx, 0x404a50 | 0x00417eca mov rdi, rax | 0x00417ecd call 0x4047b0 | return cxa_throw (rax, obj.typeinfo_for_std::__1::bad_function_call, sym.imp.std::exception::exception__); | }