; assembly | /* r2dec pseudo code output */ | /* bdlmt_multiprioritythreadpool.t/none @ 0x40dee0 */ | #include | ; (fcn) method.BloombergLP::bdlmt::MultipriorityThreadPool.startThreads__ () | int64_t method_BloombergLP::bdlmt::MultipriorityThreadPool_startThreads_ (int64_t arg1) { | int64_t var_8h; | int64_t var_10h; | int64_t var_18h; | int64_t var_20h; | uint32_t var_40h; | int64_t var_48h; | int64_t var_50h; | int64_t var_68h; | int64_t var_e8h; | rdi = arg1; | /* BloombergLP::bdlmt::MultipriorityThreadPool::startThreads() */ 0x0040dee0 push rbp | 0x0040dee1 push r15 | 0x0040dee3 push r14 | 0x0040dee5 push r13 | 0x0040dee7 push r12 | 0x0040dee9 push rbx | 0x0040deea sub rsp, 0x168 | 0x0040def1 mov r13, rdi | r13 = rdi; 0x0040def4 lea r12, [rdi + 0x28] | r12 = rdi + 0x28; 0x0040def8 mov rdi, r12 | rdi = r12; 0x0040defb call 0x4044e0 | pthread_mutex_lock (); 0x0040df00 mov eax, dword [r13 + 0x204] | eax = *((r13 + 0x204)); 0x0040df07 xor ebp, ebp | ebp = 0; 0x0040df09 cmp eax, 1 | | if (eax == 1) { 0x0040df0c je 0x40e172 | goto label_0; | } 0x0040df12 lea r15, [rsp + 0x68] | r15 = rsp + 0x68; 0x0040df17 mov rdi, r15 | rdi = r15; 0x0040df1a call 0x403f40 | sigfillset (); 0x0040df1f mov rdi, r15 | rdi = r15; 0x0040df22 mov esi, 7 | esi = 7; 0x0040df27 call 0x4044f0 | sigdelset (); 0x0040df2c mov rdi, r15 | rdi = r15; 0x0040df2f mov esi, 8 | esi = 8; 0x0040df34 call 0x4044f0 | sigdelset (); 0x0040df39 mov rdi, r15 | rdi = r15; 0x0040df3c mov esi, 4 | esi = 4; 0x0040df41 call 0x4044f0 | sigdelset (); 0x0040df46 mov rdi, r15 | rdi = r15; 0x0040df49 mov esi, 0xb | esi = 0xb; 0x0040df4e call 0x4044f0 | sigdelset (); 0x0040df53 mov rdi, r15 | rdi = r15; 0x0040df56 mov esi, 0x1f | esi = 0x1f; 0x0040df5b call 0x4044f0 | sigdelset (); 0x0040df60 mov rdi, r15 | rdi = r15; 0x0040df63 mov esi, 6 | esi = 6; 0x0040df68 call 0x4044f0 | sigdelset (); 0x0040df6d mov rdi, r15 | rdi = r15; 0x0040df70 mov esi, 5 | esi = 5; 0x0040df75 call 0x4044f0 | sigdelset (); 0x0040df7a mov rdi, r15 | rdi = r15; 0x0040df7d mov esi, 6 | esi = 6; 0x0040df82 call 0x4044f0 | sigdelset (); 0x0040df87 lea rdx, [rsp + 0xe8] | rdx = rsp + 0xe8; 0x0040df8f xor edi, edi | edi = 0; 0x0040df91 mov rsi, r15 | rsi = r15; 0x0040df94 call 0x4044a0 | pthread_sigmask (); 0x0040df99 mov rax, qword [rip + 0x24a9e0] | rax = BloombergLP::bslma::Default::s_defaultAllocator; 0x0040dfa0 test rax, rax | | if (rax == 0) { 0x0040dfa3 jne 0x40dfaa | 0x0040dfa5 call 0x40fc40 | BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); | } 0x0040dfaa mov rax, qword [rip + 0x24a9cf] | rax = BloombergLP::bslma::Default::s_defaultAllocator; 0x0040dfb1 test rax, rax | | if (rax == 0) { 0x0040dfb4 jne 0x40dfbb | 0x0040dfb6 call 0x40fc40 | rax = BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); | } 0x0040dfbb mov qword [rsp + 0x40], rax | *((rsp + 0x40)) = rax; 0x0040dfc0 xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x0040dfc3 movups xmmword [rsp + 0x48], xmm0 | __asm ("movups xmmword [rsp + 0x48], xmm0"); 0x0040dfc8 lea rdi, [rsp + 0x10] | 0x0040dfcd mov esi, 0x18 | 0x0040dfd2 call 0x412450 | BloombergLP::bslstl::Function_Rep::allocateBuf(unsigned long) (rsp + 0x10, 0x18); 0x0040dfd7 mov qword [rsp + 0x48], 0x40f080 | *((rsp + 0x48)) = method.BloombergLP::bslstl::Function_Rep::ManagerRet_BloombergLP::bslstl::Function_Rep::functionManager_BloombergLP::bdlf.MemFnInstance_void__BloombergLP::bdlmt::MultipriorityThreadPool::_____BloombergLP::bdlmt::MultipriorityThreadPool___true__Bloomber; 0x0040dfe0 mov qword [rsp + 0x10], 0x40d850 | *((rsp + 0x10)) = method.BloombergLP::bdlmt::MultipriorityThreadPool.worker__; 0x0040dfe9 mov qword [rsp + 0x18], 0 | *((rsp + 0x18)) = 0; 0x0040dff2 cmp qword [rsp + 0x40], 0 | | if (*((rsp + 0x40)) == 0) { 0x0040dff8 jne 0x40e00b | 0x0040dffa mov rax, qword [rip + 0x24a97f] | rax = BloombergLP::bslma::Default::s_defaultAllocator; 0x0040e001 test rax, rax | | if (rax != 0) { 0x0040e004 jne 0x40e00b | goto label_1; | } 0x0040e006 call 0x40fc40 | BloombergLP::bslma::Default::determineAndReturnDefaultAllocator() (); | } | label_1: 0x0040e00b mov qword [rsp + 0x20], r13 | *((rsp + 0x20)) = r13; 0x0040e010 mov qword [rsp + 0x50], 0x40f060 | *((rsp + 0x50)) = method.BloombergLP::bslstl.Function_InvokerUtil_Dispatch_4__void_____BloombergLP::bdlf::MemFnInstance_void__BloombergLP::bdlmt::MultipriorityThreadPool::_____BloombergLP::bdlmt::MultipriorityThreadPool___::invoke_BloombergLP::bslstl::Function_Rep_const; 0x0040e019 mov rdi, r13 | rdi = r13; 0x0040e01c call 0x4044e0 | eax = pthread_mutex_lock (); 0x0040e021 xor eax, eax | eax = 0; 0x0040e023 xchg dword [r13 + 0x204], eax | tmp_0 = r13 + 0x204; | r13 + 0x204 = eax; | eax = tmp_0; 0x0040e02a xor ebx, ebx | ebx = 0; 0x0040e02c mov eax, dword [r13 + 0x208] | eax = *((r13 + 0x208)); 0x0040e033 cmp eax, 1 | | if (eax == 1) { 0x0040e036 jne 0x40e041 | 0x0040e038 xor eax, eax | eax = 0; 0x0040e03a xchg dword [r13 + 0x208], eax | tmp_1 = r13 + 0x208; | r13 + 0x208 = eax; | eax = tmp_1; | } 0x0040e041 lea r15, [r13 + 0x1b0] | r15 = r13 + 0x1b0; 0x0040e048 mov r14d, dword [r13 + 0x200] | r14d = *((r13 + 0x200)); 0x0040e04f test r14d, r14d | | if (r14d <= 0) { 0x0040e052 jle 0x40e098 | goto label_2; | } 0x0040e054 mov qword [rsp + 8], r12 | *((rsp + 8)) = r12; 0x0040e059 lea rbp, [r13 + 0x168] | rbp = r13 + 0x168; 0x0040e060 xor ebx, ebx | ebx = 0; 0x0040e062 lea r12, [rsp + 0x10] | r12 = rsp + 0x10; 0x0040e067 nop word [rax + rax] | | do { 0x0040e070 mov rdi, r15 | 0x0040e073 mov rsi, r12 | 0x0040e076 mov rdx, rbp | 0x0040e079 call 0x40f100 | eax = intBloombergLP::bslmt::ThreadGroup::addThread>(bsl::functionconst&,BloombergLP::bslmt::ThreadAttributesconst&) (r15, r12, rbp); 0x0040e07e test eax, eax | | if (eax != 0) { 0x0040e080 jne 0x40e08c | goto label_3; | } 0x0040e082 inc ebx | ebx++; 0x0040e084 cmp r14d, ebx | 0x0040e087 jne 0x40e070 | | } while (r14d != ebx); 0x0040e089 mov ebx, r14d | ebx = r14d; | label_3: 0x0040e08c mov r14d, dword [r13 + 0x200] | r14d = *((r13 + 0x200)); 0x0040e093 mov r12, qword [rsp + 8] | r12 = *((rsp + 8)); | label_2: 0x0040e098 cmp r14d, ebx | | if (r14d != ebx) { 0x0040e09b jne 0x40e0c8 | goto label_4; | } 0x0040e09d mov eax, dword [r13 + 0x208] | eax = *((r13 + 0x208)); 0x0040e0a4 test eax, eax | | if (eax == 0) { 0x0040e0a6 je 0x40e122 | goto label_5; | } 0x0040e0a8 lea rbp, [r13 + 0x218] | rbp = r13 + 0x218; 0x0040e0af nop | | do { 0x0040e0b0 mov rdi, rbp | rdi = rbp; 0x0040e0b3 mov rsi, r13 | rsi = r13; 0x0040e0b6 call 0x4043a0 | pthread_cond_wait (); 0x0040e0bb mov eax, dword [r13 + 0x204] | eax = *((r13 + 0x204)); 0x0040e0c2 test eax, eax | 0x0040e0c4 je 0x40e0b0 | | } while (eax == 0); 0x0040e0c6 jmp 0x40e147 | goto label_6; | label_4: 0x0040e0c8 mov eax, 2 | eax = 2; 0x0040e0cd xchg dword [r13 + 0x204], eax | tmp_2 = r13 + 0x204; | r13 + 0x204 = eax; | eax = tmp_2; 0x0040e0d4 lea rdi, [r13 + 0x218] | rdi = r13 + 0x218; 0x0040e0db call 0x404590 | pthread_cond_broadcast (); 0x0040e0e0 mov rdi, r13 | rdi = r13; 0x0040e0e3 call 0x4045e0 | pthread_mutex_unlock (); 0x0040e0e8 mov rdi, r15 | 0x0040e0eb call 0x4119f0 | BloombergLP::bslmt::ThreadGroup::joinAll() (r15); 0x0040e0f0 mov rdi, r13 | rdi = r13; 0x0040e0f3 call 0x4044e0 | pthread_mutex_lock (); 0x0040e0f8 mov eax, dword [r13 + 0x208] | eax = *((r13 + 0x208)); 0x0040e0ff test eax, eax | | if (eax == 0) { 0x0040e101 jne 0x40e10f | 0x0040e103 mov eax, 1 | eax = 1; 0x0040e108 xchg dword [r13 + 0x208], eax | tmp_3 = r13 + 0x208; | r13 + 0x208 = eax; | eax = tmp_3; | } 0x0040e10f mov eax, 3 | eax = 3; 0x0040e114 xchg dword [r13 + 0x204], eax | tmp_4 = r13 + 0x204; | r13 + 0x204 = eax; | eax = tmp_4; 0x0040e11b mov ebp, 0xffffffff | 0x0040e120 jmp 0x40e149 | goto label_7; | label_5: 0x0040e122 lea rbp, [r13 + 0x250] | rbp = r13 + 0x250; 0x0040e129 nop dword [rax] | | do { 0x0040e130 mov rdi, rbp | rdi = rbp; 0x0040e133 mov rsi, r13 | rsi = r13; 0x0040e136 call 0x4043a0 | pthread_cond_wait (); 0x0040e13b mov eax, dword [r13 + 0x208] | eax = *((r13 + 0x208)); 0x0040e142 cmp eax, 1 | 0x0040e145 jne 0x40e130 | | } while (eax != 1); | label_6: 0x0040e147 xor ebp, ebp | ebp = 0; | label_7: 0x0040e149 mov rdi, r13 | rdi = r13; 0x0040e14c call 0x4045e0 | pthread_mutex_unlock (); 0x0040e151 lea rsi, [rsp + 0xe8] | rsi = rsp + 0xe8; 0x0040e159 lea rdx, [rsp + 0x68] | rdx = rsp + 0x68; 0x0040e15e mov edi, 2 | edi = 2; 0x0040e163 call 0x4044a0 | pthread_sigmask (); 0x0040e168 lea rdi, [rsp + 0x10] | 0x0040e16d call 0x4123f0 | BloombergLP::bslstl::Function_Rep::~Function_Rep() (rsp + 0x10); | label_0: 0x0040e172 mov rdi, r12 | rdi = r12; 0x0040e175 call 0x4045e0 | pthread_mutex_unlock (); 0x0040e17a mov eax, ebp | eax = ebp; 0x0040e17c add rsp, 0x168 | 0x0040e183 pop rbx | 0x0040e184 pop r12 | 0x0040e186 pop r13 | 0x0040e188 pop r14 | 0x0040e18a pop r15 | 0x0040e18c pop rbp | 0x0040e18d ret | return rax; | }