// File: romkatv[P]hcproxy/src/event_loop.cc
// Function: hcproxy::EventLoop::Loop()
void EventLoop::Loop() {
  while (true) {
    epoll_.Wait(timeout_);
    for (const epoll_event& ev : epoll_) {
      if (ev.data.ptr != nullptr) {
        static_cast<EventHandler*>(ev.data.ptr)->IncRef();
      }
    }
    for (const epoll_event& ev : epoll_) {
      if (ev.data.ptr == nullptr) {
        PopFunc(pipe_[0]);
      } else {
        auto* eh = static_cast<EventHandler*>(ev.data.ptr);
        if (eh->event_loop_ == this) {
          eh->OnEvent(this, ev.events);
        }
        eh->DecRef();
      }
    }
    while (true) {
      auto* eh = static_cast<EventHandler*>(expire_.head());
      if (!eh || eh->deadline_ > Clock::now()) break;
      CHECK(eh->event_loop_ == this);
      eh->IncRef();
      eh->OnTimeout(this);
      if (eh->event_loop_ == this) Refresh(eh);
      eh->DecRef();
    }
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x100, %rsp            # imm = 0x100
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rsi
movq %rsi, %rax
addq $0x8, %rax
movq %rax, -0xb8(%rbp)
addq $0x48, %rsi
leaq -0x18(%rbp), %rdi
callq 0x343d0
movq -0xb8(%rbp), %rdi
movq -0x18(%rbp), %rsi
movzbl -0x10(%rbp), %edx
callq 0x2c610
movq -0xb0(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rdi
callq 0x34400
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rdi
callq 0x34420
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
je 0x32963
movq -0x28(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpq $0x0, 0x4(%rax)
je 0x32953
movq -0x38(%rbp), %rax
movq 0x4(%rax), %rdi
callq 0x31860
jmp 0x32955
movq -0x28(%rbp), %rax
addq $0xc, %rax
movq %rax, -0x28(%rbp)
jmp 0x32929
movq -0xb0(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rdi
callq 0x34400
movq %rax, -0x48(%rbp)
movq -0x40(%rbp), %rdi
callq 0x34420
movq %rax, -0x50(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x50(%rbp), %rax
je 0x32a05
movq -0x48(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
cmpq $0x0, 0x4(%rax)
jne 0x329b9
movq -0xb0(%rbp), %rax
movl (%rax), %edi
callq 0x33b30
jmp 0x329f5
movq -0xb0(%rbp), %rcx
movq -0x58(%rbp), %rax
movq 0x4(%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
cmpq %rcx, 0x28(%rax)
jne 0x329ec
movq -0xb0(%rbp), %rsi
movq -0x60(%rbp), %rdi
movq -0x58(%rbp), %rax
movl (%rax), %edx
movq (%rdi), %rax
callq *(%rax)
movq -0x60(%rbp), %rdi
callq 0x31940
jmp 0x329f7
movq -0x48(%rbp), %rax
addq $0xc, %rax
movq %rax, -0x48(%rbp)
jmp 0x3298c
jmp 0x32a07
movq -0xb0(%rbp), %rdi
addq $0x38, %rdi
callq 0x34450
movq %rax, -0xc0(%rbp)
cmpq $0x0, %rax
je 0x32a38
movq -0xc0(%rbp), %rax
addq $-0x8, %rax
movq %rax, -0xc8(%rbp)
jmp 0x32a43
xorl %eax, %eax
movq %rax, -0xc8(%rbp)
jmp 0x32a43
movq -0xc8(%rbp), %rax
movq %rax, -0x68(%rbp)
movb $0x1, %al
cmpq $0x0, -0x68(%rbp)
movb %al, -0xc9(%rbp)
je 0x32a8b
movq -0x68(%rbp), %rax
addq $0x20, %rax
movq %rax, -0xd8(%rbp)
callq 0x3ef20
movq -0xd8(%rbp), %rdi
movq %rax, -0x70(%rbp)
leaq -0x70(%rbp), %rsi
callq 0x217c0
movb %al, -0xc9(%rbp)
movb -0xc9(%rbp), %al
testb $0x1, %al
jne 0x32a97
jmp 0x32a9c
jmp 0x32bd8
movq -0xb0(%rbp), %rcx
movq -0x68(%rbp), %rax
movq 0x28(%rax), %rax
movb $0x0, -0x91(%rbp)
cmpq %rcx, %rax
jne 0x32abc
jmp 0x32b4b
leaq 0xb2919(%rip), %rsi     # 0xe53dc
leaq -0x90(%rbp), %rdi
movq %rdi, -0xe8(%rbp)
movl $0x79, %edx
movl $0x3, %ecx
callq 0x194b0
movq -0xe8(%rbp), %rdi
movb $0x1, -0x91(%rbp)
callq 0x194e0
movq %rax, -0xe0(%rbp)
jmp 0x32afc
movq -0xe0(%rbp), %rdi
leaq 0xb2952(%rip), %rsi     # 0xe545c
callq 0x1bfe0
movq %rax, -0xf0(%rbp)
jmp 0x32b18
movq -0xf0(%rbp), %rdi
leaq 0xb6865(%rip), %rsi     # 0xe938b
callq 0x19450
movq %rax, -0xf8(%rbp)
jmp 0x32b34
movq -0xf8(%rbp), %rsi
leaq -0xa5(%rbp), %rdi
callq 0x194f0
jmp 0x32b49
jmp 0x32b4b
testb $0x1, -0x91(%rbp)
jne 0x32b56
jmp 0x32b7f
leaq -0x90(%rbp), %rdi
callq 0x19500
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
testb $0x1, -0x91(%rbp)
jne 0x32bbc
jmp 0x32bc8
movq -0x68(%rbp), %rdi
callq 0x31860
movq -0xb0(%rbp), %rsi
movq -0x68(%rbp), %rdi
movq (%rdi), %rax
callq *0x8(%rax)
movq -0xb0(%rbp), %rcx
movq -0x68(%rbp), %rax
cmpq %rcx, 0x28(%rax)
jne 0x32bca
movq -0xb0(%rbp), %rdi
movq -0x68(%rbp), %rsi
callq 0x33c50
jmp 0x32bca
leaq -0x90(%rbp), %rdi
callq 0x19500
jmp 0x32bdd
movq -0x68(%rbp), %rdi
callq 0x31940
jmp 0x32a07
jmp 0x328ca
movq -0xa0(%rbp), %rdi
callq 0xe1080
nopl (%rax)