-
Notifications
You must be signed in to change notification settings - Fork 0
/
Agendador.cpp
51 lines (43 loc) · 1.79 KB
/
Agendador.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "Agendador.h"
Agendador::Agendador(int instanteInicial, Rede* rede, int tamanho) :
instanteAtual(instanteInicial), rede(rede), tamanho(tamanho) {
eventosAgendados = new Evento*[tamanho];
quantidade = 0;
}
Agendador::~Agendador() {
for (int i = 0; i < quantidade; i++)
delete eventosAgendados[i];
delete[] eventosAgendados;
}
bool Agendador::agendar(int instante, Roteador* r, Datagrama* d) {
if (quantidade >= tamanho)
return false;
else {
eventosAgendados[quantidade] = new Evento(instante, r, d);
quantidade++;
return true;
}
}
void Agendador::processar(){
for (int i = 0; i < quantidade ; i++) {
if (instanteAtual == eventosAgendados[i]->getInstante()) { //verifica se o evento esta agendado para o instante atual
eventosAgendados[i]->getDestino()->receber(eventosAgendados[i]->getDatagrama()); //o roteador de destino do evento recebe o datagrama
delete eventosAgendados[i];
for (int u = i; u < quantidade - 1; u++) //desloca todos os eventos seguintes para eliminar o "buraco" criado ao se ler o evento
eventosAgendados[u] = eventosAgendados[u+1];
i--; //volta-se uma posicao para ler-se os eventos deslocados
quantidade--;
}
}
Evento *nullOuEvento = NULL;
for (int i = 0; i < rede->getQuantidade(); i++) {
nullOuEvento = rede->getRoteadores()[i]->processar(instanteAtual); //chama o metodo processar de cada um dos roteadores da rede
if (nullOuEvento != NULL){ //caso o processar retorne um evento, ele eh agendado
agendar(nullOuEvento->getInstante(), nullOuEvento->getDestino(), nullOuEvento->getDatagrama());
}
}
instanteAtual++;
}
int Agendador::getInstante() {
return instanteAtual;
}