2011-08-09 2 views
4

J'ai un serveur écrit en C qui génère un nouveau thread chaque fois qu'un nouveau client se connecte. Afin de tester mon serveur, j'ai écrit un script qui émule 500 clients. Le serveur gère les deux premières centaines de clients et à la fin je reçois l'erreur suivante de Valgrind:Que signifie l'erreur VgTs_WaitSys dans Valgrind?

Thread 456: status = VgTs_WaitSys 
==4182== at 0x4E383EC: recv (recv.c:34) 
==4182== by 0x4017F1: process_data (socket2.h:45) 
==4182== by 0x40195E: thread (FBServer.c:82) 
==4182== by 0x4E30A03: start_thread (pthread_create.c:300) 
==4182== by 0x532DD4C: clone (clone.S:112) 

Thread 457: status = VgTs_WaitSys 
==4182== at 0x4E383EC: recv (recv.c:34) 
==4182== by 0x4017F1: process_data (socket2.h:45) 
==4182== by 0x40195E: thread (FBServer.c:82) 
==4182== by 0x4E30A03: start_thread (pthread_create.c:300) 
==4182== by 0x532DD4C: clone (clone.S:112) 

... 

Thread 499: status = VgTs_WaitSys 
==4182== at 0x4E383EC: recv (recv.c:34) 
==4182== by 0x4017F1: process_data (socket2.h:45) 
==4182== by 0x40195E: thread (FBServer.c:82) 
==4182== by 0x4E30A03: start_thread (pthread_create.c:300) 
==4182== by 0x532DD4C: clone (clone.S:112) 

À la ligne 82 FBServer.c, le thread appelle une fonction appelée process_data qui reçoit des données du client. La fonction process_data est indiquée ci-dessous:

void process_data(int clientSock) 
{ 
    size_t n; 
    char jstring[MAX_LEN + 1]; 
    int bytes_received_so_far = 0; 
    int bytes_count; 
    char *buf = NULL; 

    while(bytes_count = recv(clientSock, jstring, MAX_LEN, 0)) 
    { 
     if(bytes_count <= 0) 
     { 
      close(clientSock); 
      pthread_exit(NULL); 
     } 

     printf("Bytes received = %d\n", bytes_count);       
     jstring[bytes_count] = '\0'; 

     ... 
     ... 
    } 
} 

Quelqu'un peut-il m'aider à interpréter les messages d'erreur?

+0

Est-ce la première erreur (ou la sortie du tout) que vous donne Valgrind? – nos

+0

Sur quelle plateforme êtes-vous? Il dépend de la plateforme si vous êtes limité par le nombre de descripteurs de fichiers ouverts. Par exemple, sur ma machine Linux, je peux avoir 1024 fichiers ouverts et 128 connexions semi-ouvertes à la fois. – zdav

Répondre

1

Quelle version de Valgrind utilisez-vous?

Le seul commentaire que je pouvais trouver dans la source était:

VgTs_WaitSys, /* waiting for a syscall to complete */

Il semble indiquer que le programme bloque juste un appel système (recv dans votre cas). Je ne suis pas sûr, mais ce n'est peut-être pas une erreur du tout, juste quelques infos supplémentaires lancées par Valgrind.

+0

Serait compatible avec le message apparaissant juste après un recv() qui bloque. Dans ce cas, ce n'est pas une erreur. – Torp