remove double export of xseg symbols
[archipelago] / xseg / xtypes / xpool_test.c
1 #include <xpool.h>
2 #include <stdlib.h>
3 #include <pthread.h>
4 #include <sys/time.h>
5 #include <xseg/xseg.h>
6
7 uint64_t size = 16;
8 uint64_t loops = 100000;
9
10 struct xpool xp;
11 struct xq xq;
12
13 void test_all_funcs(){
14         xpool_index idx1, idx2, ret;
15         xpool_data data;
16         
17         idx1 = xpool_add(&xp, (xpool_data) 5);
18         if (idx1 == NoSerial) {
19                 printf("couldn't add idx1\n");
20                 return 1;
21         }
22         printf("added 5 in idx %llu\n", idx1);
23         idx2 = xpool_add(&xp, (xpool_data) 6);
24         if (idx2 == NoSerial) {
25                 printf("couldn't add idx2\n");
26                 return 1;
27         }
28         printf("added 6 in idx %llu\n", idx2);
29
30         ret = xpool_peek(&xp, &data);
31         if (ret == NoSerial) {
32                 printf("couldn't peek\n");
33                 return 1;
34         }
35         printf("peeked xpool (idx %llu) and took data %u\n", ret, data);
36         ret = xpool_peek_idx(&xp, idx2, &data);
37         if (ret != idx2) {
38                 printf("couldn't peek\n");
39                 return 1;
40         }
41         printf("peeked xpool in idx %llu and took data %u\n", idx2, data);
42         ret = xpool_peek_and_fwd(&xp, &data);
43         if (ret == NoSerial) {
44                 printf("couldn't peek\n");
45                 return 1;
46         }
47         printf("peeked and fwd xpool (idx %llu) and took data %u\n", ret, data);
48         ret = xpool_peek_and_fwd(&xp, &data);
49         if (ret == NoSerial) {
50                 printf("couldn't peek\n");
51                 return 1;
52         }
53         printf("peeked and fwd xpool (idx %llu) and took data %u\n", ret, data);
54
55         ret = xpool_remove(&xp, idx1, &data);
56         if (ret != idx1) {
57                 printf("couldn't remove idx1\n");
58                 return 1;
59         }
60         if (data != (xpool_data) 5) {
61                 printf("idx1 returned wrong value (%u)\n", data);
62                 return -1;
63         }
64         printf("removed idx1 with data %u\n", data);
65         ret = xpool_remove(&xp, idx2, &data);
66         if (ret != idx2) {
67                 printf("couldn't remove idx2\n");
68                 return 1;
69         }
70         if (data != (xpool_data) 6) {
71                 printf("idx2 returned wrong value (%u)\n", data);
72                 return -1;
73         }
74         printf("removed idx2 with data %u\n", data);
75
76         printf("test succesfull\n");
77 }
78
79 void *xpool_func(void *arg)
80 {
81         int id = (int) arg;
82         xpool_index idx, ret;
83         xpool_data data;
84         uint64_t i ;
85         struct timeval start, end;
86
87         gettimeofday(&start, NULL);
88         for (i = 0; i < loops; i++) {
89                 idx = xpool_add(&xp, (xpool_data) id);
90                 if (idx == NoSerial) {
91                         printf("couldn't add idx\n");
92                         return NULL;
93                 }
94                 /*
95                 ret = xpool_peek_idx(&xp, idx, &data);
96                 if (ret != idx) {
97                         printf("couldn't peek\n");
98                         return NULL;
99                 }
100                 if (data != (xpool_data) id){
101                         printf("peekidx returned wrong value %u instead of %u\n", 
102                                         data, (xpool_data) id);
103                         return NULL;
104                 }
105                 ret = xpool_peek_and_fwd(&xp, &data);
106                 if (ret == NoSerial) {
107                         printf("couldn't peek and fwd\n");
108                         return NULL;
109                 }
110                 */
111                 ret = xpool_remove(&xp, idx, &data);
112 //              if (ret != idx) {
113 //                      printf("couldn't remove idx: %llu\n", idx);
114 //                      return NULL;
115 //              }
116 //              if (data != (xpool_data) id){
117 //                      printf("remove returned wrong value %u instead of %u\n", 
118 //                                      data, (xpool_data) id);
119 //                      return NULL;
120 //              }
121         }
122         gettimeofday(&end, NULL);
123         timersub(&end, &start, &end);
124         printf("%d: test succesfull (%llu loops in %u.%us)\n", id, loops, end.tv_sec, end.tv_usec);
125
126         return NULL;
127 }
128
129 void *xq_func(void *arg)
130 {
131         int id = (int) arg;
132         xqindex idx, ret;
133         uint64_t i ;
134         struct timeval start, end;
135
136         gettimeofday(&start, NULL);
137         for (i = 0; i < loops; i++) {
138                 
139                 idx = xq_append_tail(&xq, (xqindex) id);
140                 if (idx == NoSerial) {
141                         printf("couldn't add idx\n");
142                         return NULL;
143                 }
144                 /*
145                 ret = xpool_peek_idx(&xp, idx, &data);
146                 if (ret != idx) {
147                         printf("couldn't peek\n");
148                         return NULL;
149                 }
150                 if (data != (xpool_data) id){
151                         printf("peekidx returned wrong value %u instead of %u\n", 
152                                         data, (xpool_data) id);
153                         return NULL;
154                 }
155                 ret = xpool_peek_and_fwd(&xp, &data);
156                 if (ret == NoSerial) {
157                         printf("couldn't peek and fwd\n");
158                         return NULL;
159                 }
160                 */
161                 ret = xq_pop_head(&xq);
162                 //if (ret != idx) {
163                 //      printf("couldn't remove idx: %llu\n", idx);
164                 //      return NULL;
165                 //}
166                 //if (ret != (xqindex) id){
167                 //      printf("remove returned wrong value %u instead of %u\n", 
168                 //                      ret, (xqindex) id);
169                 //      return NULL;
170                 //}
171         }
172         gettimeofday(&end, NULL);
173         timersub(&end, &start, &end);
174         printf("%d: test succesfull (%llu loops in %u.%us)\n", id, loops, end.tv_sec, end.tv_usec);
175
176         return NULL;
177 }
178
179
180 int main(int argc, const char *argv[])
181 {
182
183         size = atoi(argv[1]);
184         loops = atoi(argv[2]);
185
186         struct xpool_node* mem = malloc(sizeof(struct xpool_node) * size);
187         xqindex* xqmem = malloc(sizeof(xqindex) * size);
188         pthread_t *thread, tid;
189         void *ret;
190         int i;
191
192         thread = malloc(sizeof(pthread_t)*size);
193
194         printf("Testing xpool\n");
195         xpool_init(&xp, size, mem);
196         for (i = 0; i < size; i++) {
197                 pthread_create(thread+i, NULL, xpool_func, (void *) i);
198         }
199
200         for (i = 0; i < size; i++) {
201                 pthread_join(thread[i], &ret);
202         }
203         
204         printf("Testing xq\n");
205         xq_init_empty(&xq, size, xqmem);
206         for (i = 0; i < size; i++) {
207                 pthread_create(thread+i, NULL, xq_func, (void *) i);
208         }
209
210         for (i = 0; i < size; i++) {
211                 pthread_join(thread[i], &ret);
212         }
213
214
215         // and again
216
217         return 0;
218 }