-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhelp.h
executable file
·257 lines (195 loc) · 7.33 KB
/
help.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
/* \file help.h
\author Carlo Alessi
Si dichiara che il contenuto di questo file e' in ogni sua parte opera
originale dell' autore.
*/
#ifndef HELP_H
#define HELP_H
#include "wator.h"
#include "myqueue.h"
#include "myconn.h"
#define CHECK_NULL_PTR(p, str) if(!(p)) { perror(str); return NULL; }
#define CHECK_MENO_1(p,str) if(!(p)) { perror(str); return -1; }
#define SYS_CALL(p, str) if((p) == -1) { perror(str); exit(EXIT_FAILURE); }
#define CHECK_NULL(p,str) if(!(p)) { perror(str); exit(EXIT_FAILURE); }
/* se la SC ritorna -1 allora restituisco -1 */
#define SC_MENO1(p, str) if(p == -1) { perror(str); return -1; }
#define CHECK(p, str) if((p) != 0) { fprintf(stderr, str); exit(EXIT_FAILURE); }
#define FILENAME1 "planet1.dat"
#define FILENAME2 "planet2.dat"
#define FILENAME3 "planet3.dat"
#define NWORK_DEF 3
#define CHRON_DEF 25
int** Flag_matrix; /* matrice di flag usata per l'aggiornamento */
/* struttura usata per memorizzare le coordinate effettive */
typedef struct coordinate{
int x_up; /* x sopra */
int x_down; /* x in basso */
int y_sx; /* y a sinistra */
int y_dx; /* y a destra */
} coordinate_t;
/* parametri di un thread worker */
typedef struct thWorkerArgs{
int wid; /* worker identifier */
wator_t* pw; /* puntatore al pianeta */
Queue_t* q; /* puntatore alla coda condivisa */
} thWorkerArgs;
typedef struct thDispatcherArgs{
Queue_t* q; /* puntatore alla Queue */
wator_t* pw;
int nrow;
int ncol;
} thDispatcherArgs;
typedef struct thCollectorArgs{
wator_t* pw; /* puntatore al pianeta */
int nchron; /* ogni quanti chronon deve essere effettuata la simulazione */
Queue_t* q; /* puntatore alla coda condivisa */
} thCollectorArgs;
/* ottiene la coordinata adiacente a quella attuale tenendo presente che
la matrice corrisponde ad un pianeta rotondo.
\param a può essere la x oppure la y
\param incr è l'incremento della coordinata, può essere +-1
\param n può essere il numero di righe o il numero di colonne
x +1 -> down
x -1 -> up
y +1 -> dx
y -1 -> sx
\retval la coordinata effettiva
*/
int get_coordinata(int a, int incr, int n);
/* gli squali mangiano e si spostano, i pesci si spostano.
la funzione è chiamata sia in shark_rule1 che in fish_rule3.
\param pw puntatore alla struttura di simulazione
\param (x,y) coordinate iniziali del pesce / squalo
\param (*k,*l) coordinate finali del pesce / squalo
\param index (valore da 0 a 3)
\param *f coordinate adiacenti nel mondo
in base al valore di index lo squalo/pesce si sposta nel modo seguente:
index == 0 -> up
index == 1 -> dx
index == 2 -> down
index == 3 -> sx
\retval void
*/
void move_or_eat(wator_t* pw, int index, int x, int y, int* k, int* l, coordinate_t* f);
/* fa nascere un pesce oppure uno squalo.
\param pw puntatore alla struttura di simulazione
\param (x,y) coordinate del pesce / squalo
\param (*k,*l) coordinate del pesce / squalo appena generato
\param *f coordinate adiacenti nel mondo
index ha lo stesso funzionamento che ha nella funzione move_or_eat()
\retval void
*/
void born(wator_t* pw, int index, int x, int y, int* k, int* l, coordinate_t* f);
/* libera la memoria.
\param a matrice di qualsiasi tipo
\param nrow numero righe
*/
void clean(void** a, int nrow);
/* alloca matrice di interi
\param nrow numero righe
\param ncol numero colonne
gli elementi della matrice vengono inizializzati a 0.
\retval a matrice di interi
\retval NULL in caso di errore
*/
int** alloca_int(int nrow, int ncol);
/* alloca matrice di celle cell_t.
\param nrow numero righe
\param ncol numero colonne
\retval matrice di celle
*/
cell_t** alloca_cell_t(int nrow, int ncol);
/* controlla gli argomenti passati da linea di comando al processo wator.
\param argc numero argomenti
\param argv[] vettore degli argomenti
\param int* worker
\param int* chronon
\param char** filename , punterà al nome del file specificato
\param char** dumpf, punterà al nome del file di dump specificato
il numero di worker e chronon, se specificate le opzioni -v e -n, vengono inizializzati.
filename punterà al nome del file che rappresenta il pianeta.
dumpf, se viene specificata l'opzione -f, punterà al nome del file sul quale il
processo visualizer effettuerà il dump.
\retval -1 in caso di errore
\retval 0 in caso di successo
*/
int checkAndSetArgs(int argc, char* argv[], int* worker, int* chronon, char** filename, char** dumpf);
/* setta la maschera 'mask' bloccando i segnali SIGUSR1, SIGINT e SIGTERM
\param mask, puntatore a una maschera
\retaval 0 in caso di successo
\retval -1 in caso di errore
*/
int setMask(sigset_t* mask);
/* inizializza la struttura che rappresenta i parametri dei thread worker.
\param pthread** worker, indirizzo di un array di worker
\param thWorkerArgs** workerArgs, indirizzo di un array di struct
\param wator* pw
\retval 0 in caso di successo, -1 altrimenti
*/
int init_worker(pthread_t** worker, thWorkerArgs** workerArgs, wator_t* pw, Queue_t* q);
/* procedura eseguita dai vari thread Worker
\param struct thWorkerArgs
si comporta come previsto nelle specifiche.
\retval (void*) 0 in caso di successo
\retval (void*) 1 in caso di errore
*/
void* thWorker(void* arg);
/* procedura eseguita dal thread Dispatcher
\param struct thDispatcherArgs
si comporta come previsto nelle specifiche.
\retval (void*) 0 in caso di successo
\retval (void*) 1 in caso di errore
*/
void* thDispatcher(void* arg);
/* procedura eseguita dal thread Collector
\param struct thCollectorArgs
si comporta come previsto nelle specifiche.
\retval (void*) 0 in caso di successo
\retval (void*) 1 in caso di errore
*/
void* thCollector(void* arg);
/* inizializza la struttura che rappresenta i parametri del thread dispatcher
\param thDispatcherArgs* d, puntatore alla struttura dati dei parametri
\param Queue_t* q, puntatore alla coda condivisa
\param wator_t* pw puntatore al pianeta
\retval void
*/
void init_dispatcher(thDispatcherArgs* d, Queue_t* q, wator_t* pw);
/* inizializza la struttura che rappresenta i parametri del thread collector
\param thCollectorArgs* c, puntatore alla struttura dati dei parametri
\param Queue_t* q, puntatore alla coda condivisa
\param wator_t* pw puntatore al pianeta
\param int nchron, ogni quanti chronon deve essere effettuata la visualizzazione
\retval void
*/
void init_collector(thCollectorArgs* c, int nchron, wator_t* pw, Queue_t* q);
/* accede in mutua esclusione alla condizione di terminazione dei thread
\retval 1 se terminazione == 1;
\retval 0 se terminazione == 0;
*/
int terminate();
/* accede in mutua esclusione e setta la variabile 'terminazione' a 1 */
void setTerminate();
/* accede in mutua esclusione alla struttura di simulazione e restituisce il chronon corrente.
\param pw puntatore al pianeta
\result pw->chronon
*/
int getChronon(wator_t* pw);
/* stampa l'exit status del processo visualizer.
\param pid, process identifier
\param status, exit status
*/
void print_status(int pid, int status);
/* ottiene il valore di 'count'.
\retval result, valore del contatore
*/
int getCount();
/* calcola un chronon aggiornando tutti i valori della simulazione e il 'rettangolo'
\param pw puntatore al pianeta
\param r rettangolo (sottomatrice) da aggiornare
\return 0 se tutto e' andato bene
\return -1 se si e' verificato un errore
*/
int updateRett(wator_t* pw, Rettangolo_t* r);
#endif