7 struct lfds700_list_asu_element
20 struct lfds700_list_asu_state
27 /***** private prototypes *****/
28 static test_pal_thread_return_t TEST_PAL_CALLING_CONVENTION new_end_thread( void *util_thread_starter_thread_state );
34 /****************************************************************************/
35 void test_lfds700_list_asu_new_end( struct lfds700_list_asu_state *list_of_logical_processors, lfds700_pal_uint_t memory_in_megabytes )
37 enum lfds700_misc_validity
38 dvs = LFDS700_MISC_VALIDITY_VALID;
43 number_logical_processors,
47 struct lfds700_list_asu_element
50 struct lfds700_list_asu_state
53 struct lfds700_misc_validation_info
56 struct test_pal_logical_processor
59 struct util_thread_starter_state
69 test_pal_thread_state_t
72 assert( list_of_logical_processors != NULL );
73 // TRD : memory_in_megabytes can be any value in its range
75 /* TRD : run one thread per logical processor
77 each thread loops, calling lfds700_list_asu_new_element_by_position( LFDS700_LIST_ASU_POSITION_END )
78 data element contain a thread_number and element_number
79 verification should show element_number increasing on a per thread basis
82 internal_display_test_name( "New end" );
84 lfds700_list_asu_query( list_of_logical_processors, LFDS700_LIST_ASU_QUERY_GET_POTENTIALLY_INACCURATE_COUNT, NULL, (void **) &number_logical_processors );
86 lfds700_list_asu_init_valid_on_current_logical_core( &lasus, NULL, NULL );
88 number_elements = ( memory_in_megabytes * ONE_MEGABYTE_IN_BYTES ) / ( sizeof(struct test_element) * number_logical_processors );
90 element_array = util_aligned_malloc( sizeof(struct test_element) * number_logical_processors * number_elements, LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES );
92 for( loop = 0 ; loop < number_logical_processors ; loop++ )
93 for( subloop = 0 ; subloop < number_elements ; subloop++ )
95 (element_array+(loop*number_elements)+subloop)->thread_number = loop;
96 (element_array+(loop*number_elements)+subloop)->element_number = subloop;
99 ts = util_malloc_wrapper( sizeof(struct test_state) * number_logical_processors );
101 for( loop = 0 ; loop < number_logical_processors ; loop++ )
103 (ts+loop)->lasus = &lasus;
104 (ts+loop)->element_array = element_array + (loop*number_elements);
105 (ts+loop)->number_elements = number_elements;
108 thread_handles = util_malloc_wrapper( sizeof(test_pal_thread_state_t) * number_logical_processors );
110 util_thread_starter_new( &tts, number_logical_processors );
112 LFDS700_MISC_BARRIER_STORE;
114 lfds700_misc_force_store();
119 while( LFDS700_LIST_ASU_GET_START_AND_THEN_NEXT(*list_of_logical_processors, lasue) )
121 lp = LFDS700_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
122 util_thread_starter_start( tts, &thread_handles[loop], loop, lp, new_end_thread, ts+loop );
126 util_thread_starter_run( tts );
128 for( loop = 0 ; loop < number_logical_processors ; loop++ )
129 test_pal_thread_wait( thread_handles[loop] );
131 util_thread_starter_delete( tts );
133 free( thread_handles );
137 /* TRD : validate the resultant list
138 iterate over each element
139 we expect to find element numbers increment on a per thread basis
142 LFDS700_MISC_BARRIER_LOAD;
144 vi.min_elements = vi.max_elements = number_elements * number_logical_processors;
146 lfds700_list_asu_query( &lasus, LFDS700_LIST_ASU_QUERY_SINGLETHREADED_VALIDATE, &vi, &dvs );
148 per_thread_counters = util_malloc_wrapper( sizeof(lfds700_pal_uint_t) * number_logical_processors );
150 for( loop = 0 ; loop < number_logical_processors ; loop++ )
151 *(per_thread_counters+loop) = 0;
155 while( dvs == LFDS700_MISC_VALIDITY_VALID and LFDS700_LIST_ASU_GET_START_AND_THEN_NEXT(lasus, lasue) )
157 element = LFDS700_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
159 if( element->thread_number >= number_logical_processors )
161 dvs = LFDS700_MISC_VALIDITY_INVALID_TEST_DATA;
165 if( element->element_number > per_thread_counters[element->thread_number] )
166 dvs = LFDS700_MISC_VALIDITY_INVALID_MISSING_ELEMENTS;
168 if( element->element_number < per_thread_counters[element->thread_number] )
169 dvs = LFDS700_MISC_VALIDITY_INVALID_ADDITIONAL_ELEMENTS;
171 if( element->element_number == per_thread_counters[element->thread_number] )
172 per_thread_counters[element->thread_number]++;
175 free( per_thread_counters );
177 lfds700_list_asu_cleanup( &lasus, NULL );
179 util_aligned_free( element_array );
181 internal_display_test_result( 1, "list_asu", dvs );
190 /****************************************************************************/
191 static test_pal_thread_return_t TEST_PAL_CALLING_CONVENTION new_end_thread( void *util_thread_starter_thread_state )
196 struct lfds700_misc_prng_state
202 struct util_thread_starter_thread_state
205 LFDS700_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE;
207 assert( util_thread_starter_thread_state != NULL );
209 tsts = (struct util_thread_starter_thread_state *) util_thread_starter_thread_state;
210 ts = (struct test_state *) tsts->thread_user_state;
212 lfds700_misc_prng_init( &ps );
214 util_thread_starter_ready_and_wait( tsts );
216 for( loop = 0 ; loop < ts->number_elements ; loop++ )
218 LFDS700_LIST_ASU_SET_KEY_IN_ELEMENT( (ts->element_array+loop)->lasue, ts->element_array+loop );
219 LFDS700_LIST_ASU_SET_VALUE_IN_ELEMENT( (ts->element_array+loop)->lasue, ts->element_array+loop );
220 lfds700_list_asu_insert_at_position( ts->lasus, &(ts->element_array+loop)->lasue, NULL, LFDS700_LIST_ASU_POSITION_END, &ps );
223 LFDS700_MISC_BARRIER_STORE;
225 lfds700_misc_force_store();
227 return( (test_pal_thread_return_t) EXIT_SUCCESS );