// File: marcellapantarotto[P]pseudoSO/scheduler.cpp
// Function: Scheduler::nextProcess(Process*)
bool Scheduler::nextProcess(Process *p) {
	if(!realTIME.empty() && realTIME.front().getInitTime() <= clock) {
		*p = realTIME.front();
		realTIME.pop();	// remove o próximo elemento
		return true;
	}

	if(!userP1.empty() && userP1.front().getInitTime() <= clock) {
		*p = userP1.front();
		userP1.pop();
		return true;
	}

	if(!userP2.empty() && userP2.front().getInitTime() <= clock) {
		*p = userP2.front();
		userP2.pop();
		return true;
	}

	if(!userP3.empty() && userP3.front().getInitTime() <= clock) {
		*p = userP3.front();
		userP3.pop();
		return true;
	}

	return false;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x20(%rbp)
addq $0x110, %rdi            # imm = 0x110
callq 0x5910
testb $0x1, %al
jne 0x4766
movq -0x20(%rbp), %rdi
addq $0x110, %rdi            # imm = 0x110
callq 0x5930
movq %rax, %rdi
callq 0x37d0
movq -0x20(%rbp), %rcx
cmpl (%rcx), %eax
jg 0x4766
movq -0x20(%rbp), %rdi
addq $0x110, %rdi            # imm = 0x110
callq 0x5930
movq -0x20(%rbp), %rdi
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq 0x10(%rcx), %rdx
movq %rdx, 0x10(%rax)
movq 0x18(%rcx), %rcx
movq %rcx, 0x18(%rax)
addq $0x110, %rdi            # imm = 0x110
callq 0x5950
movb $0x1, -0x1(%rbp)
jmp 0x48d5
movq -0x20(%rbp), %rdi
addq $0x20, %rdi
callq 0x5910
testb $0x1, %al
jne 0x47dc
movq -0x20(%rbp), %rdi
addq $0x20, %rdi
callq 0x5930
movq %rax, %rdi
callq 0x37d0
movq -0x20(%rbp), %rcx
cmpl (%rcx), %eax
jg 0x47dc
movq -0x20(%rbp), %rdi
addq $0x20, %rdi
callq 0x5930
movq -0x20(%rbp), %rdi
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq 0x10(%rcx), %rdx
movq %rdx, 0x10(%rax)
movq 0x18(%rcx), %rcx
movq %rcx, 0x18(%rax)
addq $0x20, %rdi
callq 0x5950
movb $0x1, -0x1(%rbp)
jmp 0x48d5
movq -0x20(%rbp), %rdi
addq $0x70, %rdi
callq 0x5910
testb $0x1, %al
jne 0x4852
movq -0x20(%rbp), %rdi
addq $0x70, %rdi
callq 0x5930
movq %rax, %rdi
callq 0x37d0
movq -0x20(%rbp), %rcx
cmpl (%rcx), %eax
jg 0x4852
movq -0x20(%rbp), %rdi
addq $0x70, %rdi
callq 0x5930
movq -0x20(%rbp), %rdi
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq 0x10(%rcx), %rdx
movq %rdx, 0x10(%rax)
movq 0x18(%rcx), %rcx
movq %rcx, 0x18(%rax)
addq $0x70, %rdi
callq 0x5950
movb $0x1, -0x1(%rbp)
jmp 0x48d5
movq -0x20(%rbp), %rdi
addq $0xc0, %rdi
callq 0x5910
testb $0x1, %al
jne 0x48d1
movq -0x20(%rbp), %rdi
addq $0xc0, %rdi
callq 0x5930
movq %rax, %rdi
callq 0x37d0
movq -0x20(%rbp), %rcx
cmpl (%rcx), %eax
jg 0x48d1
movq -0x20(%rbp), %rdi
addq $0xc0, %rdi
callq 0x5930
movq -0x20(%rbp), %rdi
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq 0x10(%rcx), %rdx
movq %rdx, 0x10(%rax)
movq 0x18(%rcx), %rcx
movq %rcx, 0x18(%rax)
addq $0xc0, %rdi
callq 0x5950
movb $0x1, -0x1(%rbp)
jmp 0x48d5
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x20, %rsp
popq %rbp
retq