// File: white0dew[P]WebServer/webserver.cpp
// Function: WebServer::eventLoop()
void WebServer::eventLoop()
{
    bool timeout = false;
    bool stop_server = false;

    while (!stop_server)
    {
        //等待所监控文件描述符上有事件的产生
        int number = epoll_wait(m_epollfd, events, MAX_EVENT_NUMBER, -1);
        //EINTR错误的产生：当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时，该系统调用可能返回一个EINTR错误。
        //例如：在socket服务器端，设置了信号捕获机制，有子进程，
        //当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时，内核会致使accept返回一个EINTR错误(被中断的系统调用)。
        //在epoll_wait时，因为设置了alarm定时触发警告，导致每次返回-1，errno为EINTR，对于这种错误返回
        //忽略这种错误，让epoll报错误号为4时，再次做一次epoll_wait
        if (number < 0 && errno != EINTR)
        {
            LOG_ERROR("%s", "epoll failure");
            break;
        }
        //对所有就绪事件进行处理
        for (int i = 0; i < number; i++)
        {
            int sockfd = events[i].data.fd;
            //处理新到的客户连接
            if (sockfd == m_listenfd)
            {
                bool flag = dealclinetdata();
                if (false == flag)
                    continue;
            }
            //处理异常事件
            else if (events[i].events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR))
            {
                //服务器端关闭连接，移除对应的定时器
                util_timer *timer = users_timer[sockfd].timer;
                deal_timer(timer, sockfd);
            }
            //处理定时器信号
            else if ((sockfd == m_pipefd[0]) && (events[i].events & EPOLLIN))
            {
                //接收到SIGALRM信号，timeout设置为True
                bool flag = dealwithsignal(timeout, stop_server);
                if (false == flag)
                    LOG_ERROR("%s", "dealclientdata failure");
            }
            //处理客户连接上接收到的数据
            else if (events[i].events & EPOLLIN)
            {
                dealwithread(sockfd);
            }
            //处理客户连接上send的数据
            else if (events[i].events & EPOLLOUT)
            {
                dealwithwrite(sockfd);
            }
        }

        //处理定时器为非必须事件，收到信号并不是立马处理
        //完成读写事件后，再进行处理
        if (timeout)
        {
            utils.timer_handler();
            LOG_INFO("%s", "timer tick");
            timeout = false;
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x38(%rbp)
movb $0x0, -0x9(%rbp)
movb $0x0, -0xa(%rbp)
movb -0xa(%rbp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0xc4da
jmp 0xc755
movq -0x38(%rbp), %rsi
movl 0x24(%rsi), %edi
addq $0xac, %rsi
movl $0x2710, %edx           # imm = 0x2710
movl $0xffffffff, %ecx       # imm = 0xFFFFFFFF
callq 0x31f0
movl %eax, -0x10(%rbp)
cmpl $0x0, -0x10(%rbp)
jge 0xc549
callq 0x3060
cmpl $0x4, (%rax)
je 0xc549
movq -0x38(%rbp), %rcx
xorl %eax, %eax
cmpl 0x14(%rcx), %eax
jne 0xc544
callq 0x6d70
movq %rax, %rdi
movl $0x3, %esi
leaq 0x1d77(%rip), %rdx      # 0xe2a0
leaq 0x202a(%rip), %rcx      # 0xe55a
movb $0x0, %al
callq 0x9280
callq 0x6d70
movq %rax, %rdi
callq 0x97f0
jmp 0xc755
movl $0x0, -0x14(%rbp)
movl -0x14(%rbp), %eax
cmpl -0x10(%rbp), %eax
jge 0xc6fc
movq -0x38(%rbp), %rcx
movq %rcx, %rax
addq $0xac, %rax
movslq -0x14(%rbp), %rdx
imulq $0xc, %rdx, %rdx
addq %rdx, %rax
movl 0x4(%rax), %eax
movl %eax, -0x18(%rbp)
movl -0x18(%rbp), %eax
cmpl 0x1d56c(%rcx), %eax
jne 0xc5ab
movq -0x38(%rbp), %rdi
callq 0xbde0
andb $0x1, %al
movb %al, -0x19(%rbp)
movb -0x19(%rbp), %al
andb $0x1, %al
movzbl %al, %ecx
xorl %eax, %eax
cmpl %ecx, %eax
jne 0xc5a6
jmp 0xc6ee
jmp 0xc6ec
movq -0x38(%rbp), %rax
addq $0xac, %rax
movslq -0x14(%rbp), %rcx
imulq $0xc, %rcx, %rcx
addq %rcx, %rax
movl (%rax), %eax
andl $0x2018, %eax           # imm = 0x2018
cmpl $0x0, %eax
je 0xc5fb
movq -0x38(%rbp), %rdi
movq 0x1d580(%rdi), %rax
movslq -0x18(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movq 0x18(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rsi
movl -0x18(%rbp), %edx
callq 0xbd30
jmp 0xc6ea
movq -0x38(%rbp), %rcx
movl -0x18(%rbp), %eax
cmpl 0x1c(%rcx), %eax
jne 0xc68c
movq -0x38(%rbp), %rax
addq $0xac, %rax
movslq -0x14(%rbp), %rcx
imulq $0xc, %rcx, %rcx
addq %rcx, %rax
movl (%rax), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0xc68c
movq -0x38(%rbp), %rdi
leaq -0x9(%rbp), %rsi
leaq -0xa(%rbp), %rdx
callq 0xc020
andb $0x1, %al
movb %al, -0x29(%rbp)
movb -0x29(%rbp), %al
andb $0x1, %al
movzbl %al, %ecx
xorl %eax, %eax
cmpl %ecx, %eax
jne 0xc68a
movq -0x38(%rbp), %rcx
xorl %eax, %eax
cmpl 0x14(%rcx), %eax
jne 0xc688
callq 0x6d70
movq %rax, %rdi
movl $0x3, %esi
leaq 0x1c33(%rip), %rdx      # 0xe2a0
leaq 0x1ef4(%rip), %rcx      # 0xe568
movb $0x0, %al
callq 0x9280
callq 0x6d70
movq %rax, %rdi
callq 0x97f0
jmp 0xc68a
jmp 0xc6e8
movq -0x38(%rbp), %rax
addq $0xac, %rax
movslq -0x14(%rbp), %rcx
imulq $0xc, %rcx, %rcx
addq %rcx, %rax
movl (%rax), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0xc6b9
movq -0x38(%rbp), %rdi
movl -0x18(%rbp), %esi
callq 0xc0f0
jmp 0xc6e6
movq -0x38(%rbp), %rax
addq $0xac, %rax
movslq -0x14(%rbp), %rcx
imulq $0xc, %rcx, %rcx
addq %rcx, %rax
movl (%rax), %eax
andl $0x4, %eax
cmpl $0x0, %eax
je 0xc6e4
movq -0x38(%rbp), %rdi
movl -0x18(%rbp), %esi
callq 0xc2e0
jmp 0xc6e6
jmp 0xc6e8
jmp 0xc6ea
jmp 0xc6ec
jmp 0xc6ee
movl -0x14(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x14(%rbp)
jmp 0xc550
testb $0x1, -0x9(%rbp)
je 0xc750
movq -0x38(%rbp), %rdi
addq $0x1d588, %rdi          # imm = 0x1D588
callq 0x48a0
movq -0x38(%rbp), %rcx
xorl %eax, %eax
cmpl 0x14(%rcx), %eax
jne 0xc74c
callq 0x6d70
movq %rax, %rdi
movl $0x1, %esi
leaq 0x1b6f(%rip), %rdx      # 0xe2a0
leaq 0x1e47(%rip), %rcx      # 0xe57f
movb $0x0, %al
callq 0x9280
callq 0x6d70
movq %rax, %rdi
callq 0x97f0
movb $0x0, -0x9(%rbp)
jmp 0xc4cc
addq $0x40, %rsp
popq %rbp
retq
nopl (%rax,%rax)