nfs-ganesha 1.4
|
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 */