// File: yinqiwen[P]coroxx/libcoro.cpp
// Function: coroxx::LibCoroCoroutine::Resume(bool)
void LibCoroCoroutine::Resume(bool release_current)
    {
        CoroEnv& coro_env = getCoroEnv();
        CoroutineStack& coro_stack = getCoroEnv().coro_stack;
        LibCoroCoroutine* current = coro_env.current;
        coro_context* current_ctx = NULL;
        if (NULL == current)
        {
            if (NULL == coro_env.main)
            {
                CoroOptions opt;
                coro_env.main = new LibCoroCoroutine(opt, true);
            }
            current_ctx = &(coro_env.main->ctx);
        }
        else
        {
            current_ctx = &(current->ctx);
        }
        if (NULL != current && !current->waiting && !release_current)
        {
            coro_stack.push(current);
        }
        coro_env.current = this;
        waiting = false;
        if (NULL == stack && !ctx_inited)
        {
            stack = coro_env.GetCoroStack();
            //stack = new CoroStack(coro_env.stack_size, false);
        }

        LibCoroCoroutine* save_coro = NULL;
        if (NULL != stack && stack->coro && stack->coro != this)
        {
            save_coro = stack->coro;
            if (save_coro == current && release_current)
            {
                save_coro = NULL;
            }
        }
        if (NULL != stack)
        {
            stack->coro = this;
        }
//        if(NULL != save_coro)
//        {
//            //save_coro->MarkStackResumePoint();
//        }
        if (!ctx_inited)
        {
            g_create_mutex.Lock();
            coro_create(&ctx, LibCoroFunc, &data_ctx, stack->stack.sptr, stack->stack.ssze);
            g_create_mutex.Unlock();
            ctx_inited = true;
        }

        if (NULL != save_coro && current != save_coro)
        {
            save_coro->SaveStackBuffer();
        }
        if (NULL != current)
        {
            current->MarkStackResumePoint();
            if (current->stack == stack)
            {
                //printf("####WARN change current stack buffer for %d->%d\n", current->id, id);
                coro_env.swap_ctx.Init();
                coro_env.swap_ctx.from = current;
                coro_env.swap_ctx.to = this;
                coro_transfer(&(current->ctx), &(coro_env.swap_ctx.swap_coro));
                return;
            }
            ResumeStackBuffer();
        }
        coro_transfer(current_ctx, &ctx);

    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movb %sil, %al
movq %rdi, -0x8(%rbp)
andb $0x1, %al
movb %al, -0x9(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x78(%rbp)
callq 0x3440
movq %rax, -0x18(%rbp)
callq 0x3440
addq $0x10, %rax
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
xorl %eax, %eax
cmpq -0x28(%rbp), %rax
jne 0x352e
movq -0x18(%rbp), %rcx
xorl %eax, %eax
cmpq 0x8(%rcx), %rax
jne 0x3520
leaq -0x58(%rbp), %rdi
movq %rdi, -0x88(%rbp)
callq 0x2bc0
movl $0x68, %edi
callq 0x21d0
movq -0x88(%rbp), %rsi
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x80(%rbp)
movl $0x1, %edx
callq 0x30b0
jmp 0x34f3
movq -0x80(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x3520
movq -0x80(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x60(%rbp)
movl %eax, -0x64(%rbp)
movl $0x68, %esi
callq 0x21e0
jmp 0x36f8
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x3536
movq -0x28(%rbp), %rax
movq %rax, -0x30(%rbp)
xorl %eax, %eax
cmpq -0x28(%rbp), %rax
je 0x355b
movq -0x28(%rbp), %rax
testb $0x1, 0x49(%rax)
jne 0x355b
testb $0x1, -0x9(%rbp)
jne 0x355b
movq -0x20(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x3a20
movq -0x78(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, (%rax)
movb $0x0, 0x49(%rcx)
xorl %eax, %eax
cmpq 0x8(%rcx), %rax
jne 0x3590
movq -0x78(%rbp), %rax
testb $0x1, 0x48(%rax)
jne 0x3590
movq -0x18(%rbp), %rdi
callq 0x3a50
movq %rax, %rcx
movq -0x78(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x78(%rbp), %rcx
movq $0x0, -0x70(%rbp)
xorl %eax, %eax
cmpq 0x8(%rcx), %rax
je 0x35eb
movq -0x78(%rbp), %rax
movq 0x8(%rax), %rax
cmpq $0x0, 0x10(%rax)
je 0x35eb
movq -0x78(%rbp), %rcx
movq 0x8(%rcx), %rax
cmpq %rcx, 0x10(%rax)
je 0x35eb
movq -0x78(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x28(%rbp), %rax
jne 0x35e9
testb $0x1, -0x9(%rbp)
je 0x35e9
movq $0x0, -0x70(%rbp)
jmp 0x35eb
movq -0x78(%rbp), %rcx
xorl %eax, %eax
cmpq 0x8(%rcx), %rax
je 0x3603
movq -0x78(%rbp), %rcx
movq 0x8(%rcx), %rax
movq %rcx, 0x10(%rax)
movq -0x78(%rbp), %rax
testb $0x1, 0x48(%rax)
jne 0x3653
leaq 0x14bcc(%rip), %rdi     # 0x181e0
callq 0x3910
movq -0x78(%rbp), %rdi
movq %rdi, %rdx
addq $0x18, %rdx
movq 0x8(%rdi), %rax
movq (%rax), %rcx
movq 0x8(%rdi), %rax
movq 0x8(%rax), %r8
leaq 0xd6(%rip), %rsi        # 0x3710
callq 0xe3d0
leaq 0x14b9a(%rip), %rdi     # 0x181e0
callq 0x3940
movq -0x78(%rbp), %rax
movb $0x1, 0x48(%rax)
xorl %eax, %eax
cmpq -0x70(%rbp), %rax
je 0x366e
movq -0x28(%rbp), %rax
cmpq -0x70(%rbp), %rax
je 0x366e
movq -0x70(%rbp), %rdi
callq 0x31a0
xorl %eax, %eax
cmpq -0x28(%rbp), %rax
je 0x36e2
movq -0x28(%rbp), %rdi
callq 0x32a0
movq -0x78(%rbp), %rcx
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
cmpq 0x8(%rcx), %rax
jne 0x36d9
movq -0x18(%rbp), %rdi
addq $0x80, %rdi
callq 0x3bc0
movq -0x78(%rbp), %rcx
movq -0x28(%rbp), %rdx
movq -0x18(%rbp), %rax
movq %rdx, 0x80(%rax)
movq -0x18(%rbp), %rax
movq %rcx, 0x88(%rax)
movq -0x28(%rbp), %rdi
movq -0x18(%rbp), %rsi
addq $0x80, %rsi
addq $0x10, %rsi
callq 0xe3b0
jmp 0x36ef
movq -0x78(%rbp), %rdi
callq 0x3220
movq -0x78(%rbp), %rsi
movq -0x30(%rbp), %rdi
callq 0xe3b0
addq $0x90, %rsp
popq %rbp
retq
movq -0x60(%rbp), %rdi
callq 0x2330
nopw %cs:(%rax,%rax)