2 #include "libtest_tests_internal.h"
5 struct test_per_thread_state
7 struct lfds710_queue_umm_state
11 /***** private prototypes *****/
12 static libshared_pal_thread_return_t LIBSHARED_PAL_THREAD_CALLING_CONVENTION thread_enqueuer_with_malloc_and_dequeuer_with_free( void *libtest_threadset_per_thread_state );
18 /****************************************************************************/
19 void libtest_tests_queue_umm_enqueuing_with_malloc_and_dequeuing_with_free( struct lfds710_list_asu_state *list_of_logical_processors, struct libshared_memory_state *ms, enum lfds710_misc_validity *dvs )
23 number_logical_processors;
25 struct lfds710_list_asu_element
28 struct lfds710_queue_umm_element
31 struct lfds710_queue_umm_state
34 struct lfds710_misc_validation_info
37 struct libtest_logical_processor
40 struct libtest_threadset_per_thread_state
43 struct libtest_threadset_state
46 struct test_per_thread_state
49 LFDS710_PAL_ASSERT( list_of_logical_processors != NULL );
50 LFDS710_PAL_ASSERT( ms != NULL );
51 LFDS710_PAL_ASSERT( dvs != NULL );
53 /* TRD : one thread per logical core
54 each thread loops for ten seconds
55 mallocs and enqueues 1k elements, then dequeues and frees 1k elements
58 *dvs = LFDS710_MISC_VALIDITY_VALID;
61 lfds710_list_asu_query( list_of_logical_processors, LFDS710_LIST_ASU_QUERY_GET_POTENTIALLY_INACCURATE_COUNT, NULL, (void **) &number_logical_processors );
62 tpts = libshared_memory_alloc_from_unknown_node( ms, sizeof(struct test_per_thread_state) * number_logical_processors, LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
63 pts = libshared_memory_alloc_from_unknown_node( ms, sizeof(struct libtest_threadset_per_thread_state) * number_logical_processors, LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
65 lfds710_queue_umm_init_valid_on_current_logical_core( &qs, &dummy_element, NULL );
67 libtest_threadset_init( &ts, NULL );
69 while( LFDS710_LIST_ASU_GET_START_AND_THEN_NEXT(*list_of_logical_processors,lasue) )
71 lp = LFDS710_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
72 (tpts+loop)->qs = &qs;
74 libtest_threadset_add_thread( &ts, &pts[loop], lp, thread_enqueuer_with_malloc_and_dequeuer_with_free, &tpts[loop] );
78 LFDS710_MISC_BARRIER_STORE;
80 lfds710_misc_force_store();
83 libtest_threadset_run( &ts );
85 libtest_threadset_cleanup( &ts );
88 LFDS710_MISC_BARRIER_LOAD;
90 vi.min_elements = vi.max_elements = 0;
92 lfds710_queue_umm_query( &qs, LFDS710_QUEUE_UMM_QUERY_SINGLETHREADED_VALIDATE, &vi, dvs );
94 lfds710_queue_umm_cleanup( &qs, NULL );
103 /****************************************************************************/
104 static libshared_pal_thread_return_t LIBSHARED_PAL_THREAD_CALLING_CONVENTION thread_enqueuer_with_malloc_and_dequeuer_with_free( void *libtest_threadset_per_thread_state )
110 struct lfds710_queue_umm_element
113 struct test_per_thread_state
116 struct libtest_threadset_per_thread_state
123 LFDS710_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE;
125 LFDS710_PAL_ASSERT( libtest_threadset_per_thread_state != NULL );
127 pts = (struct libtest_threadset_per_thread_state *) libtest_threadset_per_thread_state;
128 tpts = LIBTEST_THREADSET_GET_USER_STATE_FROM_PER_THREAD_STATE( *pts );
130 libtest_threadset_thread_ready_and_wait( pts );
132 current_time = start_time = time( NULL );
134 while( current_time < start_time + TEST_DURATION_IN_SECONDS )
136 for( loop = 0 ; loop < 1000 ; loop++ )
138 qe = libtest_misc_aligned_malloc( sizeof(struct lfds710_queue_umm_element), LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES );
139 lfds710_queue_umm_enqueue( tpts->qs, qe );
142 for( loop = 0 ; loop < 1000 ; loop++ )
144 lfds710_queue_umm_dequeue( tpts->qs, &qe );
145 libtest_misc_aligned_free( qe );
148 if( time_loop++ == REDUCED_TIME_LOOP_COUNT )
151 time( ¤t_time );
155 LFDS710_MISC_BARRIER_STORE;
157 lfds710_misc_force_store();
159 return LIBSHARED_PAL_THREAD_RETURN_CAST(RETURN_SUCCESS);