Ciao a tutti ho una funzione (make_connected_user_list) che crea una lista di nomi che mi crea qualche problema.
Più in dettaglio da un thread (frammento di codice sotto) dichiaro un puntatore ad una stringa e poi chiamo la funzione make_connected_user_list
char *s=NULL;
if((make_connected_user_list(s))!=0){
fprintf(stderr,"Errore nella creazione della lista degli utenti connessi; Funzione worker\n");
//setto il messaggio di errore da inviare al client
setHeader(&msg->hdr, OP_FAIL, server);
setData(&msg->data, "", NULL, 0);
//aggiorno le statistiche:errori++
if((update_stats(0,0,0,0,0,0,1,0,0))!=0)
fprintf(stderr, "Errore nell'aggiornamento delle statistiche\n");
failure++;
}
else{
//aggiorno le statistiche:operazione lecite++
if((update_stats(0,0,0,0,0,0,0,1,0))!=0)
fprintf(stderr, "Errore nell'aggiornamento delle statistiche\n");
//setto il messaggio da inviare
setHeader(&msg->hdr, OP_OK, server);
printf("%s\n",s);
setData(&msg->data, "", s, strlen(s)+1);
}
Se provo a stampare la stringa prima della terminazione della funzione ottengo il risultato che mi aspetto ovvero la lista dei nomi. Se, invece, provo a stampare la stringa dal thread dopo la terminazione della funzione mi viene stampato NULL.
Questo è il codice della funzione make_connected_user_list
int make_connected_user_list(char *s){
int err=-1, dim=0, i=0, namesize=0;
//prendo la lock per l'array connected_clients
if((err=pthread_mutex_lock(&mux_connected_clients))!=0){
errno=err;
fprintf(stderr,"Errore nel prendere la lock; Funzione connect_user; Variabile connected_clients\n");
perror("lock");
return -1;
}
//calcolo la dimensione del nome, alloco lo spazio necessario nel buffer e gli concateno il nome del client
for(i=0; i<config.MaxConnections; i++){
if(connected_clients[i].stato==1){
namesize=strlen(connected_clients[i].name)+2;
dim=dim+namesize;
s=realloc(s, dim*sizeof(char));
if(s==NULL){
fprintf(stderr, "Errore durante la riallocazione della lista di utenti connessi\n");
return -1;
}
strncat(s, connected_clients[i].name, namesize-1);
strncat(s, "-", 1);
}
}
s[(strlen(s)-1)]='\0';
//rilascio la lock per l'array connected_clients
if((err=pthread_mutex_unlock(&mux_connected_clients))!=0){
errno=err;
fprintf(stderr,"Errore nel rilasciare la lock; Funzione connect_user; Variabile connected_clients\n");
perror("lock");
return -1;
}
return 0;
}
Qualcuno sa dirmi dove sbaglio?