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