1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h> 2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <pthread.h> 3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdlib.h> 4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define MANY 1000 5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define LEVEL 100 6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef struct { 7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pthread_mutex_t m[MANY]; 8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pthread_mutex_t d; 9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} Level; 10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Level level[LEVEL]; 12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int stat_mutex_init = 0; 14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int stat_mutex_lock = 0; 15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int stat_mutex_unlock = 0; 16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int stat_mutex_destroy = 0; 17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* t2t.c : test program for the laog data structure performance testing 19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov and "shaking" : it creates, locks/unlocks and destroy mutex. 20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov USAGE: t2t [many] [level] [loops] 22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov many (default 100) : how many locks are created/locked/unlocked at a certain level. 23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov level (default 1) : how many levels of "nested locks" are done 24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov loops : how many times these locks are created and destroyed and locked/unlocked) */ 25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define check if (ret != 0) printf("error %d at line %d\n", ret, __LINE__) 26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint doit(int argc, char*argv[]) 27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int l, i; 29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int ret; 30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int clo_many = 100; 32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int clo_level = 1; 33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (argc >= 2) clo_many = atoi(argv[1]); 35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (argc >= 3) clo_level = atoi(argv[2]); 36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (clo_many > MANY) { 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("error argv[1] (many arg) %d > max MANY %d\n", clo_many, MANY); 39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exit(1); 40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (clo_level > LEVEL) { 43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("error argv[2] (level arg) %d > max LEVEL %d\n", clo_level, LEVEL); 44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov exit(1); 45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf ("many %d level %d total_locks: %d\n", 48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov clo_many, clo_level, 49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov clo_many * clo_level + clo_level * (clo_level == 1 ? 0 : 1)); 50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (l = 0; l < clo_level; l++) { 52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf ("init level %d\n", l); 53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (i = 0; i < clo_many; i++) { 54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ret = pthread_mutex_init (&level[l].m[i], NULL); 55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov check; 56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stat_mutex_init++; 57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (clo_level > 1) { 59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ret = pthread_mutex_init (&level[l].d, NULL); 60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov check; 61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stat_mutex_init++; 62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (l = 0; l < clo_level; l++) { 66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf ("locking level %d\n", l); 67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (i = 0; i < clo_many; i++) { 68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ret = pthread_mutex_lock (&level[l].m[i]); 69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov check; 70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stat_mutex_lock++; 71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (clo_level > 1) { 73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ret = pthread_mutex_lock (&level[l].d); 74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov check; 75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stat_mutex_lock++; 76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (l = 0; l < clo_level; l++) { 80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf ("unlocking level %d\n", l); 81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (i = 0; i < clo_many; i++) { 82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ret = pthread_mutex_unlock (&level[l].m[i]); 83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov check; 84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stat_mutex_unlock++; 85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (clo_level > 1) { 87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ret = pthread_mutex_unlock (&level[l].d); 88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stat_mutex_unlock++; 89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov check; 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (l = 0; l < clo_level; l++) { 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf ("deleting level %d\n", l); 95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (clo_level > 1) { 96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ret = pthread_mutex_destroy (&level[l].d); 97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /// this tests the influence of the deletion in another order. 98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov check; 99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stat_mutex_destroy++; 100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (i = 0; i < clo_many; i++) { 102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ret = pthread_mutex_destroy (&level[l].m[i]); 103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov check; 104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stat_mutex_destroy++; 105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return 0; 108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main(int argc, char*argv[]) 111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int loops = 1; 113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int i; 114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (argc >= 4) loops = atoi(argv[3]); 115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf ("loops %d\n", loops); 117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (i = 0; i < loops; i++) 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov doit(argc, argv); 119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf ("stats: init %d lock %d unlock %d destroy %d\n", 121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stat_mutex_init, stat_mutex_lock, 122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov stat_mutex_unlock, stat_mutex_destroy); 123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return 0; 124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 126