nfs-ganesha 1.4

test_rw.c

Go to the documentation of this file.
00001 /*
00002  * vim:expandtab:shiftwidth=8:tabstop=8:
00003  *
00004  * test_rw.c: test program for rw locks 
00005  *
00006  * $Header: /cea/home/cvs/cvs/SHERPA/BaseCvs/GANESHA/src/RW_Lock/test_rw.c,v 1.3 2004/08/16 14:48:38 deniel Exp $
00007  *
00008  * $Log: test_rw.c,v $
00009  * Revision 1.3  2004/08/16 14:48:38  deniel
00010  * Distrib de RW_Lock et HashTable avec les tests de non regression
00011  *
00012  * Revision 1.2  2004/08/16 12:49:09  deniel
00013  * Mise a plat ok pour HashTable et RWLock
00014  *
00015  * Revision 1.1  2004/08/16 09:35:08  deniel
00016  * Population de la repository avec les Hashtables et les RW_Lock
00017  *
00018  * Revision 1.5  2003/12/19 16:31:52  deniel
00019  * Resolution du pb de deadlock avec des variables de conditions
00020  *
00021  * Revision 1.4  2003/12/19 13:18:58  deniel
00022  * Identification du pb de deadlock: on ne peux pas unlocker deux fois de suite
00023  *
00024  * Revision 1.3  2003/12/18 14:15:38  deniel
00025  * Correction d'un probleme lors de la declaration des init de threads
00026  *
00027  * Revision 1.1.1.1  2003/12/17 10:29:49  deniel
00028  * Recreation de la base 
00029  *
00030  */
00031 #ifdef HAVE_CONFIG_H
00032 #include "config.h"
00033 #endif
00034 
00035 #include <stdio.h>
00036 #include <pthread.h>
00037 #include <errno.h>
00038 #include <unistd.h>
00039 #include <stdlib.h>
00040 #include "RW_Lock.h"
00041 #include "log.h"
00042 
00043 #define MAX_WRITTERS 3
00044 #define MAX_READERS 5
00045 #define NB_ITER 40
00046 #define MARGE_SECURITE 10
00047 
00048 rw_lock_t lock;
00049 
00050 int OkWrite = 0;
00051 int OkRead = 0;
00052 
00053 void *thread_writter(void *arg)
00054 {
00055   int duree_sleep = 1;
00056   int nb_iter = NB_ITER;
00057 
00058   while(nb_iter > 0)
00059     {
00060       P_w(&lock);
00061       sleep(duree_sleep);
00062       V_w(&lock);
00063       nb_iter -= 1;
00064     }
00065   OkWrite = 1;                  /* Ecriture concurrente ici, mais on s'en fout (pas d'impact) */
00066   return NULL;
00067 }                               /* thread_writter */
00068 
00069 void *thread_reader(void *arg)
00070 {
00071   int duree_sleep = 1;
00072   int nb_iter = NB_ITER;
00073 
00074   while(nb_iter > 0)
00075     {
00076       P_r(&lock);
00077       sleep(duree_sleep);
00078       V_r(&lock);
00079       nb_iter -= 1;
00080     }
00081   OkRead = 1;                   /* Ecriture concurrente ici, mais on s'en fout (pas d'impact) */
00082   return NULL;
00083 }                               /* thread_writter */
00084 
00085 int main(int argc, char *argv[])
00086 {
00087   SetDefaultLogging("TEST");
00088   SetNamePgm("test_rw");
00089   pthread_attr_t attr_thr;
00090   pthread_t ThrReaders[MAX_READERS];
00091   pthread_t ThrWritters[MAX_WRITTERS];
00092   int i;
00093   int rc;
00094 
00095   pthread_attr_init(&attr_thr);
00096   pthread_attr_setscope(&attr_thr, PTHREAD_SCOPE_SYSTEM);
00097   pthread_attr_setdetachstate(&attr_thr, PTHREAD_CREATE_JOINABLE);
00098 
00099   LogTest("Init lock: %d", rw_lock_init(&lock));
00100 
00101   LogTest("ESTIMATED TIME OF TEST: %d s",
00102          (MAX_WRITTERS + MAX_READERS) * NB_ITER + MARGE_SECURITE);
00103   fflush(stdout);
00104 
00105   for(i = 0; i < MAX_WRITTERS; i++)
00106     {
00107       if((rc =
00108           pthread_create(&ThrWritters[i], &attr_thr, thread_writter, (void *)NULL)) != 0)
00109         {
00110           LogTest("pthread_create: Error %d %d ", rc, errno);
00111           LogTest("RW_Lock Test FAILED: Bad allocation thread");
00112           exit(1);
00113         }
00114     }
00115 
00116   for(i = 0; i < MAX_READERS; i++)
00117     {
00118       if((rc =
00119           pthread_create(&ThrReaders[i], &attr_thr, thread_reader, (void *)NULL)) != 0)
00120         {
00121           LogTest("pthread_create: Error %d %d ", rc, errno);
00122           LogTest("RW_Lock Test FAILED: Bad allocation thread");
00123           exit(1);
00124         }
00125     }
00126 
00127   LogTest("Main thread sleeping while threads run locking tests");
00128 
00129   sleep((MAX_WRITTERS + MAX_READERS) * NB_ITER + MARGE_SECURITE);
00130 
00131   LogTest("End of sleep( %d ) ",
00132          (MAX_WRITTERS + MAX_READERS) * NB_ITER + MARGE_SECURITE);
00133   if((OkWrite == 1) && (OkRead == 1))
00134     {
00135       LogTest("Test RW_Lock succeeded: no deadlock detected");
00136       exit(0);
00137       return 0;                 /* for compiler */
00138     }
00139   else
00140     {
00141       if(OkWrite == 0)
00142         LogTest("RW_Lock test FAIL: deadlock in the editors");
00143       if(OkRead == 0)
00144         LogTest("RW_Lock Test FAILED: deadlock in the drive");
00145       exit(1);
00146       return 1;                 /* for compiler */
00147 
00148     }
00149 
00150 }                               /* main */