5 #include "lock_protocol.h"
6 #include "lock_client.h"
12 #include "lang/verify.h"
13 #include "lock_client_cache_rsm.h"
15 #include <sys/types.h>
19 char tprintf_thread_prefix = 'c';
22 const int nt = 6; //XXX: lab1's rpc handlers are blocking. Since rpcs uses a thread pool of 10 threads, we cannot test more than 10 blocking rpc.
24 lock_client_cache_rsm **lc = new lock_client_cache_rsm * [nt];
25 lock_protocol::lockid_t a = "1";
26 lock_protocol::lockid_t b = "2";
27 lock_protocol::lockid_t c = "3";
29 // check_grant() and check_release() check that the lock server
30 // doesn't grant the same lock to both clients.
31 // it assumes that lock names are distinct in the first byte.
33 std::mutex count_mutex;
36 check_grant(lock_protocol::lockid_t lid)
39 int x = lid[0] & 0x0f;
41 fprintf(stderr, "error: server granted %s twice\n", lid.c_str());
42 fprintf(stdout, "error: server granted %s twice\n", lid.c_str());
49 check_release(lock_protocol::lockid_t lid)
52 int x = lid[0] & 0x0f;
54 fprintf(stderr, "error: client released un-held lock %s\n", lid.c_str());
63 tprintf ("acquire a release a acquire a release a\n");
73 tprintf ("acquire a acquire b release b release a\n");
89 tprintf ("test2: client %d acquire a release a\n", i);
91 tprintf ("test2: client %d acquire done\n", i);
94 tprintf ("test2: client %d release\n", i);
97 tprintf ("test2: client %d release done\n", i);
106 tprintf ("test3: client %d acquire a release a concurrent\n", i);
107 for (int j = 0; j < 10; j++) {
110 tprintf ("test3: client %d got lock\n", i);
122 tprintf ("test4: thread %d acquire a release a concurrent; same clnt\n", i);
123 for (int j = 0; j < 10; j++) {
126 tprintf ("test4: thread %d on client 0 got lock\n", i);
138 tprintf ("test5: client %d acquire a release a concurrent; same and diff clnt\n", i);
139 for (int j = 0; j < 10; j++) {
140 if (i < 5) lc[0]->acquire(a);
141 else lc[1]->acquire(a);
143 tprintf ("test5: client %d got lock\n", i);
145 if (i < 5) lc[0]->release(a);
146 else lc[1]->release(a);
152 main(int argc, char *argv[])
157 setvbuf(stdout, NULL, _IONBF, 0);
158 setvbuf(stderr, NULL, _IONBF, 0);
162 fprintf(stderr, "Usage: %s [host:]port [test]\n", argv[0]);
169 test = atoi(argv[2]);
170 if(test < 1 || test > 5){
171 tprintf("Test number must be between 1 and 5\n");
176 tprintf("cache lock client\n");
177 for (int i = 0; i < nt; i++) lc[i] = new lock_client_cache_rsm(dst);
179 if(!test || test == 1){
183 if(!test || test == 2){
185 for (int i = 0; i < nt; i++) {
186 int *a = new int (i);
187 th[i] = std::thread(test2, a);
189 for (int i = 0; i < nt; i++) {
194 if(!test || test == 3){
198 for (int i = 0; i < nt; i++) {
199 int *a = new int (i);
200 th[i] = std::thread(test3, a);
202 for (int i = 0; i < nt; i++) {
207 if(!test || test == 4){
211 for (int i = 0; i < 2; i++) {
212 int *a = new int (i);
213 th[i] = std::thread(test4, a);
215 for (int i = 0; i < 2; i++) {
220 if(!test || test == 5){
225 for (int i = 0; i < nt; i++) {
226 int *a = new int (i);
227 th[i] = std::thread(test5, a);
229 for (int i = 0; i < nt; i++) {
234 tprintf ("%s: passed all tests successfully\n", argv[0]);