// File: romkatv[P]hcproxy/src/thread_pool.cc
// Function: hcproxy::ThreadPool::Loop(unsigned long)::$_0::operator()() const
void ThreadPool::Loop(size_t tid) {
  auto Next = [&]() -> std::function<void()> {
    std::unique_lock<std::mutex> lock(mutex_);
    while (true) {
      if (exit_) return nullptr;
      if (work_.empty()) {
        cv_.wait(lock);
        continue;
      }
      Time now = Clock::now();
      const Work& top = work_.top();
      if (top.t <= now) {
        std::function<void()> res = std::move(top.f);
        work_.pop();
        bool notify = !work_.empty() && !have_sleeper_;
        lock.unlock();
        if (notify) cv_.notify_one();
        return res;
      }
      if (have_sleeper_) {
        cv_.wait(lock);
        continue;
      }
      have_sleeper_ = true;
      sleeper_cv_.wait_until(lock, top.t);
      CHECK(have_sleeper_);
      have_sleeper_ = false;
    }
  };
  while (std::function<void()> f = Next()) f();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc0, %rsp
movq %rdi, -0x90(%rbp)
movq %rdi, %rax
movq %rax, -0x88(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rsi
movq %rsi, -0x80(%rbp)
addq $0x10, %rsi
leaq -0x20(%rbp), %rdi
callq 0x21420
jmp 0x255ae
movq -0x80(%rbp), %rax
testb $0x1, 0x8(%rax)
je 0x255d4
movq -0x90(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x265e0
movl $0x1, -0x24(%rbp)
jmp 0x25844
movq -0x80(%rbp), %rdi
addq $0x98, %rdi
callq 0x26620
movb %al, -0x91(%rbp)
jmp 0x255ec
movb -0x91(%rbp), %al
testb $0x1, %al
jne 0x255f8
jmp 0x2561c
movq -0x80(%rbp), %rdi
addq $0x38, %rdi
leaq -0x20(%rbp), %rsi
callq 0x42190
jmp 0x255ac
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x2585d
callq 0x3ef20
movq -0x80(%rbp), %rdi
movq %rax, -0x40(%rbp)
addq $0x98, %rdi
callq 0x26230
movq %rax, -0xa0(%rbp)
jmp 0x2563e
movq -0xa0(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x21960
movb %al, -0xa1(%rbp)
jmp 0x2565e
movb -0xa1(%rbp), %al
testb $0x1, %al
jne 0x2566d
jmp 0x2573d
movq -0x90(%rbp), %rdi
movb $0x0, -0x49(%rbp)
movq -0x48(%rbp), %rsi
addq $0x10, %rsi
callq 0x26180
movq -0x80(%rbp), %rdi
addq $0x98, %rdi
callq 0x26640
jmp 0x25697
movq -0x80(%rbp), %rdi
addq $0x98, %rdi
callq 0x26620
movb %al, -0xa2(%rbp)
jmp 0x256af
movb -0xa2(%rbp), %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0xa3(%rbp)
jne 0x256d3
jmp 0x256c4
movq -0x80(%rbp), %rax
movb 0x9(%rax), %al
xorb $-0x1, %al
movb %al, -0xa3(%rbp)
movb -0xa3(%rbp), %al
andb $0x1, %al
movb %al, -0x4a(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x216e0
jmp 0x256e9
testb $0x1, -0x4a(%rbp)
je 0x2571b
movq -0x80(%rbp), %rdi
addq $0x38, %rdi
callq 0x421b0
jmp 0x2571b
movq -0x90(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
callq 0x1af20
jmp 0x2585d
movb $0x1, -0x49(%rbp)
movl $0x1, -0x24(%rbp)
testb $0x1, -0x49(%rbp)
jne 0x25738
movq -0x90(%rbp), %rdi
callq 0x1af20
jmp 0x25844
movq -0x80(%rbp), %rax
testb $0x1, 0x9(%rax)
je 0x2575d
movq -0x80(%rbp), %rdi
addq $0x38, %rdi
leaq -0x20(%rbp), %rsi
callq 0x42190
jmp 0x255ac
movq -0x80(%rbp), %rdi
movb $0x1, 0x9(%rdi)
addq $0x68, %rdi
movq -0x48(%rbp), %rdx
leaq -0x20(%rbp), %rsi
callq 0x26690
jmp 0x25778
movq -0x80(%rbp), %rax
movb 0x9(%rax), %al
movb $0x0, -0x71(%rbp)
testb $0x1, %al
je 0x25789
jmp 0x25807
leaq 0xbf317(%rip), %rsi     # 0xe4aa7
leaq -0x70(%rbp), %rdi
movl $0x4b, %edx
movl $0x3, %ecx
callq 0x194b0
jmp 0x257a5
movb $0x1, -0x71(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x194e0
movq %rax, -0xb0(%rbp)
jmp 0x257bb
movq -0xb0(%rbp), %rdi
leaq 0xbf2f1(%rip), %rsi     # 0xe4aba
callq 0x19590
movq %rax, -0xb8(%rbp)
jmp 0x257d7
movq -0xb8(%rbp), %rdi
leaq 0xc3ba6(%rip), %rsi     # 0xe938b
callq 0x19450
movq %rax, -0xc0(%rbp)
jmp 0x257f3
movq -0xc0(%rbp), %rsi
leaq -0x72(%rbp), %rdi
callq 0x194f0
jmp 0x25805
jmp 0x25807
testb $0x1, -0x71(%rbp)
jne 0x2580f
jmp 0x2582c
leaq -0x70(%rbp), %rdi
callq 0x19500
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
testb $0x1, -0x71(%rbp)
jne 0x25839
jmp 0x25842
movq -0x80(%rbp), %rax
movb $0x0, 0x9(%rax)
jmp 0x255ac
leaq -0x70(%rbp), %rdi
callq 0x19500
jmp 0x2585d
leaq -0x20(%rbp), %rdi
callq 0x21920
movq -0x88(%rbp), %rax
addq $0xc0, %rsp
popq %rbp
retq
leaq -0x20(%rbp), %rdi
callq 0x21920
movq -0x30(%rbp), %rdi
callq 0xe1080
nop