diff --git a/fb_arc_set/generator.c b/fb_arc_set/generator.c index 4256a3d..8009e5b 100644 --- a/fb_arc_set/generator.c +++ b/fb_arc_set/generator.c @@ -30,6 +30,10 @@ #include "shared/sem.c" #include "shared/structs.c" #include +#include + +void swap(int *a, int *b); +void shuffle(int arr[], size_t size); int main(int argc, char *argv[]) { if(argc < 2) { @@ -76,13 +80,74 @@ int main(int argc, char *argv[]) { } num_nodes++; ///< Our first node is labeled 0, so we need to add 1 more - printf("%d", num_nodes); + /// Declare arrays for unique nodes and for the chosen edges + int unique_nodes[num_nodes]; + bool chosen_edges[num_edges]; + + /// Filling the node array with the nodes + for(int i=0; i < num_nodes; i++) { + unique_nodes[i] = i; + } + + /// Marking all edges as not chosen + for(int i=0; i < num_edges; i++) { + chosen_edges[i] = false; + } /// Allocate resources for circular buffer + int wr_pos = 0; buffer_shmfd = create_shmfd(BUFF_SHM_NAME); circ_buffer = (buffer_t *)open_shm(buffer_shmfd, sizeof(buffer_t)); + /// Open semaphores + free_sem = open_sem(FREE_SEM_NAME, BUFF_SIZE, 1); + use_sem = open_sem(USE_SEM_NAME, 0, 1); + mutex = open_sem(MUTEX_NAME, 1, 1); + int best_solution = num_edges - 1; ///< Set a basic best solution + + /// Declaring buffer arrays + int buf_nodes[num_nodes]; + int buf_chosen_edges[num_edges]; + + while(terminate != true && circ_buffer->finished != true) { ///< Loop until told to stop or until an acyclic solution is discovered + /// Copy the original into a buffer array and shuffle it + memcpy(buf_nodes, unique_nodes, sizeof(unique_nodes)); + shuffle(buf_nodes, num_nodes); + + /// Reset the chosen status of the array + memcpy(buf_chosen_edges, chosen_edges, sizeof(chosen_edges)); + } exit(EXIT_SUCCESS); } + +/** + * @brief Function that swaps a two variables + * @details The function takes pointers to two variables and swaps their values with a buffer variable + * @param *a, *b + * @return none + **/ +void swap(int *a, int *b) { + int temp = *a; + *a = *b; + *b = temp; +} + +/** + * @brief Function that shuffles a given array + * @details The function takes an array and shuffles it randomly using the Fisher-Yates algorithm: + * https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle + * @param arr, size + * @return res + **/ +void shuffle(int arr[], size_t size) { + + srand(time(NULL)); ///< Set a random seed + + int j = 0; ///< Index that will be randomized later on + for(int i = size - 1; i > 0; i--) { + j = rand()%(i+1); ///< Pick a random index + swap(&arr[i], &arr[j]); ///< Swap the values + } +} diff --git a/fb_arc_set/shared/sem.c b/fb_arc_set/shared/sem.c index 9ed79cc..f91bfae 100644 --- a/fb_arc_set/shared/sem.c +++ b/fb_arc_set/shared/sem.c @@ -22,12 +22,21 @@ static sem_t *mutex; * @brief Function that executes sem_open(3) and does error handling. * @details The function executes sem_open(3), giving it a semaphor name and size as parameters, * and handles the errors if any. The same behaviour as sem_open(3) should be expected. + * The type parameter is used to determine how the semaphore should be opened: + * - as a supervisor: 0 + * - as a generator: 1 * Returns a new semaphore - * @param sem_name, sem_size + * @param sem_name, sem_size, type * @return res **/ -sem_t * open_sem(char *sem_name, size_t sem_size) { - sem_t *res = sem_open(sem_name, O_CREAT | O_EXCL, 0600, sem_size); +sem_t * open_sem(char *sem_name, size_t sem_size, short type) { + sem_t *res; + + if(type == 0) + res = sem_open(sem_name, O_CREAT | O_EXCL, 0600, sem_size); + else + res = sem_open(sem_name, sem_size); + if(res == SEM_FAILED) { fprintf(stderr, "ERROR: Failed opening semaphore\n"); exit(EXIT_FAILURE); diff --git a/fb_arc_set/supervisor.c b/fb_arc_set/supervisor.c index 0c0142b..7fc65a7 100644 --- a/fb_arc_set/supervisor.c +++ b/fb_arc_set/supervisor.c @@ -46,8 +46,9 @@ int main(int argc, char *argv[]) { circ_buffer = (buffer_t *)open_shm(buffer_shmfd, sizeof(buffer_t)); /// Open semaphores - free_sem = open_sem(FREE_SEM_NAME, BUFF_SIZE); - use_sem = open_sem(USE_SEM_NAME, 0); + free_sem = open_sem(FREE_SEM_NAME, BUFF_SIZE, 0); + use_sem = open_sem(USE_SEM_NAME, 0, 0); + mutex = open_sem(MUTEX_NAME, 1, 0); int free_space = 0; int use_space = 0;