// File: shutow[P]shared_mutex/./shared_mutex.h
// Function: gx::shared_mutex::unlock_shared_and_lock()
void unlock_shared_and_lock()
		{
			bool expected = false;
			if (m_exclusive.compare_exchange_weak(expected, true, std::memory_order_acq_rel, std::memory_order_acquire))
			{
				m_counter.fetch_sub(1, std::memory_order_acq_rel);
				while (m_counter.load(std::memory_order_acquire) > 0) delay();
			}
			else // if some thread is claimed m_exclusive already and waits for m_counter == 0
			{
				int64_t num = m_priority_exclusive.fetch_add(1, std::memory_order_acq_rel) + 1;
				while (m_counter.load(std::memory_order_acquire) > num) delay();
			}
		}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xe0, %rsp
movq %rdi, -0x88(%rbp)
movq -0x88(%rbp), %rdi
movq %rdi, -0xa0(%rbp)
movb $0x0, -0x89(%rbp)
addq $0x18, %rdi
leaq -0x89(%rbp), %rsi
movl $0x1, %edx
movl $0x4, %ecx
movl $0x2, %r8d
callq 0x4d50
testb $0x1, %al
jne 0x4a60
jmp 0x4bd1
movq -0xa0(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x38(%rbp)
movq $0x1, -0x40(%rbp)
movl $0x4, -0x44(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0xb0(%rbp)
movl -0x44(%rbp), %eax
movq -0x40(%rbp), %rcx
movq %rcx, -0x50(%rbp)
decl %eax
movl %eax, %ecx
movq %rcx, -0xa8(%rbp)
subl $0x4, %eax
ja 0x4abb
movq -0xa8(%rbp), %rax
leaq 0x758e(%rip), %rcx      # 0xc040
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0xb0(%rbp), %rcx
movq -0x50(%rbp), %rax
negq %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x58(%rbp)
jmp 0x4b36
movq -0xb0(%rbp), %rcx
movq -0x50(%rbp), %rax
negq %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x58(%rbp)
jmp 0x4b36
movq -0xb0(%rbp), %rcx
movq -0x50(%rbp), %rax
negq %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x58(%rbp)
jmp 0x4b36
movq -0xb0(%rbp), %rcx
movq -0x50(%rbp), %rax
negq %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x58(%rbp)
jmp 0x4b36
movq -0xb0(%rbp), %rcx
movq -0x50(%rbp), %rax
negq %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x58(%rbp)
movq -0xa0(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x8(%rbp)
movl $0x2, -0xc(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xc0(%rbp)
movl -0xc(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0x45c0
movl %eax, -0x10(%rbp)
movl -0xc(%rbp), %eax
movl %eax, -0xb4(%rbp)
decl %eax
subl $0x2, %eax
jb 0x4b96
jmp 0x4b79
movl -0xb4(%rbp), %eax
subl $0x5, %eax
je 0x4ba6
jmp 0x4b86
movq -0xc0(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0x4bb4
movq -0xc0(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0x4bb4
movq -0xc0(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jle 0x4bcc
movq -0xa0(%rbp), %rdi
callq 0x4570
jmp 0x4b36
jmp 0x4d45
movq -0xa0(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x60(%rbp)
movq $0x1, -0x68(%rbp)
movl $0x4, -0x6c(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0xd0(%rbp)
movl -0x6c(%rbp), %eax
movq -0x68(%rbp), %rcx
movq %rcx, -0x78(%rbp)
decl %eax
movl %eax, %ecx
movq %rcx, -0xc8(%rbp)
subl $0x4, %eax
ja 0x4c2c
movq -0xc8(%rbp), %rax
leaq 0x7409(%rip), %rcx      # 0xc02c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0xd0(%rbp), %rcx
movq -0x78(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x80(%rbp)
jmp 0x4c98
movq -0xd0(%rbp), %rcx
movq -0x78(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x80(%rbp)
jmp 0x4c98
movq -0xd0(%rbp), %rcx
movq -0x78(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x80(%rbp)
jmp 0x4c98
movq -0xd0(%rbp), %rcx
movq -0x78(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x80(%rbp)
jmp 0x4c98
movq -0xd0(%rbp), %rcx
movq -0x78(%rbp), %rax
lock
xaddq %rax, (%rcx)
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x98(%rbp)
movq -0xa0(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x20(%rbp)
movl $0x2, -0x24(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0xe0(%rbp)
movl -0x24(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0x45c0
movl %eax, -0x28(%rbp)
movl -0x24(%rbp), %eax
movl %eax, -0xd4(%rbp)
decl %eax
subl $0x2, %eax
jb 0x4d07
jmp 0x4cea
movl -0xd4(%rbp), %eax
subl $0x5, %eax
je 0x4d17
jmp 0x4cf7
movq -0xe0(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x4d25
movq -0xe0(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x4d25
movq -0xe0(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x98(%rbp), %rax
jle 0x4d43
movq -0xa0(%rbp), %rdi
callq 0x4570
jmp 0x4ca7
jmp 0x4d45
addq $0xe0, %rsp
popq %rbp
retq
nop