This repository has been archived on 2021-08-17. You can view files and clone it, but cannot push or open issues or pull requests.
unix/fb_arc_set/supervisor.c

57 lines
2.1 KiB
C
Raw Normal View History

/**
* @file supervisor.c
* @author Ivaylo Ivanov 11777707
* @date 11.01.2018
*
* @brief Supervisor program module.
*
* The supervisor sets up the shared memory and the semaphores and initializes the circular buffer required
* for the communication with the generators. It then waits for the generators to write solutions to the
* circular buffer.
* The supervisor program takes no arguments.
* Once initialization is complete, the supervisor reads the solutions from the circular buffer and remembers the best solution so far, i.e. the solution with the least edges. Every time a better solution than the
* previous best solution is found, the supervisor writes the new solution to standard output. If a generator
* writes a solution with 0 edges to the circular buffer, then the graph is acyclic and the supervisor terminates. Otherwise the supervisor keeps reading results from the circular buffer until it receives a SIGINT
* or a SIGTERM signal.
* Before terminating, the supervisor notifies all generators that they should terminate as well. This can
* be done by setting a variable in the shared memory, which is checked by the generator processes before
* writing to the buffer. The supervisor then unlinks all shared resources and exits.
*
* SYNOPSIS
* supervisor
*
**/
#include "shared/shm.c"
#include "shared/sem.c"
#include "shared/structs.c"
int main(int argc, char *argv[]) {
if(argc > 1) {
fprintf(stderr, "ERROR: Command takes no arguments");
exit(EXIT_FAILURE);
}
/// Open shared memory objects
int buffer_shmfd = create_shmfd(BUFFER_SHM_NAME);
circ_buffer = (buffer_t *)open_shm(buffer_shmfd, sizeof(buffer_t));
/// Open semaphores
free_sem = open_sem(FREE_SEM_NAME, BUFF_SIZE);
used_sem = open_sem(USED_SEM_NAME, 0);
mutex = open_sem(MUTEX_NAME, 1);
/// Close and destory semaphores
close_sem(free_sem);
close_sem(used_sem);
close_sem(mutex);
destroy_sem(FREE_SEM_NAME);
destroy_sem(USED_SEM_NAME);
destroy_sem(MUTEX_NAME);
/// Close and destroy shared memory objects
close_shm(circ_buffer, sizeof(buffer_t));
destroy_shm(BUFFER_SHM_NAME, buffer_shmfd);
}