1 #include "internal.h"
\r
7 /****************************************************************************/
\r
8 void test_lfds601_stack( void )
\r
14 struct lfds601_stack_state
\r
20 /* TRD : there are 5 tests
\r
22 1. single reader thread per CPU
\r
23 - stack always empty
\r
24 2. single writer thread per CPU
\r
26 3. one reader and one writer thread per CPU
\r
28 4. one reader and two writer threads per CPU
\r
30 5. two reader and one writer thread per CPU
\r
31 - stack tends to empty
\r
34 cpu_count = abstraction_cpu_count();
\r
40 // TRD : 1. single reader thread per CPU
\r
43 "1. single reader thread per CPU\n"
\r
44 "===============================\n" );
\r
46 lfds601_stack_new( &ss, 10000 );
\r
48 thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count * 1 );
\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
53 for( loop = 0 ; loop < cpu_count ; loop++ )
\r
54 abstraction_thread_wait( thread_handles[loop] );
\r
56 lfds601_stack_delete( ss, NULL, NULL );
\r
58 free( thread_handles );
\r
60 // TRD : 2. single writer thread per CPU
\r
63 "2. single writer thread per CPU\n"
\r
64 "===============================\n" );
\r
66 lfds601_stack_new( &ss, 10000 );
\r
68 thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count * 1 );
\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
73 for( loop = 0 ; loop < cpu_count ; loop++ )
\r
74 abstraction_thread_wait( thread_handles[loop] );
\r
76 lfds601_stack_delete( ss, NULL, NULL );
\r
78 free( thread_handles );
\r
80 // TRD : 3. one reader and one writer thread per CPU
\r
83 "3. one reader and one writer thread per CPU\n"
\r
84 "===========================================\n" );
\r
86 lfds601_stack_new( &ss, 10000 );
\r
88 thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count * 2 );
\r
90 for( loop = 0 ; loop < cpu_count ; loop++ )
\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
96 for( loop = 0 ; loop < cpu_count * 2 ; loop++ )
\r
97 abstraction_thread_wait( thread_handles[loop] );
\r
99 lfds601_stack_delete( ss, NULL, NULL );
\r
101 free( thread_handles );
\r
103 // TRD : 4. one reader and two writer threads per CPU
\r
106 "4. one reader and two writer threads per CPU\n"
\r
107 "============================================\n" );
\r
109 lfds601_stack_new( &ss, 10000 );
\r
111 thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count * 3 );
\r
113 for( loop = 0 ; loop < cpu_count ; loop++ )
\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
120 for( loop = 0 ; loop < cpu_count * 3 ; loop++ )
\r
121 abstraction_thread_wait( thread_handles[loop] );
\r
123 lfds601_stack_delete( ss, NULL, NULL );
\r
125 free( thread_handles );
\r
127 // TRD : 5. two reader and one writer thread per CPU
\r
130 "5. two reader and one writer thread per CPU\n"
\r
131 "===========================================\n" );
\r
133 lfds601_stack_new( &ss, 10000 );
\r
135 thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count * 3 );
\r
137 for( loop = 0 ; loop < cpu_count ; loop++ )
\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
144 for( loop = 0 ; loop < cpu_count * 3 ; loop++ )
\r
145 abstraction_thread_wait( thread_handles[loop] );
\r
147 lfds601_stack_delete( ss, NULL, NULL );
\r
149 free( thread_handles );
\r
158 /****************************************************************************/
\r
159 thread_return_t CALLING_CONVENTION lfds601_stack_internal_thread_reader( void *lfds601_stack_state )
\r
161 struct lfds601_stack_state
\r
170 unsigned long long int
\r
173 assert( lfds601_stack_state != NULL );
\r
175 ss = (struct lfds601_stack_state *) lfds601_stack_state;
\r
177 time( &start_time );
\r
179 while( time(NULL) < start_time + 10 )
\r
181 if( lfds601_stack_pop(ss, &user_data) )
\r
185 printf( "read count = %llu\n", count );
\r
187 return( (thread_return_t) EXIT_SUCCESS );
\r
194 /****************************************************************************/
\r
195 thread_return_t CALLING_CONVENTION lfds601_stack_internal_thread_writer( void *lfds601_stack_state )
\r
197 struct lfds601_stack_state
\r
203 unsigned long long int
\r
206 assert( lfds601_stack_state != NULL );
\r
208 ss = (struct lfds601_stack_state *) lfds601_stack_state;
\r
210 time( &start_time );
\r
212 while( time(NULL) < start_time + 10 )
\r
214 // TRD : we don't store any user data
\r
215 if( lfds601_stack_push(ss, NULL) )
\r
219 printf( "write count = %llu\n", count );
\r
221 return( (thread_return_t) EXIT_SUCCESS );
\r