]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/libtest/src/libtest_tests/libtest_tests_list_addonly_singlylinked_unordered_new_after.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / test_and_benchmark / libtest / src / libtest_tests / libtest_tests_list_addonly_singlylinked_unordered_new_after.c
1 /***** includes *****/
2 #include "libtest_tests_internal.h"
3
4 /***** structs *****/
5 struct test_element
6 {
7   struct lfds710_list_asu_element
8     lasue;
9
10   lfds710_pal_uint_t
11     element_number,
12     thread_number;
13 };
14
15 struct test_per_thread_state
16 {
17   lfds710_pal_uint_t
18     number_elements_per_thread;
19
20   struct lfds710_list_asu_state
21     *lasus;
22
23   struct test_element
24     *element_array;
25
26   struct lfds710_list_asu_element
27     *first_element;
28 };
29
30 /***** private prototypes *****/
31 static libshared_pal_thread_return_t LIBSHARED_PAL_THREAD_CALLING_CONVENTION new_after_thread( void *libtest_threadset_per_thread_state );
32
33
34
35
36
37 /****************************************************************************/
38 void libtest_tests_list_asu_new_after( struct lfds710_list_asu_state *list_of_logical_processors, struct libshared_memory_state *ms, enum lfds710_misc_validity *dvs )
39 {
40   lfds710_pal_uint_t
41     loop,
42     number_elements,
43     number_elements_per_thread,
44     number_logical_processors,
45     *per_thread_counters,
46     subloop;
47
48   struct lfds710_list_asu_element
49     *lasue = NULL,
50     first_element;
51
52   struct lfds710_list_asu_state
53     lasus;
54
55   struct lfds710_misc_validation_info
56     vi;
57
58   struct libtest_logical_processor
59     *lp;
60
61   struct libtest_threadset_per_thread_state
62     *pts;
63
64   struct libtest_threadset_state
65     ts;
66
67   struct test_element
68     *element_array,
69     *element;
70
71   struct test_per_thread_state
72     *tpts;
73
74   LFDS710_PAL_ASSERT( list_of_logical_processors != NULL );
75   LFDS710_PAL_ASSERT( ms != NULL );
76   LFDS710_PAL_ASSERT( dvs != NULL );
77
78   /* TRD : run one thread per logical processor
79            run for 250k elements
80            we put a single first element into the list and
81            each thread loops, calling lfds710_list_asu_new_element_by_position( LFDS710_LIST_ASU_POSITION_AFTER ),
82            inserting after the single first element
83            data element contain s thread_number and element_number
84            verification should show element_number decreasing on a per thread basis
85   */
86
87   *dvs = LFDS710_MISC_VALIDITY_VALID;
88
89   // TRD : allocate
90   lfds710_list_asu_query( list_of_logical_processors, LFDS710_LIST_ASU_QUERY_GET_POTENTIALLY_INACCURATE_COUNT, NULL, (void **) &number_logical_processors );
91   tpts = libshared_memory_alloc_from_unknown_node( ms, sizeof(struct test_per_thread_state) * number_logical_processors, LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
92   pts = libshared_memory_alloc_from_unknown_node( ms, sizeof(struct libtest_threadset_per_thread_state) * number_logical_processors, LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
93   per_thread_counters = libshared_memory_alloc_from_unknown_node( ms, sizeof(lfds710_pal_uint_t) * number_logical_processors, LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
94   element_array = libshared_memory_alloc_largest_possible_array_from_unknown_node( ms, sizeof(struct test_element), LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES, &number_elements );
95
96   number_elements_per_thread = number_elements / number_logical_processors;
97
98   lfds710_list_asu_init_valid_on_current_logical_core( &lasus, NULL );
99
100   LFDS710_LIST_ASU_SET_KEY_IN_ELEMENT( first_element, NULL );
101   LFDS710_LIST_ASU_SET_VALUE_IN_ELEMENT( first_element, NULL );
102   lfds710_list_asu_insert_at_position( &lasus, &first_element, NULL, LFDS710_LIST_ASU_POSITION_START );
103
104   for( loop = 0 ; loop < number_logical_processors ; loop++ )
105     for( subloop = 0 ; subloop < number_elements_per_thread ; subloop++ )
106     {
107       (element_array+(loop*number_elements_per_thread)+subloop)->thread_number = loop;
108       (element_array+(loop*number_elements_per_thread)+subloop)->element_number = subloop;
109     }
110
111   libtest_threadset_init( &ts, NULL );
112
113   loop = 0;
114
115   while( LFDS710_LIST_ASU_GET_START_AND_THEN_NEXT(*list_of_logical_processors,lasue) )
116   {
117     lp = LFDS710_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
118
119     (tpts+loop)->lasus = &lasus;
120     (tpts+loop)->element_array = element_array + (loop*number_elements_per_thread);
121     (tpts+loop)->first_element = &first_element;
122     (tpts+loop)->number_elements_per_thread = number_elements_per_thread;
123
124     libtest_threadset_add_thread( &ts, &pts[loop], lp, new_after_thread, &tpts[loop] );
125
126     loop++;
127   }
128
129   LFDS710_MISC_BARRIER_STORE;
130
131   lfds710_misc_force_store();
132
133   // TRD : run the test
134   libtest_threadset_run( &ts );
135
136   libtest_threadset_cleanup( &ts );
137
138   /* TRD : validate the resultant list
139            iterate over each element
140            we expect to find element numbers increment on a per thread basis
141   */
142
143   LFDS710_MISC_BARRIER_LOAD;
144
145   vi.min_elements = vi.max_elements = (number_elements_per_thread * number_logical_processors) + 1;
146
147   lfds710_list_asu_query( &lasus, LFDS710_LIST_ASU_QUERY_SINGLETHREADED_VALIDATE, &vi, dvs );
148
149   for( loop = 0 ; loop < number_logical_processors ; loop++ )
150     *(per_thread_counters+loop) = number_elements_per_thread - 1;
151
152   /* TRD : we have a leading element, after which all inserts occurred
153            we need to get past that element for validation
154            this is why we're not using lfds710_list_asu_get_start_and_then_next()
155   */
156
157   lasue = LFDS710_LIST_ASU_GET_START( lasus );
158
159   lasue = LFDS710_LIST_ASU_GET_NEXT( *lasue );
160
161   while( *dvs == LFDS710_MISC_VALIDITY_VALID and lasue != NULL )
162   {
163     element = LFDS710_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
164
165     if( element->thread_number >= number_logical_processors )
166     {
167       *dvs = LFDS710_MISC_VALIDITY_INVALID_TEST_DATA;
168       break;
169     }
170
171     if( element->element_number < per_thread_counters[element->thread_number] )
172       *dvs = LFDS710_MISC_VALIDITY_INVALID_MISSING_ELEMENTS;
173
174     if( element->element_number > per_thread_counters[element->thread_number] )
175       *dvs = LFDS710_MISC_VALIDITY_INVALID_ADDITIONAL_ELEMENTS;
176
177     if( element->element_number == per_thread_counters[element->thread_number] )
178       per_thread_counters[element->thread_number]--;
179
180     lasue = LFDS710_LIST_ASU_GET_NEXT( *lasue );
181   }
182
183   lfds710_list_asu_cleanup( &lasus, NULL );
184
185   return;
186 }
187
188
189
190
191
192 /****************************************************************************/
193 static libshared_pal_thread_return_t LIBSHARED_PAL_THREAD_CALLING_CONVENTION new_after_thread( void *libtest_threadset_per_thread_state )
194 {
195   lfds710_pal_uint_t
196     loop;
197
198   struct libtest_threadset_per_thread_state
199     *pts;
200
201   struct test_per_thread_state
202     *tpts;
203
204   LFDS710_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE;
205
206   LFDS710_PAL_ASSERT( libtest_threadset_per_thread_state != NULL );
207
208   pts = (struct libtest_threadset_per_thread_state *) libtest_threadset_per_thread_state;
209   tpts = LIBTEST_THREADSET_GET_USER_STATE_FROM_PER_THREAD_STATE( *pts );
210
211   libtest_threadset_thread_ready_and_wait( pts );
212
213   for( loop = 0 ; loop < tpts->number_elements_per_thread ; loop++ )
214   {
215     LFDS710_LIST_ASU_SET_KEY_IN_ELEMENT( (tpts->element_array+loop)->lasue, tpts->element_array+loop );
216     LFDS710_LIST_ASU_SET_VALUE_IN_ELEMENT( (tpts->element_array+loop)->lasue, tpts->element_array+loop );
217     lfds710_list_asu_insert_at_position( tpts->lasus, &(tpts->element_array+loop)->lasue, tpts->first_element, LFDS710_LIST_ASU_POSITION_AFTER );
218   }
219
220   LFDS710_MISC_BARRIER_STORE;
221
222   lfds710_misc_force_store();
223
224   return LIBSHARED_PAL_THREAD_RETURN_CAST(RETURN_SUCCESS);
225 }
226