]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/libbenchmark/src/libbenchmark_threadset/libbenchmark_threadset_operations.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / test_and_benchmark / libbenchmark / src / libbenchmark_threadset / libbenchmark_threadset_operations.c
1 /***** includes *****/
2 #include "libbenchmark_threadset_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void libbenchmark_threadset_run( struct libbenchmark_threadset_state *tsets )
10 {
11   struct lfds710_list_asu_element
12     *lasue = NULL;
13
14   struct libbenchmark_threadset_per_thread_state
15     *pts;
16
17   LFDS710_PAL_ASSERT( tsets != NULL );
18
19   LFDS710_MISC_BARRIER_STORE;
20
21   lfds710_misc_force_store();
22
23   while( LFDS710_LIST_ASU_GET_START_AND_THEN_NEXT(tsets->list_of_per_thread_states,lasue) )
24   {
25     pts = LFDS710_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
26
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;
31
32     libshared_pal_thread_start( &pts->thread_handle, &pts->pti );
33   }
34
35   tsets->threadset_start_flag = RAISED;
36
37   LFDS710_PAL_ASSERT( tsets != NULL );
38
39   while( LFDS710_LIST_ASU_GET_START_AND_THEN_NEXT(tsets->list_of_per_thread_states,lasue) )
40   {
41     pts = LFDS710_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
42     libshared_pal_thread_wait( pts->thread_handle );
43   }
44
45   return;
46 }
47
48
49
50
51
52 /****************************************************************************/
53 void libbenchmark_threadset_thread_ready_and_wait( struct libbenchmark_threadset_per_thread_state *pts )
54 {
55   LFDS710_PAL_ASSERT( pts != NULL );
56
57   pts->thread_ready_flag = RAISED;
58
59   LFDS710_MISC_BARRIER_FULL;
60
61   while( *pts->threadset_start_flag == LOWERED )
62     LFDS710_MISC_BARRIER_LOAD;
63
64   return;
65 }
66