// File: xocoder[P]m_kcptun/vendor/kcp/ikcp.c
// Function: ikcp_release
void ikcp_release(ikcpcb *kcp)
{
	assert(kcp);
	if (kcp) {
		IKCPSEG *seg;
		while (!iqueue_is_empty(&kcp->snd_buf)) {
			seg = iqueue_entry(kcp->snd_buf.next, IKCPSEG, node);
			iqueue_del(&seg->node);
			ikcp_segment_delete(kcp, seg);
		}
		while (!iqueue_is_empty(&kcp->rcv_buf)) {
			seg = iqueue_entry(kcp->rcv_buf.next, IKCPSEG, node);
			iqueue_del(&seg->node);
			ikcp_segment_delete(kcp, seg);
		}
		while (!iqueue_is_empty(&kcp->snd_queue)) {
			seg = iqueue_entry(kcp->snd_queue.next, IKCPSEG, node);
			iqueue_del(&seg->node);
			ikcp_segment_delete(kcp, seg);
		}
		while (!iqueue_is_empty(&kcp->rcv_queue)) {
			seg = iqueue_entry(kcp->rcv_queue.next, IKCPSEG, node);
			iqueue_del(&seg->node);
			ikcp_segment_delete(kcp, seg);
		}
		if (kcp->buffer) {
			ikcp_free(kcp->buffer);
		}
		if (kcp->acklist) {
			ikcp_free(kcp->acklist);
		}

		kcp->nrcv_buf = 0;
		kcp->nsnd_buf = 0;
		kcp->nrcv_que = 0;
		kcp->nsnd_que = 0;
		kcp->ackcount = 0;
		kcp->buffer = NULL;
		kcp->acklist = NULL;
		ikcp_free(kcp);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x3c65
jmp 0x3c84
leaq 0xf398(%rip), %rdi      # 0x13004
leaq 0xf395(%rip), %rsi      # 0x13008
movl $0x12d, %edx            # imm = 0x12D
leaq 0xf39b(%rip), %rcx      # 0x1301a
callq 0x3210
cmpq $0x0, -0x8(%rbp)
je 0x3f1c
jmp 0x3c91
movq -0x8(%rbp), %rax
addq $0xa8, %rax
movq -0x8(%rbp), %rcx
cmpq 0xa8(%rcx), %rax
sete %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x3cb1
jmp 0x3d0b
movq -0x8(%rbp), %rax
movq 0xa8(%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq $0x0, (%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x3f30
jmp 0x3c91
jmp 0x3d0d
movq -0x8(%rbp), %rax
addq $0xb8, %rax
movq -0x8(%rbp), %rcx
cmpq 0xb8(%rcx), %rax
sete %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x3d2d
jmp 0x3d87
movq -0x8(%rbp), %rax
movq 0xb8(%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq $0x0, (%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x3f30
jmp 0x3d0d
jmp 0x3d89
movq -0x8(%rbp), %rax
addq $0x88, %rax
movq -0x8(%rbp), %rcx
cmpq 0x88(%rcx), %rax
sete %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x3da9
jmp 0x3e03
movq -0x8(%rbp), %rax
movq 0x88(%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq $0x0, (%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x3f30
jmp 0x3d89
jmp 0x3e05
movq -0x8(%rbp), %rax
addq $0x98, %rax
movq -0x8(%rbp), %rcx
cmpq 0x98(%rcx), %rax
sete %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x3e25
jmp 0x3e7f
movq -0x8(%rbp), %rax
movq 0x98(%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq $0x0, (%rax)
movq -0x10(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x3f30
jmp 0x3e05
movq -0x8(%rbp), %rax
cmpq $0x0, 0xe0(%rax)
je 0x3e9d
movq -0x8(%rbp), %rax
movq 0xe0(%rax), %rdi
callq 0x3c10
movq -0x8(%rbp), %rax
cmpq $0x0, 0xc8(%rax)
je 0x3ebb
movq -0x8(%rbp), %rax
movq 0xc8(%rax), %rdi
callq 0x3c10
movq -0x8(%rbp), %rax
movl $0x0, 0x5c(%rax)
movq -0x8(%rbp), %rax
movl $0x0, 0x60(%rax)
movq -0x8(%rbp), %rax
movl $0x0, 0x64(%rax)
movq -0x8(%rbp), %rax
movl $0x0, 0x68(%rax)
movq -0x8(%rbp), %rax
movl $0x0, 0xd0(%rax)
movq -0x8(%rbp), %rax
movq $0x0, 0xe0(%rax)
movq -0x8(%rbp), %rax
movq $0x0, 0xc8(%rax)
movq -0x8(%rbp), %rdi
callq 0x3c10
addq $0x10, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)