// File: /workspace/github_cpp_makefile_star2_O2/white0dew[P]WebServer/http/http_conn.cpp
// Function: http_conn::write()
bool http_conn::write()
{
    int temp = 0;
    //表示响应报文为空，一般不会出现这种情况
    if (bytes_to_send == 0)
    {
        modfd(m_epollfd, m_sockfd, EPOLLIN, m_TRIGMode);
        init();
        return true;
    }

    while (1)
    {
        //将响应报文的状态行、消息头、空行和响应正文发送给浏览器端
        temp = writev(m_sockfd, m_iv, m_iv_count);
        //error
        if (temp < 0)
        {
            //判断缓冲区是否满了
            if (errno == EAGAIN)
            {
                modfd(m_epollfd, m_sockfd, EPOLLOUT, m_TRIGMode);
                return true;
            }
            unmap();
            return false;
        }
        //更新已发送字节
        bytes_have_send += temp;
        //更新wei发送字节
        bytes_to_send -= temp;
        //第一个iovec头部信息的数据已发送完，发送第二个iovec数据
        if (bytes_have_send >= m_iv[0].iov_len)
        {
            //不再继续发送头部信息
            m_iv[0].iov_len = 0;
            m_iv[1].iov_base = m_file_address + (bytes_have_send - m_write_idx);
            m_iv[1].iov_len = bytes_to_send;
        }
        //继续发送第一个iovec头部信息的数据
        else
        {
            m_iv[0].iov_base = m_write_buf + bytes_have_send;
            m_iv[0].iov_len = m_iv[0].iov_len - bytes_have_send;
        }

        //判断条件，数据已全部发送完
        if (bytes_to_send <= 0)
        {
            //如果发送失败，但不是缓冲区问题，取消映射
            unmap();
            //重新注册写事件
            modfd(m_epollfd, m_sockfd, EPOLLIN, m_TRIGMode);

            //浏览器的请求为长连接
            if (m_linger)
            {
                //重新初始化HTTP对象**
                init();
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
cmpl $0x0, 0xdf0(%rdi)
je 0x4f58
leaq 0xdc0(%rbx), %r14
leaq 0x834(%rbx), %r15
movl 0x14(%rbx), %edi
movl 0xde0(%rbx), %edx
movq %r14, %rsi
callq 0x3220
testl %eax, %eax
js 0x4f9a
movslq 0xdf4(%rbx), %rcx
movslq %eax, %rdx
addq %rdx, %rcx
movl %ecx, 0xdf4(%rbx)
movslq 0xdf0(%rbx), %rax
subq %rdx, %rax
movl %eax, 0xdf0(%rbx)
movq 0xdc8(%rbx), %rdx
subq %rcx, %rdx
jbe 0x4eff
addq %r15, %rcx
movq %rcx, (%r14)
jmp 0x4f23
movslq 0xc34(%rbx), %rdx
movslq %ecx, %rcx
subq %rdx, %rcx
addq 0xd28(%rbx), %rcx
movq %rcx, 0xdd0(%rbx)
movq %rax, 0xdd8(%rbx)
xorl %edx, %edx
movq %rdx, 0xdc8(%rbx)
testl %eax, %eax
jg 0x4eaf
movq %rbx, %rdi
callq 0x4e66
movl 0x84ac(%rip), %edi      # 0xd3e8
movl 0x14(%rbx), %esi
movl 0xe30(%rbx), %ecx
pushq $0x1
popq %rdx
callq 0x41e3
cmpb $0x1, 0xd24(%rbx)
je 0x4f6f
jmp 0x4fc7
movl 0x848a(%rip), %edi      # 0xd3e8
movl 0x14(%rbx), %esi
movl 0xe30(%rbx), %ecx
pushq $0x1
popq %rdx
callq 0x41e3
andq $0x0, 0xdf0(%rbx)
andl $0x0, 0xde4(%rbx)
leaq 0x28(%rbx), %rdi
xorps %xmm0, %xmm0
movups %xmm0, (%rbx)
andl $0x0, 0x10(%rbx)
movl $0xcfd, %edx            # imm = 0xCFD
xorl %esi, %esi
callq 0x3240
jmp 0x4fbb
callq 0x3050
cmpl $0xb, (%rax)
jne 0x4fbf
movl 0x843e(%rip), %edi      # 0xd3e8
movl 0x14(%rbx), %esi
movl 0xe30(%rbx), %ecx
pushq $0x4
popq %rdx
callq 0x41e3
movb $0x1, %al
jmp 0x4fc9
movq %rbx, %rdi
callq 0x4e66
xorl %eax, %eax
popq %rbx
popq %r14
popq %r15
retq
nop