Add shuffler and paramaterize the open_sem function additionally
This commit is contained in:
parent
8c423aaa16
commit
004ee52ae4
@ -30,6 +30,10 @@
|
|||||||
#include "shared/sem.c"
|
#include "shared/sem.c"
|
||||||
#include "shared/structs.c"
|
#include "shared/structs.c"
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
void swap(int *a, int *b);
|
||||||
|
void shuffle(int arr[], size_t size);
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
if(argc < 2) {
|
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
|
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
|
/// Allocate resources for circular buffer
|
||||||
|
int wr_pos = 0;
|
||||||
buffer_shmfd = create_shmfd(BUFF_SHM_NAME);
|
buffer_shmfd = create_shmfd(BUFF_SHM_NAME);
|
||||||
circ_buffer = (buffer_t *)open_shm(buffer_shmfd, sizeof(buffer_t));
|
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);
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -22,12 +22,21 @@ static sem_t *mutex;
|
|||||||
* @brief Function that executes sem_open(3) and does error handling.
|
* @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,
|
* @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.
|
* 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
|
* Returns a new semaphore
|
||||||
* @param sem_name, sem_size
|
* @param sem_name, sem_size, type
|
||||||
* @return res
|
* @return res
|
||||||
**/
|
**/
|
||||||
sem_t * open_sem(char *sem_name, size_t sem_size) {
|
sem_t * open_sem(char *sem_name, size_t sem_size, short type) {
|
||||||
sem_t *res = sem_open(sem_name, O_CREAT | O_EXCL, 0600, sem_size);
|
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) {
|
if(res == SEM_FAILED) {
|
||||||
fprintf(stderr, "ERROR: Failed opening semaphore\n");
|
fprintf(stderr, "ERROR: Failed opening semaphore\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
@ -46,8 +46,9 @@ int main(int argc, char *argv[]) {
|
|||||||
circ_buffer = (buffer_t *)open_shm(buffer_shmfd, sizeof(buffer_t));
|
circ_buffer = (buffer_t *)open_shm(buffer_shmfd, sizeof(buffer_t));
|
||||||
|
|
||||||
/// Open semaphores
|
/// Open semaphores
|
||||||
free_sem = open_sem(FREE_SEM_NAME, BUFF_SIZE);
|
free_sem = open_sem(FREE_SEM_NAME, BUFF_SIZE, 0);
|
||||||
use_sem = open_sem(USE_SEM_NAME, 0);
|
use_sem = open_sem(USE_SEM_NAME, 0, 0);
|
||||||
|
mutex = open_sem(MUTEX_NAME, 1, 0);
|
||||||
|
|
||||||
int free_space = 0;
|
int free_space = 0;
|
||||||
int use_space = 0;
|
int use_space = 0;
|
||||||
|
Reference in New Issue
Block a user