]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.1/test/src/test_stack.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.1 / test / src / test_stack.c
1 #include "internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 void test_lfds601_stack( void )\r
9 {\r
10   unsigned int\r
11     loop,\r
12     cpu_count;\r
13 \r
14   struct lfds601_stack_state\r
15     *ss;\r
16 \r
17   thread_state_t\r
18     *thread_handles;\r
19 \r
20   /* TRD : there are 5 tests\r
21 \r
22            1. single reader thread per CPU\r
23               - stack always empty\r
24            2. single writer thread per CPU\r
25               - stack always full\r
26            3. one reader and one writer thread per CPU\r
27               - stack balanced\r
28            4. one reader and two writer threads per CPU\r
29               - stack grows\r
30            5. two reader and one writer thread per CPU\r
31               - stack tends to empty\r
32   */\r
33 \r
34   cpu_count = abstraction_cpu_count();\r
35 \r
36   printf( "\n"\r
37           "Stack Test\n"\r
38           "==========\n" );\r
39 \r
40   // TRD : 1. single reader thread per CPU\r
41 \r
42   printf( "\n"\r
43           "1. single reader thread per CPU\n"\r
44           "===============================\n" );\r
45 \r
46   lfds601_stack_new( &ss, 10000 );\r
47 \r
48   thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count * 1 );\r
49 \r
50   for( loop = 0 ; loop < cpu_count ; loop++ )\r
51     abstraction_thread_start( &thread_handles[loop], loop, lfds601_stack_internal_thread_reader, ss );\r
52 \r
53   for( loop = 0 ; loop < cpu_count ; loop++ )\r
54     abstraction_thread_wait( thread_handles[loop] );\r
55 \r
56   lfds601_stack_delete( ss, NULL, NULL );\r
57 \r
58   free( thread_handles );\r
59 \r
60   // TRD : 2. single writer thread per CPU\r
61 \r
62   printf( "\n"\r
63           "2. single writer thread per CPU\n"\r
64           "===============================\n" );\r
65 \r
66   lfds601_stack_new( &ss, 10000 );\r
67 \r
68   thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count * 1 );\r
69 \r
70   for( loop = 0 ; loop < cpu_count ; loop++ )\r
71     abstraction_thread_start( &thread_handles[loop], loop, lfds601_stack_internal_thread_writer, ss );\r
72 \r
73   for( loop = 0 ; loop < cpu_count ; loop++ )\r
74     abstraction_thread_wait( thread_handles[loop] );\r
75 \r
76   lfds601_stack_delete( ss, NULL, NULL );\r
77 \r
78   free( thread_handles );\r
79 \r
80   // TRD : 3. one reader and one writer thread per CPU\r
81 \r
82   printf( "\n"\r
83           "3. one reader and one writer thread per CPU\n"\r
84           "===========================================\n" );\r
85 \r
86   lfds601_stack_new( &ss, 10000 );\r
87 \r
88   thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count * 2 );\r
89 \r
90   for( loop = 0 ; loop < cpu_count ; loop++ )\r
91   {\r
92     abstraction_thread_start( &thread_handles[loop], loop, lfds601_stack_internal_thread_reader, ss );\r
93     abstraction_thread_start( &thread_handles[loop+cpu_count], loop, lfds601_stack_internal_thread_writer, ss );\r
94   }\r
95 \r
96   for( loop = 0 ; loop < cpu_count * 2 ; loop++ )\r
97     abstraction_thread_wait( thread_handles[loop] );\r
98 \r
99   lfds601_stack_delete( ss, NULL, NULL );\r
100 \r
101   free( thread_handles );\r
102 \r
103   // TRD : 4. one reader and two writer threads per CPU\r
104 \r
105   printf( "\n"\r
106           "4. one reader and two writer threads per CPU\n"\r
107           "============================================\n" );\r
108 \r
109   lfds601_stack_new( &ss, 10000 );\r
110 \r
111   thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count * 3 );\r
112 \r
113   for( loop = 0 ; loop < cpu_count ; loop++ )\r
114   {\r
115     abstraction_thread_start( &thread_handles[loop], loop, lfds601_stack_internal_thread_reader, ss );\r
116     abstraction_thread_start( &thread_handles[loop+cpu_count], loop, lfds601_stack_internal_thread_writer, ss );\r
117     abstraction_thread_start( &thread_handles[loop+cpu_count*2], loop, lfds601_stack_internal_thread_writer, ss );\r
118   }\r
119 \r
120   for( loop = 0 ; loop < cpu_count * 3 ; loop++ )\r
121     abstraction_thread_wait( thread_handles[loop] );\r
122 \r
123   lfds601_stack_delete( ss, NULL, NULL );\r
124 \r
125   free( thread_handles );\r
126 \r
127   // TRD : 5. two reader and one writer thread per CPU\r
128 \r
129   printf( "\n"\r
130           "5. two reader and one writer thread per CPU\n"\r
131           "===========================================\n" );\r
132 \r
133   lfds601_stack_new( &ss, 10000 );\r
134 \r
135   thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count * 3 );\r
136 \r
137   for( loop = 0 ; loop < cpu_count ; loop++ )\r
138   {\r
139     abstraction_thread_start( &thread_handles[loop], loop, lfds601_stack_internal_thread_reader, ss );\r
140     abstraction_thread_start( &thread_handles[loop+cpu_count], loop, lfds601_stack_internal_thread_reader, ss );\r
141     abstraction_thread_start( &thread_handles[loop+cpu_count*2], loop, lfds601_stack_internal_thread_writer, ss );\r
142   }\r
143 \r
144   for( loop = 0 ; loop < cpu_count * 3 ; loop++ )\r
145     abstraction_thread_wait( thread_handles[loop] );\r
146 \r
147   lfds601_stack_delete( ss, NULL, NULL );\r
148 \r
149   free( thread_handles );\r
150 \r
151   return;\r
152 }\r
153 \r
154 \r
155 \r
156 \r
157 \r
158 /****************************************************************************/\r
159 thread_return_t CALLING_CONVENTION lfds601_stack_internal_thread_reader( void *lfds601_stack_state )\r
160 {\r
161   struct lfds601_stack_state\r
162     *ss;\r
163 \r
164   void\r
165     *user_data;\r
166 \r
167   time_t\r
168     start_time;\r
169 \r
170   unsigned long long int\r
171     count = 0;\r
172 \r
173   assert( lfds601_stack_state != NULL );\r
174 \r
175   ss = (struct lfds601_stack_state *) lfds601_stack_state;\r
176 \r
177   time( &start_time );\r
178 \r
179   while( time(NULL) < start_time + 10 )\r
180   {\r
181     if( lfds601_stack_pop(ss, &user_data) )\r
182       count++;\r
183   }\r
184 \r
185   printf( "read count = %llu\n", count );\r
186 \r
187   return( (thread_return_t) EXIT_SUCCESS );\r
188 }\r
189 \r
190 \r
191 \r
192 \r
193 \r
194 /****************************************************************************/\r
195 thread_return_t CALLING_CONVENTION lfds601_stack_internal_thread_writer( void *lfds601_stack_state )\r
196 {\r
197   struct lfds601_stack_state\r
198     *ss;\r
199 \r
200   time_t\r
201     start_time;\r
202 \r
203   unsigned long long int\r
204     count = 0;\r
205 \r
206   assert( lfds601_stack_state != NULL );\r
207 \r
208   ss = (struct lfds601_stack_state *) lfds601_stack_state;\r
209 \r
210   time( &start_time );\r
211 \r
212   while( time(NULL) < start_time + 10 )\r
213   {\r
214     // TRD : we don't store any user data\r
215     if( lfds601_stack_push(ss, NULL) )\r
216       count++;\r
217   }\r
218 \r
219   printf( "write count = %llu\n", count );\r
220 \r
221   return( (thread_return_t) EXIT_SUCCESS );\r
222 }\r
223 \r