-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
executable file
·106 lines (89 loc) · 3.38 KB
/
main.c
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
* Thread-project
*
* Autor: David Cabeza <13-10191@usb.ve>
* Autor: Fabiola Martínez <13-10838@usb.ve>
*
* Descripción: Programa principal del thread-list. Esta función siempre es
* ejecutada por el hilo maestro. El thread-list explora un directorio con un
* número de hilos.
*
* Universidad Simón Bolívar
* Caracas, Venezuela
* Marzo, 2017.
*
*/
#include "tls.h"
int main(int argc, char *argv[]) {
/*
* Por defecto los valores de los argumentos son inicializados mediante la
* función init_inputargs con 1, directorio de trabajo actual y salida
* estándar respectivamente.
*/
Inargs *in = (Inargs *) malloc(sizeof(Inargs));
// Lista que contendra los directorios pendientes a explorar.
List *dirlist = (List *) malloc(sizeof(List));
// Lista que contiene la informacion obtenida por los hilos.
List *infolist = (List *) malloc(sizeof(List));
// Lista que contiene los hilos que no tienen directorios asignados.
List *idlelist = (List *) malloc(sizeof(List));
// Apuntador a los hilos.
pthread_t *threads;
// Estructura del hilo maestro
Threadstruct *masterthread;
// Contador de iteracion.
int i;
/*
* Inicialización de exclusiones mutuas para regiones críticas del programa.
* Las regiones críticas son:
* - Añadir hilos a la lista de hilos inactivos (sin directorio asginado)
* - Añadir directorios a la lista de directorios a explorar
* - Añadir información encontrada a la lista de información pos-exploración
* Evitan las condiciones de carrera.
*/
pthread_mutex_init(&idlemutex, NULL);
pthread_mutex_init(&dirmutex, NULL);
pthread_mutex_init(&infomutex, NULL);
// Inicializamos los valores introducidos por el usuario.
init_inputargs(in);
// Ejecutamos la funcion que se encagara de procesar los valores dados por el
// usuario.
parseArgs(in, argc, argv);
chdir(in->directory);
getcwd(in->directory, PATH_MAX);
threads = (pthread_t *) malloc(sizeof(in->concurrency * sizeof(pthread_t)));
// Inicializamos la lista donde se almacenaran los directorios a explorar.
init_list(dirlist);
// Inicializamos la lista donde se almacenara a inofrmacion obtenida por los
// hilos.
init_list(infolist);
// Inicializamos la lista donde se almacenaran los hilos que no tienen direc-
// torios asignados.
init_list(idlelist);
// Se crea el hilo padre
masterthread = (Threadstruct *) malloc(sizeof(Threadstruct));
init_threadstruct(masterthread, in->concurrency, dirlist, infolist, idlelist);
strcpy(masterthread->directory, in->directory);
/*
* Hilo padre explora directorio y agrega los directorios encontrados a la
* lista de directorios pendientes
*/
explore(masterthread);
/*
* El hilo maestro tiene en su estructura la información necesaria para la
* creación de hilos, i.e. concurrencia (número de hilos a crear) y los
* apuntadores a la lista de directorios, de información encontrada y de
* hilos inactivos.
*
* Los hilos creados se mantienen esperando que el hilo maestro les asigne
* un directorio para explorar.
*/
createThreads(masterthread, threads);
// EL hilo padre asigna directorios a sus hilos hijos.
allocateDir(masterthread);
// Hilo padre espera por la finalización de hijos.
for(i = 0; i < in->concurrency; i++) pthread_join(threads[i], NULL);
// Escribe la información obtenida
writeInformation(masterthread, in->out);
return 0;
}