changes.
[IRC.git] / Robust / src / Tests / memPool / testMemPool-poolalloc.c
1 #include <stdlib.h>
2 #include <stdio.h>
3
4 #include <pthread.h>
5
6 #include "memPool.h"
7
8
9 static const int POOLSIZE = 100;
10
11 static MemPool* barPool;
12 static MemPool* bazPool;
13 static MemPool* fooPool;
14
15
16 struct bar {
17   int x;
18   char takeSpace[1000];
19 };
20
21 struct baz {
22   int y;
23   char takeSpace[1000];
24 };
25
26 struct foo {
27   struct bar* br;
28   struct baz* bz;
29   int z;
30   char takeSpace[1000];
31 };
32
33
34 void* workerMain( void* arg ) {
35
36   struct foo* f = (struct foo*)arg;
37
38   f->z = f->br->x + f->bz->y;
39
40   poolfree( barPool, f->br );
41   poolfree( bazPool, f->bz );
42   
43   pthread_exit( arg );
44 }
45
46
47 int main() {
48
49   int i;
50
51   struct bar* br;
52   struct baz* bz;
53   struct foo* f;
54
55   int            numThreads = 10000;
56   pthread_t      threads[numThreads];
57   pthread_attr_t attr;
58
59   int total = 0;
60
61   barPool = poolcreate( sizeof( struct bar ), POOLSIZE );
62   bazPool = poolcreate( sizeof( struct baz ), POOLSIZE );
63   fooPool = poolcreate( sizeof( struct foo ), POOLSIZE );
64
65   pthread_attr_init( &attr );
66   pthread_attr_setdetachstate( &attr, 
67                                PTHREAD_CREATE_JOINABLE );
68
69
70   for( i = 0; i < numThreads; ++i ) {
71
72     br = poolalloc( barPool );
73     bz = poolalloc( bazPool );
74     f  = poolalloc( fooPool );
75
76     br->x = i;
77     bz->y = -4321;
78     
79     f->br = br;
80     f->bz = bz;
81
82     pthread_create( &(threads[i]),
83                     &attr,
84                     workerMain,
85                     (void*)f );
86
87     if( i % 1000 == 0 ) {
88       printf( "." );
89     }
90
91     if( i % 100 == 0 ) {
92       sched_yield();
93     }
94   }
95   
96   printf( "\n" );
97
98   for( i = 0; i < numThreads; ++i ) {
99
100     f = NULL;
101     pthread_join( threads[i],
102                   (void**)&f );
103
104     total += f->z;
105     poolfree( fooPool, f );
106
107     if( i % 1000 == 0 ) {
108       printf( "+" );
109     }
110   }
111   
112   printf( "\nTotal=%d\n", total );
113
114   return 0;
115 }