Inicio

La función main crea el desk y recibe los parámetros. Verifica que se reciban 8. Si no es así muestra un mensaje de error y termina.

int	main(int argc, char **argv)
{
	t_desk	desk;

	if (argc == 9)
	{
		// 1. Parseo
		// 2. Inicialización de datos
		// 3. Empezar simulacion
		// 4. Liberar memoria
	else
	{
		// mensaje de error, no se recibieron 8 datos.
	}
	return (0);
}

1. Parseo

En este punto se debe verificar que los datos recibidos sean válidos. Es decir, que sean números positivos, que no se reciba un texto diferente a “fifo” o “edf” como scheduler etc..

Una vez revisado cada dato se inicializan los 8 atributos de desk a los que corresponden.

desk->number_of_coders = argv[1];
desk->time_to_burnout = argv[2];
desk->time_to_compile = argv[3];
desk->time_to_debug = argv[4];
desk->time_to_refactor = argv[5];
desk->number_of_compiles_required = argv[6];
desk->dongle_cooldown = argv[7];
desk->scheduler = argv[8]

2. Inicialización de los demás atributos de desk, coder y dongle

Una vez está confirmados y pareados los 8 datos obligatorios, hay que inicializar las otras estructuras para terminar de crear el coworking.

2.1 desk_init(&desk)

Debe inicializar todas las otras variables de desk para hacerlo funcionar.


desk->start_simulation = 0; // aqui se guardará el id del hilo monitor
desk->end_simulation = false; // hasta que no se agote un coder o se termine de compilar, no se acaba la simulacion
desk->coders = // es un array de coders, debe prepararse con malloc
desk->dongles = // es un array de dongles, debe prepararse con malloc
pthread_mutex_init(&desk->log_mutex, NULL); // inicializa el mutex de log
pthread_mutex_init(&desk->sim_mutex, NULL); // inicializa el mutex de revisar/cambiar el estado de la simulacion

2.2 dongles_init(&desk)

Se preparan las herramientas de trabajo. Por cada dongle en el array de dongles de desk hay que inicializar estos atributos:

desk->dongles[i].dongle_id = i; // empieza desde 0, coder 1 toma dongle 0 y 1. El umtimo coder toma nunber_of_coders -1 (left) y 0 (right)
desk->dongles[i].holding_coder_id = -1; // -1 siempre que esté sin usar. Cuando un coder lo esté usando aqui irá el id del coder
desk->dongles[i].cooldown_wait = 0; // no se ha usado asi que no hay que esperar a que se enfríe
desk->dongles[i].free_at = 0; // no se ha usado asi que está listo para usarse
pthread_mutex_init(&desk->dongles_mutex, NULL); // mutex para revisar las listas de todos los dongles
pthread_cond_init(&desk->dongles_cond, NULL); // cond para esperar a que cambie la lista de espera
desk->dongles[i].dongle_queue.array = // es un array de queue_item, debe prepararse con malloc
desk->dongles[i].dongle_queue.size = 0; // aún no hay nada en esa lista, asi que 0

2.3 coder_init(&desk)

Una vez tenemos la mesa lista, podemos contratar a los coders.

Por cada coder que haya en el array de coders de desk, debemos inicializar estos atributos:

desk->coders[i].id = i + 1; // para que empiece desde 1 y no desde 0
desk->coders[i].compiler_counter = 0; // aun no han compilado nada
desk->coders[i].comp_done = false; // aun no ha terminado de compilar
desk->coders[i].last_comp_time = 0; // 
desk->coders[i].desk = desk; // le relacionamos al desk al que pertenece
desk->coders[i].left_dongle = &desk->dongles[i]; // un puntero a su dongle izquierdo
desk->coders[i].right_dongle = &desk->dongles[(i + 1) % desk->number_of_coders]; // un puntero a su dongle derecho

3. Empezar simulación