2 #include "libtest_tests_internal.h"
7 struct lfds710_list_aso_element
15 struct test_per_thread_state
18 number_elements_per_thread;
20 struct lfds710_list_aso_state
27 /***** private prototypes *****/
28 static int new_ordered_compare_function( void const *value_new, void const *value_in_list );
29 static libshared_pal_thread_return_t LIBSHARED_PAL_THREAD_CALLING_CONVENTION new_ordered_thread( void *libtest_threadset_per_thread_state );
35 /****************************************************************************/
36 void libtest_tests_list_aso_new_ordered( struct lfds710_list_asu_state *list_of_logical_processors, struct libshared_memory_state *ms, enum lfds710_misc_validity *dvs )
40 expected_element_number,
42 number_elements_per_thread,
43 number_elements_total,
44 number_logical_processors,
48 struct lfds710_list_aso_element
51 struct lfds710_list_asu_element
54 struct lfds710_list_aso_state
57 struct lfds710_prng_state
60 struct lfds710_misc_validation_info
63 struct libtest_logical_processor
66 struct libtest_threadset_per_thread_state
69 struct libtest_threadset_state
76 struct test_per_thread_state
79 LFDS710_PAL_ASSERT( list_of_logical_processors != NULL );
80 LFDS710_PAL_ASSERT( ms != NULL );
81 LFDS710_PAL_ASSERT( dvs != NULL );
83 /* TRD : run one thread per logical processor
84 we have a single array of 10k elements per thread
85 this is set to be randomly ordered (but with contigious numbers from 0 to n)
86 we give 10k to each thread (a pointer into the array at the correct point)
87 which then loops through that array
88 calling lfds710_list_aso_insert_element_by_position( LFDS710_LIST_ASO_POSITION_ORDERED )
89 verification should show list is sorted
92 *dvs = LFDS710_MISC_VALIDITY_VALID;
94 lfds710_list_asu_query( list_of_logical_processors, LFDS710_LIST_ASU_QUERY_GET_POTENTIALLY_INACCURATE_COUNT, NULL, (void **) &number_logical_processors );
95 tpts = libshared_memory_alloc_from_unknown_node( ms, sizeof(struct test_per_thread_state) * number_logical_processors, LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
96 pts = libshared_memory_alloc_from_unknown_node( ms, sizeof(struct libtest_threadset_per_thread_state) * number_logical_processors, LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
97 element_array = libshared_memory_alloc_largest_possible_array_from_unknown_node( ms, sizeof(struct test_element), LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES, &number_elements );
99 number_elements_per_thread = number_elements / number_logical_processors;
101 lfds710_prng_init_valid_on_current_logical_core( &ps, LFDS710_PRNG_SEED );
103 lfds710_list_aso_init_valid_on_current_logical_core( &lasos, new_ordered_compare_function, LFDS710_LIST_ASO_INSERT_RESULT_FAILURE_EXISTING_KEY, NULL );
105 /* TRD : create randomly ordered number array with unique elements
107 unique isn't necessary - the list will sort anyway - but
108 it permits slightly better validation
111 // TRD : or the test takes a looooooong time...
112 if( number_elements_per_thread > 10000 )
113 number_elements_per_thread = 10000;
115 number_elements_total = number_elements_per_thread * number_logical_processors;
117 for( loop = 0 ; loop < number_elements_total ; loop++ )
118 (element_array+loop)->element_number = loop;
120 for( loop = 0 ; loop < number_elements_total ; loop++ )
122 LFDS710_PRNG_GENERATE( ps, offset );
123 offset %= number_elements_total;
124 temp = (element_array + offset)->element_number;
125 (element_array + offset)->element_number = (element_array + loop)->element_number;
126 (element_array + loop)->element_number = temp;
129 // TRD : get the threads ready
130 libtest_threadset_init( &ts, NULL );
134 while( LFDS710_LIST_ASU_GET_START_AND_THEN_NEXT(*list_of_logical_processors,lasue) )
136 lp = LFDS710_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
137 (tpts+loop)->lasos = &lasos;
138 (tpts+loop)->element_array = element_array + (loop*number_elements_per_thread);
139 (tpts+loop)->number_elements_per_thread = number_elements_per_thread;
140 libtest_threadset_add_thread( &ts, &pts[loop], lp, new_ordered_thread, &tpts[loop] );
144 LFDS710_MISC_BARRIER_STORE;
146 lfds710_misc_force_store();
148 // TRD : run the test
149 libtest_threadset_run( &ts );
151 libtest_threadset_cleanup( &ts );
153 /* TRD : validate the resultant list
154 iterate over the list
155 we expect to find the list is sorted,
156 which means that element_number will
160 LFDS710_MISC_BARRIER_LOAD;
162 vi.min_elements = vi.max_elements = number_elements_total;
164 lfds710_list_aso_query( &lasos, LFDS710_LIST_ASO_QUERY_SINGLETHREADED_VALIDATE, &vi, dvs );
166 if( *dvs == LFDS710_MISC_VALIDITY_VALID )
168 expected_element_number = 0;
170 // TRD : traverse the list and check combined_data_array matches
171 while( *dvs == LFDS710_MISC_VALIDITY_VALID and LFDS710_LIST_ASO_GET_START_AND_THEN_NEXT(lasos, lasoe) )
173 element = LFDS710_LIST_ASO_GET_VALUE_FROM_ELEMENT( *lasoe );
175 if( element->element_number != expected_element_number++ )
176 *dvs = LFDS710_MISC_VALIDITY_INVALID_TEST_DATA;
180 lfds710_list_aso_cleanup( &lasos, NULL );
189 /****************************************************************************/
190 #pragma warning( disable : 4100 )
192 static int new_ordered_compare_function( void const *value_new, void const *value_in_list )
201 // TRD : value_new can be any value in its range
202 // TRD : value_in_list can be any value in its range
204 e1 = (struct test_element *) value_new;
205 e2 = (struct test_element *) value_in_list;
207 if( e1->element_number < e2->element_number )
210 if( e1->element_number > e2->element_number )
216 #pragma warning( default : 4100 )
222 /****************************************************************************/
223 static libshared_pal_thread_return_t LIBSHARED_PAL_THREAD_CALLING_CONVENTION new_ordered_thread( void *libtest_threadset_per_thread_state )
228 struct libtest_threadset_per_thread_state
231 struct test_per_thread_state
234 LFDS710_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE;
236 LFDS710_PAL_ASSERT( libtest_threadset_per_thread_state != NULL );
238 pts = (struct libtest_threadset_per_thread_state *) libtest_threadset_per_thread_state;
239 tpts = LIBTEST_THREADSET_GET_USER_STATE_FROM_PER_THREAD_STATE( *pts );
241 libtest_threadset_thread_ready_and_wait( pts );
243 for( loop = 0 ; loop < tpts->number_elements_per_thread ; loop++ )
245 LFDS710_LIST_ASO_SET_KEY_IN_ELEMENT( (tpts->element_array+loop)->lasoe, tpts->element_array+loop );
246 LFDS710_LIST_ASO_SET_VALUE_IN_ELEMENT( (tpts->element_array+loop)->lasoe, tpts->element_array+loop );
247 lfds710_list_aso_insert( tpts->lasos, &(tpts->element_array+loop)->lasoe, NULL );
250 LFDS710_MISC_BARRIER_STORE;
252 lfds710_misc_force_store();
254 return LIBSHARED_PAL_THREAD_RETURN_CAST(RETURN_SUCCESS);