Come scritto nel titolo, nel caso in cui tento di rimuovere quando la lista è vuota mi porta ad una situazione di stallo nella removeNode, non rilasciando quindi la lock e non permettendomi di inserire nuovi valori.
Grazie mille a tutti quelli che proveranno ad aiutarmi
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#define LOCK(l) if (pthread_mutex_lock(l)!=0) { \
fprintf(stderr, "ERRORE FATALE lock\n"); \
pthread_exit((void*)EXIT_FAILURE); \
}
#define UNLOCK(l) if (pthread_mutex_unlock(l)!=0) { \
fprintf(stderr, "ERRORE FATALE unlock\n"); \
pthread_exit((void*)EXIT_FAILURE); \
}
#define WAIT(c,l) if (pthread_cond_wait(c,l)!=0) { \
fprintf(stderr, "ERRORE FATALE wait\n"); \
pthread_exit((void*)EXIT_FAILURE); \
}
#define SIGNAL(c) if (pthread_cond_signal(c)!=0) { \
fprintf(stderr, "ERRORE FATALE signal\n"); \
pthread_exit((void*)EXIT_FAILURE); \
}
typedef struct node {
int data;
struct node * next;
} node;
pthread_mutex_t lock_coda = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t not_empty = PTHREAD_COND_INITIALIZER;
void insertNode (node ** list, int data);
int removeNode (node ** list);
int findNode(node** list, int data);
void stampalista(node* lis);
node * lista = NULL;
int len(node* lis){
node* curr = lis;
int value = 0;
if(curr == NULL){
return 0;
}
while(curr != NULL){
value++;
curr = curr->next;
}
return value;
}
int main(int argc, const char * argv[]) {
int value=0;
while(1){
while(scanf("%d",&value) != 1){
printf("Errore. Inserisci un numero\n");
scanf("%*[^\n]");
}
if(value > 0){
insertNode(&lista, value);
}
else if(value == 0){
removeNode(&lista);
}
else{
stampalista(lista);
break;
}
}
return 0;
}
void stampalista(node* lis){
if(lis != NULL){
printf("%d -> ",lis->data);
stampalista(lis->next);
}
else{
printf("NULL\n");
}
}
//INSERIMENTO IN TESTA
void insertNode (node ** list, int data) {
LOCK(&lock_coda);
node * new = malloc(sizeof(node));
new->data = data;
new->next = *list;
//INSERISCI IN TESTA
*list = new;
SIGNAL(¬_empty);
UNLOCK(&lock_coda);
printf("inserito con successo\n");
}
//RIMOZIONE IN CODA
int removeNode (node ** list) {
LOCK(&lock_coda);
while (lista == NULL) {
printf("aspetto\n");
int err = pthread_cond_wait(¬_empty, &lock_coda);
printf("%d\n", err);
printf("Un va oltre\n");
}
int data;
node * curr = *list;
node * prev = NULL;
while (curr->next != NULL) {
prev = curr;
curr = curr->next;
}
data = curr->data;
if (prev == NULL) {
free(curr);
*list = NULL;
}else{
prev->next = NULL;
free(curr);
}
UNLOCK(&lock_coda);
printf("Eliminato con successo\n");
return data;
}
int findNode(node** list, int data){
LOCK(&lock_coda);
node* curr = *list;
while(curr != NULL){
if(curr->data == data){
return 1;
}
else{
curr = curr->next;
}
}
UNLOCK(&lock_coda);
return 0;
}