]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_abstraction_test_helpers.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.1 / liblfds611 / src / lfds611_liblfds / lfds611_liblfds_abstraction_test_helpers.c
1 #include "lfds611_liblfds_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 void lfds611_liblfds_abstraction_test_helper_increment_non_atomic( lfds611_atom_t *shared_counter )\r
9 {\r
10   /* TRD : lfds611_atom_t must be volatile or the compiler\r
11            optimizes it away into a single store\r
12   */\r
13 \r
14   volatile lfds611_atom_t\r
15     count = 0;\r
16 \r
17   assert( shared_counter != NULL );\r
18 \r
19   while( count++ < 10000000 )\r
20     (*(lfds611_atom_t *) shared_counter)++;\r
21 \r
22   return;\r
23 }\r
24 \r
25 \r
26 \r
27 \r
28 \r
29 /****************************************************************************/\r
30 void lfds611_liblfds_abstraction_test_helper_increment_atomic( volatile lfds611_atom_t *shared_counter )\r
31 {\r
32   lfds611_atom_t\r
33     count = 0;\r
34 \r
35   assert( shared_counter != NULL );\r
36 \r
37   while( count++ < 10000000 )\r
38     lfds611_abstraction_increment( shared_counter );\r
39 \r
40   return;\r
41 }\r
42 \r
43 \r
44 \r
45 \r
46 \r
47 /****************************************************************************/\r
48 void lfds611_liblfds_abstraction_test_helper_cas( volatile lfds611_atom_t *shared_counter, lfds611_atom_t *local_counter )\r
49 {\r
50   lfds611_atom_t\r
51     loop = 0,\r
52     original_destination;\r
53 \r
54   LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) lfds611_atom_t\r
55     exchange,\r
56     compare;\r
57 \r
58   assert( shared_counter != NULL );\r
59   assert( local_counter != NULL );\r
60 \r
61   while( loop++ < 1000000 )\r
62   {\r
63     do\r
64     {\r
65       compare = *shared_counter;\r
66       exchange = compare + 1;\r
67 \r
68       original_destination = lfds611_abstraction_cas( shared_counter, exchange, compare );\r
69     }\r
70     while( original_destination != compare );\r
71 \r
72     (*local_counter)++;\r
73   }\r
74 \r
75   return;\r
76 }\r
77 \r
78 \r
79 \r
80 \r
81 \r
82 /****************************************************************************/\r
83 void lfds611_liblfds_abstraction_test_helper_dcas( volatile lfds611_atom_t *shared_counter, lfds611_atom_t *local_counter )\r
84 {\r
85   lfds611_atom_t\r
86     loop = 0;\r
87 \r
88   LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) lfds611_atom_t\r
89     exchange[2],\r
90     compare[2];\r
91 \r
92   assert( shared_counter != NULL );\r
93   assert( local_counter != NULL );\r
94 \r
95   while( loop++ < 1000000 )\r
96   {\r
97     compare[0] = *shared_counter;\r
98     compare[1] = *(shared_counter+1);\r
99 \r
100     do\r
101     {\r
102       exchange[0] = compare[0] + 1;\r
103       exchange[1] = compare[1];\r
104     }\r
105     while( 0 == lfds611_abstraction_dcas(shared_counter, exchange, compare) );\r
106 \r
107     (*local_counter)++;\r
108   }\r
109 \r
110   return;\r
111 }\r
112 \r