]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/libtest/src/libtest_threadset/libtest_threadset_operations.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / test_and_benchmark / libtest / src / libtest_threadset / libtest_threadset_operations.c
1 /***** includes *****/
2 #include "libtest_threadset_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void libtest_threadset_run( struct libtest_threadset_state *ts )
10 {
11   struct lfds710_list_asu_element
12     *lasue = NULL;
13
14   struct libtest_threadset_per_thread_state
15     *pts;
16
17   LFDS710_PAL_ASSERT( ts != NULL );
18
19   LFDS710_MISC_BARRIER_STORE;
20
21   lfds710_misc_force_store();
22
23   while( LFDS710_LIST_ASU_GET_START_AND_THEN_NEXT(ts->list_of_per_thread_states,lasue) )
24   {
25     pts = LFDS710_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
26     libshared_pal_thread_start( &pts->thread_handle, &pts->pti );
27   }
28
29   ts->threadset_start_flag = RAISED;
30
31   LFDS710_PAL_ASSERT( ts != NULL );
32
33   while( LFDS710_LIST_ASU_GET_START_AND_THEN_NEXT(ts->list_of_per_thread_states,lasue) )
34   {
35     pts = LFDS710_LIST_ASU_GET_VALUE_FROM_ELEMENT( *lasue );
36     libshared_pal_thread_wait( pts->thread_handle );
37   }
38
39   return;
40 }
41
42
43
44
45
46 /****************************************************************************/
47 void libtest_threadset_thread_ready_and_wait( struct libtest_threadset_per_thread_state *pts )
48 {
49   LFDS710_PAL_ASSERT( pts != NULL );
50
51   pts->thread_ready_flag = RAISED;
52
53   LFDS710_MISC_BARRIER_FULL;
54
55   while( *pts->threadset_start_flag == LOWERED )
56     LFDS710_MISC_BARRIER_LOAD;
57
58   return;
59 }
60