2 #include "libbenchmark_threadset_internal.h"
8 /****************************************************************************/
9 void libbenchmark_threadset_run( struct libbenchmark_threadset_state *tsets )
11 struct lfds710_list_asu_element
14 struct libbenchmark_threadset_per_thread_state
17 LFDS710_PAL_ASSERT( tsets != NULL );
19 LFDS710_MISC_BARRIER_STORE;
21 lfds710_misc_force_store();
23 while( LFDS710_LIST_ASU_GET_START_AND_THEN_NEXT(tsets->list_of_per_thread_states,lasue) )
25 pts = LFDS710_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
27 pts->pti.logical_processor_number = LIBBENCHMARK_TOPOLOGY_NODE_GET_LOGICAL_PROCESSOR_NUMBER( *pts->tns_lp );
28 pts->pti.windows_processor_group_number = LIBBENCHMARK_TOPOLOGY_NODE_GET_WINDOWS_GROUP_NUMBER( *pts->tns_lp );
29 pts->pti.thread_function = tsets->thread_function;
30 pts->pti.thread_argument = pts;
32 libshared_pal_thread_start( &pts->thread_handle, &pts->pti );
35 tsets->threadset_start_flag = RAISED;
37 LFDS710_PAL_ASSERT( tsets != NULL );
39 while( LFDS710_LIST_ASU_GET_START_AND_THEN_NEXT(tsets->list_of_per_thread_states,lasue) )
41 pts = LFDS710_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
42 libshared_pal_thread_wait( pts->thread_handle );
52 /****************************************************************************/
53 void libbenchmark_threadset_thread_ready_and_wait( struct libbenchmark_threadset_per_thread_state *pts )
55 LFDS710_PAL_ASSERT( pts != NULL );
57 pts->thread_ready_flag = RAISED;
59 LFDS710_MISC_BARRIER_FULL;
61 while( *pts->threadset_start_flag == LOWERED )
62 LFDS710_MISC_BARRIER_LOAD;