// File: Barath-Kannan[P]SignalsAndSlots/src/details/SharedMutex.cpp
// Function: BSignals::details::SharedMutex::lock_shared()
void SharedMutex::lock_shared(){
    m_readers.fetch_add(1, std::memory_order_release);
    if (m_writers.load(std::memory_order_acquire)){
        m_readers.fetch_sub(1, std::memory_order_release);
        while (m_writers.load(std::memory_order_acquire)){
            std::this_thread::yield();
        }
        m_readers.fetch_add(1, std::memory_order_release);
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x110, %rsp            # imm = 0x110
movq %rdi, -0xb0(%rbp)
movq -0xb0(%rbp), %rax
movq %rax, -0xc8(%rbp)
addq $0x58, %rax
movq %rax, -0x60(%rbp)
movq $0x1, -0x68(%rbp)
movl $0x3, -0x6c(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0xc0(%rbp)
movl -0x6c(%rbp), %eax
movq -0x68(%rbp), %rcx
movq %rcx, -0x78(%rbp)
decl %eax
movl %eax, %ecx
movq %rcx, -0xb8(%rbp)
subl $0x4, %eax
ja 0xc304
movq -0xb8(%rbp), %rax
leaq 0x7d45(%rip), %rcx      # 0x14040
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0xc0(%rbp), %rcx
movq -0x78(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x80(%rbp)
jmp 0xc370
movq -0xc0(%rbp), %rcx
movq -0x78(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x80(%rbp)
jmp 0xc370
movq -0xc0(%rbp), %rcx
movq -0x78(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x80(%rbp)
jmp 0xc370
movq -0xc0(%rbp), %rcx
movq -0x78(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x80(%rbp)
jmp 0xc370
movq -0xc0(%rbp), %rcx
movq -0x78(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x80(%rbp)
movq -0xc8(%rbp), %rax
addq $0x60, %rax
movq %rax, -0x8(%rbp)
movl $0x2, -0xc(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xd8(%rbp)
movl -0xc(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0xa060
movl %eax, -0x10(%rbp)
movl -0xc(%rbp), %eax
movl %eax, -0xcc(%rbp)
decl %eax
subl $0x2, %eax
jb 0xc3d0
jmp 0xc3b3
movl -0xcc(%rbp), %eax
subl $0x5, %eax
je 0xc3e0
jmp 0xc3c0
movq -0xd8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0xc3ee
movq -0xd8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0xc3ee
movq -0xd8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
je 0xc658
movq -0xc8(%rbp), %rax
addq $0x58, %rax
movq %rax, -0x38(%rbp)
movq $0x1, -0x40(%rbp)
movl $0x3, -0x44(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0xe8(%rbp)
movl -0x44(%rbp), %eax
movq -0x40(%rbp), %rcx
movq %rcx, -0x50(%rbp)
decl %eax
movl %eax, %ecx
movq %rcx, -0xe0(%rbp)
subl $0x4, %eax
ja 0xc454
movq -0xe0(%rbp), %rax
leaq 0x7c09(%rip), %rcx      # 0x14054
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0xe8(%rbp), %rcx
movq -0x50(%rbp), %rax
negq %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x58(%rbp)
jmp 0xc4cf
movq -0xe8(%rbp), %rcx
movq -0x50(%rbp), %rax
negq %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x58(%rbp)
jmp 0xc4cf
movq -0xe8(%rbp), %rcx
movq -0x50(%rbp), %rax
negq %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x58(%rbp)
jmp 0xc4cf
movq -0xe8(%rbp), %rcx
movq -0x50(%rbp), %rax
negq %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x58(%rbp)
jmp 0xc4cf
movq -0xe8(%rbp), %rcx
movq -0x50(%rbp), %rax
negq %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x58(%rbp)
movq -0xc8(%rbp), %rax
addq $0x60, %rax
movq %rax, -0x20(%rbp)
movl $0x2, -0x24(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0xf8(%rbp)
movl -0x24(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0xa060
movl %eax, -0x28(%rbp)
movl -0x24(%rbp), %eax
movl %eax, -0xec(%rbp)
decl %eax
subl $0x2, %eax
jb 0xc52f
jmp 0xc512
movl -0xec(%rbp), %eax
subl $0x5, %eax
je 0xc53f
jmp 0xc51f
movq -0xf8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0xc54d
movq -0xf8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0xc54d
movq -0xf8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0xc55e
callq 0xa0f0
jmp 0xc4cf
movq -0xc8(%rbp), %rax
addq $0x58, %rax
movq %rax, -0x88(%rbp)
movq $0x1, -0x90(%rbp)
movl $0x3, -0x94(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x108(%rbp)
movl -0x94(%rbp), %eax
movq -0x90(%rbp), %rcx
movq %rcx, -0xa0(%rbp)
decl %eax
movl %eax, %ecx
movq %rcx, -0x100(%rbp)
subl $0x4, %eax
ja 0xc5ce
movq -0x100(%rbp), %rax
leaq 0x7aa3(%rip), %rcx      # 0x14068
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x108(%rbp), %rcx
movq -0xa0(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0xa8(%rbp)
jmp 0xc658
movq -0x108(%rbp), %rcx
movq -0xa0(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0xa8(%rbp)
jmp 0xc658
movq -0x108(%rbp), %rcx
movq -0xa0(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0xa8(%rbp)
jmp 0xc658
movq -0x108(%rbp), %rcx
movq -0xa0(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0xa8(%rbp)
jmp 0xc658
movq -0x108(%rbp), %rcx
movq -0xa0(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0xa8(%rbp)
addq $0x110, %rsp            # imm = 0x110
popq %rbp
retq
nopw %cs:(%rax,%rax)