// File: /workspace/github_c_makefile_star2_O0/goghcrow[P]dubbo_ab/dubbo_client.c
// Function: cli_on_read
static void cli_on_read(struct aeEventLoop *el, int fd, void *ud, int mask)
{
    UNUSED(el);
    UNUSED(mask);

    struct dubbo_client *cli = (struct dubbo_client *)ud;
    assert(cli->connected);

    for (;;)
    {
        int errno_ = 0;
        ssize_t recv_n = buf_readFd(cli->rcv_buf, fd, &errno_);
        if (recv_n < 0)
        {
            if (errno_ == EINTR)
            {
                continue;
            }
            else if (errno_ == EAGAIN)
            {
            }
            else
            {
                LOG_ERROR("从 Dubbo 服务端读取数据: %s", strerror(errno));
                cli_reconnect(cli);
                return;
            }
        }
        else if (recv_n == 0)
        {
            LOG_ERROR("Dubbo 服务端断开连接");
            cli_reconnect(cli);
            return;
        }
        break;
    }

    if (!is_dubbo_pkt(cli->rcv_buf))
    {
        LOG_ERROR("接收到非 dubbo 数据包");
        cli_reconnect(cli);
        return;
    }

    int remaining = 0;
    if (!is_completed_dubbo_pkt(cli->rcv_buf, &remaining))
    {
        LOG_ERROR("接收到异常 dubbo 数据包");
        cli_reconnect(cli);
        return;
    }
    if (remaining) {
        return;
    }

    cli->pipe_left++;
    cli->req_left--;

    if (((cli->req_n - cli->req_left) % 1000) == 0)
    {
        fprintf(stderr, "已发送请求 %d\n", cli->req_n - cli->req_left);
    }

    bool ok = cli_decode_resp(cli);
    
    if (cli->req_left <= 0)
    {
        cli_end(cli);
    }
    else
    {
        if (ok)
        {
            cli_pipe_send(cli);
        }
        else
        {
            cli_reconnect(cli);
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq %rdx, -0x18(%rbp)
movl %ecx, -0x1c(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
testb $0x1, 0x6c(%rax)
je 0xd61a
jmp 0xd639
leaq 0x2f88(%rip), %rdi      # 0x105a9
leaq 0x2eb2(%rip), %rsi      # 0x104da
movl $0x18c, %edx            # imm = 0x18C
leaq 0x2f84(%rip), %rcx      # 0x105b8
callq 0x2170
jmp 0xd63b
movl $0x0, -0x2c(%rbp)
movq -0x28(%rbp), %rax
movq 0x40(%rax), %rdi
movl -0xc(%rbp), %esi
leaq -0x2c(%rbp), %rdx
callq 0x9970
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x38(%rbp)
jge 0xd6c6
cmpl $0x4, -0x2c(%rbp)
jne 0xd669
jmp 0xd63b
cmpl $0xb, -0x2c(%rbp)
jne 0xd671
jmp 0xd6c2
movq 0x7980(%rip), %rax      # 0x14ff8
movq (%rax), %rax
movq %rax, -0x48(%rbp)
callq 0x2050
movl (%rax), %edi
callq 0x23b0
movq -0x48(%rbp), %rdi
movq %rax, %rdx
leaq 0x2f58(%rip), %rsi      # 0x105f1
leaq 0x2f9e(%rip), %rcx      # 0x1063e
leaq 0x2e33(%rip), %r8       # 0x104da
movl $0x19d, %r9d            # imm = 0x19D
movb $0x0, %al
callq 0x2220
movq -0x28(%rbp), %rdi
callq 0xcab0
jmp 0xd851
jmp 0xd6c4
jmp 0xd709
cmpq $0x0, -0x38(%rbp)
jne 0xd707
movq 0x7924(%rip), %rax      # 0x14ff8
movq (%rax), %rdi
leaq 0x2f6c(%rip), %rsi      # 0x1064a
leaq 0x2f59(%rip), %rdx      # 0x1063e
leaq 0x2dee(%rip), %rcx      # 0x104da
movl $0x1a4, %r8d            # imm = 0x1A4
movb $0x0, %al
callq 0x2220
movq -0x28(%rbp), %rdi
callq 0xcab0
jmp 0xd851
jmp 0xd709
jmp 0xd70b
movq -0x28(%rbp), %rax
movq 0x40(%rax), %rdi
callq 0xc3d0
testb $0x1, %al
jne 0xd756
movq 0x78d5(%rip), %rax      # 0x14ff8
movq (%rax), %rdi
leaq 0x2f62(%rip), %rsi      # 0x1068f
leaq 0x2f0a(%rip), %rdx      # 0x1063e
leaq 0x2d9f(%rip), %rcx      # 0x104da
movl $0x1ad, %r8d            # imm = 0x1AD
movb $0x0, %al
callq 0x2220
movq -0x28(%rbp), %rdi
callq 0xcab0
jmp 0xd851
movl $0x0, -0x3c(%rbp)
movq -0x28(%rbp), %rax
movq 0x40(%rax), %rdi
leaq -0x3c(%rbp), %rsi
callq 0xc420
testb $0x1, %al
jne 0xd7ac
movq 0x787f(%rip), %rax      # 0x14ff8
movq (%rax), %rdi
leaq 0x2f52(%rip), %rsi      # 0x106d5
leaq 0x2eb4(%rip), %rdx      # 0x1063e
leaq 0x2d49(%rip), %rcx      # 0x104da
movl $0x1b5, %r8d            # imm = 0x1B5
movb $0x0, %al
callq 0x2220
movq -0x28(%rbp), %rdi
callq 0xcab0
jmp 0xd851
cmpl $0x0, -0x3c(%rbp)
je 0xd7b7
jmp 0xd851
movq -0x28(%rbp), %rax
movl 0x54(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x54(%rax)
movq -0x28(%rbp), %rax
movl 0x5c(%rax), %ecx
addl $-0x1, %ecx
movl %ecx, 0x5c(%rax)
movq -0x28(%rbp), %rax
movl 0x58(%rax), %eax
movq -0x28(%rbp), %rcx
subl 0x5c(%rcx), %eax
movl $0x3e8, %ecx            # imm = 0x3E8
cltd
idivl %ecx
cmpl $0x0, %edx
jne 0xd812
movq 0x7805(%rip), %rax      # 0x14ff8
movq (%rax), %rdi
movq -0x28(%rbp), %rax
movl 0x58(%rax), %edx
movq -0x28(%rbp), %rax
subl 0x5c(%rax), %edx
leaq 0x2f13(%rip), %rsi      # 0x1071e
movb $0x0, %al
callq 0x2220
movq -0x28(%rbp), %rdi
callq 0xd8a0
andb $0x1, %al
movb %al, -0x3d(%rbp)
movq -0x28(%rbp), %rax
cmpl $0x0, 0x5c(%rax)
jg 0xd835
movq -0x28(%rbp), %rdi
callq 0xcd80
jmp 0xd851
testb $0x1, -0x3d(%rbp)
je 0xd846
movq -0x28(%rbp), %rdi
callq 0xd860
jmp 0xd84f
movq -0x28(%rbp), %rdi
callq 0xcab0
jmp 0xd851
addq $0x50, %rsp
popq %rbp
retq
nopw (%rax,%rax)