alla fine abbiamo risolto con un thread nuovo che manda le richieste, ora però ho un problema di segmentation fault che non riusciamo a risolvere.....
allora, c'è una coda circolare fatta di un array di struct, il thread client inserisce nella coda (si blocca se è piena)
codice:
int insert_CA(struct element x)
{
if(a.num == 5)
return 0;
a.elements[a.head] = x;
a.head = (a.head + 1) % 5;
a.num++;
return 1;
}
poi sblocca eventuali thread bloccati se ce ne sono altrimenti lascia in coda e se lo prenderà il primo thread che finisce.
codice:
int extract_CA(struct element *x)
{
if(a.num == 0)
return 0;
*x = a.elements[a.tail];
a.tail = (a.tail + 1) % 5;
a.num--;
return 1;
}
questo è il codice di extract, ma funziona correttamente vedendo i log che generiamo.
il problema è qui:
codice:
void put_richiesta(struct buffer *b)
{
struct element *x;
int i=0;
pthread_mutex_lock(&b->m);
fprintf(stderr, "T bloccato\n");
b->blocked_readers++;
pthread_cond_wait(&b->block_read, &b->m);
fprintf(stderr, "T sbloccato........\n");
fprintf(stderr, "prima dell'estrazione "); print_CA();
if (extract_CA(x) == 1) {
//fprintf(stderr, "1");
for (i=0; i<x->t; i++) {
fprintf(stderr, "%s\n", x->msg);
sleep(1);
}
//fprintf(stderr, "2");
pthread_mutex_unlock(&b->m);
fprintf(stderr, "dopo l'estrazione ");print_CA();
}
else {
fprintf(stderr, "Non ci sono elementi in coda\n");
pthread_mutex_unlock(&b->m);
}
extract_CA(x);
pthread_mutex_unlock(&b->m);
}
La prima volta che estraiamo lo fa perfettamente, dopo di che mettiamo qualcos'altro nella coda, il client quindi sblocca un thread che riesegue questa funzione e il programma si blocca alla riga che vi ho segnato in rosso....
Perchè?
non sappiamo più come fare..