2023-05-14 21:46:06 +02:00
|
|
|
#include <sys/sem.h>
|
2023-05-15 09:22:52 +02:00
|
|
|
#include <sys/stat.h>
|
2023-05-22 09:26:39 +02:00
|
|
|
#include <errno.h>
|
2023-05-23 15:16:06 +02:00
|
|
|
#include <stdio.h>
|
2023-05-15 10:43:25 +02:00
|
|
|
|
2023-05-14 21:46:06 +02:00
|
|
|
#include <custom_sem.h>
|
2023-05-15 09:22:52 +02:00
|
|
|
#include <structures.h>
|
2023-05-14 21:46:06 +02:00
|
|
|
#include <errExit.h>
|
|
|
|
|
2023-05-23 15:47:34 +02:00
|
|
|
int _SEMID;
|
|
|
|
|
2023-05-22 11:03:36 +02:00
|
|
|
void resetServerSem(int semid);
|
|
|
|
|
|
|
|
void setupServerSem() {
|
2023-05-29 15:01:11 +02:00
|
|
|
key_t semKey = ftok(KEYFILE, SEMKEY);
|
2023-05-23 12:37:44 +02:00
|
|
|
_SEMID = semget(semKey, 3, IPC_CREAT | S_IRUSR | S_IWUSR);
|
|
|
|
if (_SEMID == -1) {
|
2023-05-22 11:03:36 +02:00
|
|
|
errExit("getsem", "F4Server");
|
|
|
|
}
|
|
|
|
|
2023-05-23 12:37:44 +02:00
|
|
|
resetServerSem(_SEMID);
|
2023-05-22 11:03:36 +02:00
|
|
|
}
|
|
|
|
|
2023-05-29 15:01:11 +02:00
|
|
|
|
|
|
|
void setupClientSem() {
|
|
|
|
key_t semKey = ftok(KEYFILE, SEMKEY);
|
|
|
|
_SEMID = semget(semKey, 3, IPC_CREAT | S_IRUSR | S_IWUSR);
|
|
|
|
if (_SEMID == -1) {
|
|
|
|
errExit("getsem", "F4Client");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-14 21:46:06 +02:00
|
|
|
void semOp(int semid, short sem_num, short sem_op) {
|
|
|
|
struct sembuf sop = {.sem_num = sem_num, .sem_op = sem_op, .sem_flg = 0};
|
|
|
|
|
2023-05-22 09:26:39 +02:00
|
|
|
int res;
|
|
|
|
do {
|
|
|
|
res = semop(semid, &sop, 1);
|
|
|
|
} while ((errno == EINTR));
|
|
|
|
|
|
|
|
if (res == -1) {
|
|
|
|
errExitMsg("semOp");
|
2023-05-14 21:46:06 +02:00
|
|
|
}
|
2023-05-14 22:24:57 +02:00
|
|
|
}
|
|
|
|
|
2023-05-15 10:31:50 +02:00
|
|
|
int getSemid(key_t key, int size){
|
2023-05-15 10:43:25 +02:00
|
|
|
int semid = semget(key, size, S_IRUSR | S_IWUSR | IPC_CREAT);
|
2023-05-14 22:24:57 +02:00
|
|
|
if (semid == -1) {
|
|
|
|
errExit("semget", "getSemid");
|
|
|
|
}
|
|
|
|
|
2023-05-15 10:43:25 +02:00
|
|
|
return semid;
|
|
|
|
}
|
|
|
|
|
2023-05-15 16:55:02 +02:00
|
|
|
// mette i semafori a 0 e 2
|
2023-05-15 10:43:25 +02:00
|
|
|
void resetServerSem(int semid){
|
2023-05-16 23:27:27 +02:00
|
|
|
unsigned short val[3] = {0, 0, 0}; // player1, player2, server
|
2023-05-14 22:24:57 +02:00
|
|
|
union semun arg;
|
|
|
|
arg.array = val;
|
|
|
|
|
|
|
|
if (semctl(semid, 0 , SETALL, arg) == -1) {
|
|
|
|
errExit("semctl", "getSemid");
|
|
|
|
}
|
2023-05-14 21:46:06 +02:00
|
|
|
}
|