// File: /workspace/github_c_makefile_star2_O3/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 %rbx
movq %rdi, %rbx
movq 0x128(%rdi), %rdi
testq %rdi, %rdi
je 0x726b
movq (%rdi), %rax
movq %rax, 0x128(%rbx)
cmpq 0x130(%rbx), %rdi
jne 0x71ee
movq $0x0, 0x130(%rbx)
movq 0x8(%rdi), %r15
movq 0x10(%rdi), %r14
callq 0x3050
testq %r15, %r15
je 0x7219
orb $0x10, 0x88(%rbx)
movq %rbx, %rdi
xorl %esi, %esi
movq %r14, %rdx
callq *%r15
andb $-0x11, 0x88(%rbx)
movq 0x128(%rbx), %rdi
jmp 0x71c7
movq (%rdi), %rax
movq %rax, 0x138(%rbx)
cmpq 0x140(%rbx), %rdi
jne 0x7240
movq $0x0, 0x140(%rbx)
movq 0x8(%rdi), %r15
movq 0x10(%rdi), %r14
callq 0x3050
testq %r15, %r15
je 0x726b
orb $0x10, 0x88(%rbx)
movq %rbx, %rdi
xorl %esi, %esi
movq %r14, %rdx
callq *%r15
andb $-0x11, 0x88(%rbx)
movq 0x138(%rbx), %rdi
testq %rdi, %rdi
jne 0x7222
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 0x7dcb
testq %rax, %rax
je 0x72e3
movq 0x8(%rax), %rcx
movq 0x8(%rcx), %rax
testq %rax, %rax
je 0x72cf
orb $0x10, 0x88(%rbx)
movq 0x10(%rcx), %rdx
movq %rbx, %rdi
xorl %esi, %esi
callq *%rax
andb $-0x11, 0x88(%rbx)
movq %r14, %rdi
callq 0x7dcb
testq %rax, %rax
jne 0x72a9
movq 0x148(%rbx), %r15
movq %r14, %rdi
callq 0x3050
movq %r15, %rdi
callq 0x7e09
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 0x7dcb
testq %rax, %rax
je 0x735f
movq 0x8(%rax), %rcx
movq 0x8(%rcx), %rax
testq %rax, %rax
je 0x734b
orb $0x10, 0x88(%rbx)
movq 0x10(%rcx), %rdx
movq %rbx, %rdi
xorl %esi, %esi
callq *%rax
andb $-0x11, 0x88(%rbx)
movq %r14, %rdi
callq 0x7dcb
testq %rax, %rax
jne 0x7325
movq 0x150(%rbx), %r15
movq %r14, %rdi
callq 0x3050
movq %r15, %rdi
callq 0x7e09
movq 0x110(%rbx), %rax
testq %rax, %rax
je 0x7384
movq 0xe8(%rbx), %rdi
callq *%rax
movq 0x118(%rbx), %rax
testq %rax, %rax
je 0x73b1
movl 0x88(%rbx), %ecx
testb $0x2, %cl
je 0x73b1
xorl %esi, %esi
testb $0x8, %cl
jne 0x73ac
xorl %esi, %esi
cmpl 0xd0(%rbx), %esi
sbbl %esi, %esi
movq %rbx, %rdi
callq *%rax
movq %rbx, %rdi
popq %rbx
popq %r14
popq %r15
jmp 0x3320