// File: /workspace/github_c_makefile_star2_O1/andyfighting[P]hiredis_timer_cmpt/async.c
// Function: _redisAsyncFree
static void __redisAsyncFree(redisAsyncContext *ac) {
    redisContext *c = &(ac->c);
    redisCallback cb;
    dictIterator *it;
    dictEntry *de;

    /* Execute pending callbacks with NULL reply. */
    while (__redisShiftCallback(&ac->replies,&cb) == REDIS_OK)
        __redisRunCallback(ac,&cb,NULL);

    /* Execute callbacks for invalid commands */
    while (__redisShiftCallback(&ac->sub.invalid,&cb) == REDIS_OK)
        __redisRunCallback(ac,&cb,NULL);

    /* Run subscription callbacks callbacks with NULL reply */
    it = dictGetIterator(ac->sub.channels);
    while ((de = dictNext(it)) != NULL)
        __redisRunCallback(ac,dictGetEntryVal(de),NULL);
    dictReleaseIterator(it);
    dictRelease(ac->sub.channels);

    it = dictGetIterator(ac->sub.patterns);
    while ((de = dictNext(it)) != NULL)
        __redisRunCallback(ac,dictGetEntryVal(de),NULL);
    dictReleaseIterator(it);
    dictRelease(ac->sub.patterns);

    /* Signal event lib to clean up */
    _EL_CLEANUP(ac);

    /* Execute disconnect callback. When redisAsyncFree() initiated destroying
     * this context, the status will always be REDIS_OK. */
    if (ac->onDisconnect && (c->flags & REDIS_CONNECTED)) {
        if (c->flags & REDIS_FREEING) {
            ac->onDisconnect(ac,REDIS_OK);
        } else {
            ac->onDisconnect(ac,(ac->err == 0) ? REDIS_OK : REDIS_ERR);
        }
    }

    /* Cleanup self */
    redisFree(c);
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %rbx
movq 0x128(%rbx), %r15
testq %r15, %r15
je 0x73f9
movq (%r15), %rax
movq %rax, 0x128(%rbx)
cmpq 0x130(%rbx), %r15
jne 0x73e9
movq $0x0, 0x130(%rbx)
movq 0x8(%r15), %r12
movq 0x10(%r15), %r14
movq %r15, %rdi
callq 0x3050
testq %r15, %r15
je 0x743c
testq %r12, %r12
je 0x73bf
orb $0x10, 0x88(%rbx)
movq %rbx, %rdi
xorl %esi, %esi
movq %r14, %rdx
callq *%r12
andb $-0x11, 0x88(%rbx)
jmp 0x73bf
testq %r12, %r12
je 0x743c
orb $0x10, 0x88(%rbx)
movq %rbx, %rdi
xorl %esi, %esi
movq %r14, %rdx
callq *%r12
andb $-0x11, 0x88(%rbx)
movq 0x138(%rbx), %r15
testq %r15, %r15
je 0x7476
movq (%r15), %rax
movq %rax, 0x138(%rbx)
cmpq 0x140(%rbx), %r15
jne 0x7466
movq $0x0, 0x140(%rbx)
movq 0x8(%r15), %r12
movq 0x10(%r15), %r14
movq %r15, %rdi
callq 0x3050
testq %r15, %r15
jne 0x741e
movq 0x148(%rbx), %r15
movl $0x20, %edi
callq 0x3340
movq %rax, %r14
movq %r15, (%rax)
movl $0xffffffff, 0x8(%rax)  # imm = 0xFFFFFFFF
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rax)
movq %rax, %rdi
callq 0x7ff1
testq %rax, %rax
je 0x74d8
movq 0x8(%rax), %rcx
movq 0x8(%rcx), %rax
testq %rax, %rax
je 0x74d3
orb $0x10, 0x88(%rbx)
movq 0x10(%rcx), %rdx
movq %rbx, %rdi
xorl %esi, %esi
callq *%rax
andb $-0x11, 0x88(%rbx)
movq %r14, %rdi
jmp 0x74a3
movq %r14, %rdi
callq 0x3050
movq 0x148(%rbx), %rdi
callq 0x802f
movq 0x150(%rbx), %r15
movl $0x20, %edi
callq 0x3340
movq %rax, %r14
movq %r15, (%rax)
movl $0xffffffff, 0x8(%rax)  # imm = 0xFFFFFFFF
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rax)
movq %rax, %rdi
callq 0x7ff1
testq %rax, %rax
je 0x7549
movq 0x8(%rax), %rcx
movq 0x8(%rcx), %rax
testq %rax, %rax
je 0x7544
orb $0x10, 0x88(%rbx)
movq 0x10(%rcx), %rdx
movq %rbx, %rdi
xorl %esi, %esi
callq *%rax
andb $-0x11, 0x88(%rbx)
movq %r14, %rdi
jmp 0x7514
movq %r14, %rdi
callq 0x3050
movq 0x150(%rbx), %rdi
callq 0x802f
movq 0x110(%rbx), %rax
testq %rax, %rax
je 0x7572
movq 0xe8(%rbx), %rdi
callq *%rax
movq 0x118(%rbx), %rax
testq %rax, %rax
je 0x759f
movl 0x88(%rbx), %ecx
testb $0x2, %cl
je 0x759f
xorl %esi, %esi
testb $0x8, %cl
jne 0x759a
xorl %esi, %esi
cmpl 0xd0(%rbx), %esi
sbbl %esi, %esi
movq %rbx, %rdi
callq *%rax
movq %rbx, %rdi
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
jmp 0x3320