Skip to content

Commit 4989c9f

Browse files
committed
Agregado informe con diagramas
1 parent 341713a commit 4989c9f

File tree

12 files changed

+94
-35
lines changed

12 files changed

+94
-35
lines changed

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
diagramas export-ignore

README.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,35 @@ Nombre completo: Sebastian Bento Inneo Veiga
44

55
Padron: 100998
66

7-
Link: https://github.com/SBen-IV/tp2
7+
Link: https://github.com/SBen-IV/tp2
8+
9+
# Descripción
10+
11+
El trabajo práctico presentado corresponde a un programa que puede leer archivos .bpf y analizarlos en búsqueda de ciclos o instrucciones sin usar.
12+
13+
## Lista de clases más importantes
14+
15+
### eBPF
16+
17+
![eBPF class](diagramas/eBPF_class.png)
18+
19+
eBPF es la clase que maneja todo el comportamiento del programa y las demás clases. Es en el método `operator()` donde está el bucle que va tomando los archivos uno a uno y analizándolos para luego guardar los resultados de los mismos.
20+
21+
### Grafo
22+
23+
![Grafo class](diagramas/Grafo_class.png)
24+
25+
Grafo es la clase que contiene las conexiones entre las lineas como nodos y aristas. Implementado a base de un hash para facilitar el acceso a los nodos. Además se encarga de buscar búcles o nodos sin visitar con el método `aplicarDFS()`. Los métodos implementados fueron los que únicamente se necesitaban para este TP.
26+
27+
### Instruccion
28+
29+
![Instruccion class](diagramas/Instruccion_class.png)
30+
31+
Instruccion es una clase contenedora de la linea que se obtiene del archivo y además tiene por separado las partes que componen a la línea como lo son la etiqueta, opcode y los argumentos. `conectar()` agrega aristas desde el último nodo al nodo actual en caso de ser necesario, además si la instrucción actual es un `jmp` lo agrega a vector de `jmps`. Este vector será usado más adelante para buscar las etiquetas a los que los `jmps` saltan.
32+
33+
## Aclaraciones
34+
35+
No se llegó a cumplir la totalidad de los requerimientos de la entrega porque:
36+
- Se perdió tiempo tratando de hacer el parseo de las líneas
37+
- El modelo de grafo con Hash no era tan bueno como parecía. Si hay 2 líneas iguales (como en el caso de la prueba icmp) no las distingue y detecta un bucle. Se intentó otra implementación con una clase Nodo pero trajo otros problemas.
38+
- Con los atrasos anteriores sólo se pudo hacer una implementación básica de los threads.

Repositorio.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
#include "Repositorio.h"
22

3-
Repositorio::Repositorio() {}
3+
Repositorio::Repositorio(std::mutex& _m) : m(_m) {}
44

55
void Repositorio::agregar(const std::string& nombre) {
66
this->nombres.push(nombre);
77
}
88

9-
Repositorio::Repositorio(Repositorio&& otro) {
10-
this->nombres = otro.nombres;
11-
}
12-
139
bool Repositorio::estaVacio() const {
1410
return this->nombres.empty();
1511
}
1612

1713
std::string Repositorio::obtener() {
14+
this->m.lock();
1815
std::string aux = this->nombres.front();
1916
this->nombres.pop();
17+
this->m.unlock();
2018

2119
return aux;
2220
}

Repositorio.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@
33

44
#include <queue>
55
#include <string>
6+
#include <mutex>
67

78
class Repositorio {
89
private:
910
std::queue<std::string> nombres;
11+
std::mutex& m;
1012
public:
1113
Repositorio();
12-
Repositorio(Repositorio&& otro);
14+
Repositorio(std::mutex& _m);
15+
Repositorio(Repositorio&& otro) = delete;
1316
void agregar(const std::string& nombre);
1417
bool estaVacio() const;
1518
std::string obtener();

Resultado.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
#define BUCLE 1
66
#define NODOS_SIN_VISITAR 2
77

8-
const std::string MENSAJE_GOOD = " GOOD";
9-
const std::string MENSAJE_CYCLE = " FAIL: cycle detected";
10-
const std::string MENSAJE_UNUSED = " FAIL: unused instructions detected";
8+
const char MENSAJE_GOOD[] = " GOOD";
9+
const char MENSAJE_CYCLE[] = " FAIL: cycle detected";
10+
const char MENSAJE_UNUSED[] = " FAIL: unused instructions detected";
1111

12-
Resultado::Resultado() {}
12+
Resultado::Resultado(std::mutex& _m) : m(_m) {}
1313

1414
void Resultado::agregar(const std::string& nombre_archivo,
1515
const int resultado) {
16+
this->m.lock();
1617
switch (resultado) {
1718
case OK:
1819
this->resultados[nombre_archivo] = MENSAJE_GOOD;
@@ -24,6 +25,7 @@ void Resultado::agregar(const std::string& nombre_archivo,
2425
this->resultados[nombre_archivo] = MENSAJE_UNUSED;
2526
break;
2627
}
28+
this->m.unlock();
2729
}
2830

2931
void Resultado::imprimir() {

Resultado.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44
#include <map>
55
#include <string>
66
#include <iterator>
7+
#include <mutex>
78

89
typedef std::map<std::string, std::string> HashOrdenado;
910

1011
class Resultado {
1112
private:
1213
HashOrdenado resultados;
14+
std::mutex& m;
1315
public:
14-
Resultado();
16+
Resultado(std::mutex& m);
1517
void agregar(const std::string& nombre_archivo, const int resultado);
1618
void imprimir();
1719
~Resultado();

diagramas/Grafo_class.png

8.84 KB
Loading

diagramas/Instruccion_class.png

7.19 KB
Loading

diagramas/eBPF_class.png

8.94 KB
Loading

eBPF.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1+
#include <iterator>
12
#include "eBPF.h"
23
#include "Grafo.h"
34
#include "AnalizadorInstruccion.h"
4-
#include <iterator>
5+
#include "Repositorio.h"
6+
#include "Resultado.h"
57

68
#define VACIO ""
79

8-
eBPF::eBPF() {}
10+
eBPF::eBPF(Repositorio& _nombres_archivos, Resultado& _resultados) :
11+
nombres_archivos(_nombres_archivos), resultados(_resultados) {}
912

10-
int eBPF::analizar(const std::string& nombre_archivo) {
13+
static int analizar(const std::string& nombre_archivo) {
1114
Archivo archivo(nombre_archivo, std::fstream::in);
1215
std::string linea;
1316
std::vector<Instruccion> instrucciones, jmps;
@@ -31,11 +34,21 @@ int eBPF::analizar(const std::string& nombre_archivo) {
3134

3235
std::vector<Instruccion>::iterator it_jmps = jmps.begin();
3336

34-
for(; it_jmps != jmps.end(); ++it_jmps) {
37+
for(; it_jmps != jmps.end(); ++it_jmps) {
3538
(*it_jmps).saltoA(instrucciones, grafo);
3639
}
3740

3841
return grafo.aplicarDFS();
3942
}
4043

44+
void eBPF::operator()() {
45+
while (!this->nombres_archivos.estaVacio()) {
46+
std::string nombre_archivo_actual = this->nombres_archivos.obtener();
47+
48+
int resultado = analizar(nombre_archivo_actual);
49+
50+
resultados.agregar(nombre_archivo_actual, resultado);
51+
}
52+
}
53+
4154
eBPF::~eBPF() {}

eBPF.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,18 @@
44
#include <string>
55
#include <vector>
66
#include "Archivo.h"
7+
#include "Grafo.h"
8+
#include "AnalizadorInstruccion.h"
9+
#include "Repositorio.h"
10+
#include "Resultado.h"
711

812
class eBPF {
13+
private:
14+
Repositorio& nombres_archivos;
15+
Resultado& resultados;
916
public:
10-
eBPF();
11-
int analizar(const std::string& nombre_archivo);
17+
eBPF(Repositorio& _nombres_archivos, Resultado& _resultados);
18+
void operator()();
1219
~eBPF();
1320
};
1421

main.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,40 @@
11
#include <iostream>
22
#include <string>
3+
#include <vector>
4+
#include <thread>
5+
#include <mutex>
36
#include "Repositorio.h"
47
#include "eBPF.h"
58
#include "Resultado.h"
69

710
#define POS_INICIAL 2
811

9-
static void desarrollar_ebpf(Repositorio& nombres_archivos,
10-
Resultado& resultados) {
11-
while (!nombres_archivos.estaVacio()) {
12-
std::string nombre_archivo_actual = nombres_archivos.obtener();
13-
14-
eBPF filtro;
15-
16-
int resultado = filtro.analizar(nombre_archivo_actual);
17-
18-
resultados.agregar(nombre_archivo_actual, resultado);
19-
}
20-
}
21-
2212
int main(int argc, char const *argv[]) {
2313
if (argc < 3) {
2414
std::cout << "./tp <num hilos> <archivo> [<archivo>...]" << std::endl;
2515
return 0;
2616
}
2717

28-
Repositorio nombres_archivos;
18+
int cant_hilos = std::stoi(argv[1]);
19+
20+
std::mutex m_repositorio, m_resultado;
21+
22+
Repositorio nombres_archivos(m_repositorio);
2923

3024
for (int i = POS_INICIAL; i < argc; i++) {
3125
nombres_archivos.agregar(argv[i]);
3226
}
33-
34-
Resultado resultados;
35-
desarrollar_ebpf(nombres_archivos, resultados);
27+
28+
std::vector<std::thread> threads;
29+
Resultado resultados(m_resultado);
30+
31+
for (int i = 0; i < cant_hilos; ++i) {
32+
threads.push_back(std::thread {eBPF(nombres_archivos, resultados)});
33+
}
34+
35+
for (int i = 0; i < cant_hilos; ++i) {
36+
threads[i].join();
37+
}
3638

3739
resultados.imprimir();
3840

0 commit comments

Comments
 (0)