]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/inc/liblfds710/lfds710_misc.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / inc / liblfds710 / lfds710_misc.h
1 /***** defines *****/
2 #define LFDS710_MISC_VERSION_STRING   "7.1.0"
3 #define LFDS710_MISC_VERSION_INTEGER  710
4
5 #ifndef NULL
6   #define NULL ( (void *) 0 )
7 #endif
8
9 #define POINTER   0
10 #define COUNTER   1
11 #define PAC_SIZE  2
12
13 #define LFDS710_MISC_DELIBERATELY_CRASH  { char *c = 0; *c = 0; }
14
15 #if( !defined LFDS710_PAL_ATOMIC_ADD )
16   #define LFDS710_PAL_NO_ATOMIC_ADD
17   #define LFDS710_MISC_ATOMIC_SUPPORT_ADD 0
18   #define LFDS710_PAL_ATOMIC_ADD( pointer_to_target, value, result, result_type )        \
19   {                                                                                      \
20     LFDS710_PAL_ASSERT( !"LFDS710_PAL_ATOMIC_ADD not implemented for this platform." );  \
21     LFDS710_MISC_DELIBERATELY_CRASH;                                                     \
22   }
23 #else
24   #define LFDS710_MISC_ATOMIC_SUPPORT_ADD 1
25 #endif
26
27 #if( !defined LFDS710_PAL_ATOMIC_CAS )
28   #define LFDS710_PAL_NO_ATOMIC_CAS
29   #define LFDS710_MISC_ATOMIC_SUPPORT_CAS 0
30   #define LFDS710_PAL_ATOMIC_CAS( pointer_to_destination, pointer_to_compare, new_destination, cas_strength, result )  \
31   {                                                                                                                    \
32     LFDS710_PAL_ASSERT( !"LFDS710_PAL_ATOMIC_CAS not implemented for this platform." );                                \
33     (result) = 0;                                                                                                      \
34     LFDS710_MISC_DELIBERATELY_CRASH;                                                                                   \
35   }
36 #else
37   #define LFDS710_MISC_ATOMIC_SUPPORT_CAS 1
38 #endif
39
40 #if( !defined LFDS710_PAL_ATOMIC_DWCAS )
41   #define LFDS710_PAL_NO_ATOMIC_DWCAS
42   #define LFDS710_MISC_ATOMIC_SUPPORT_DWCAS 0
43   #define LFDS710_PAL_ATOMIC_DWCAS( pointer_to_destination, pointer_to_compare, pointer_to_new_destination, cas_strength, result )  \
44   {                                                                                                                                 \
45     LFDS710_PAL_ASSERT( !"LFDS710_PAL_ATOMIC_DWCAS not implemented for this platform." );                                           \
46     (result) = 0;                                                                                                                   \
47     LFDS710_MISC_DELIBERATELY_CRASH;                                                                                                \
48   }
49 #else
50   #define LFDS710_MISC_ATOMIC_SUPPORT_DWCAS 1
51 #endif
52
53 #if( !defined LFDS710_PAL_ATOMIC_EXCHANGE )
54   #define LFDS710_PAL_NO_ATOMIC_EXCHANGE
55   #define LFDS710_MISC_ATOMIC_SUPPORT_EXCHANGE 0
56   #define LFDS710_PAL_ATOMIC_EXCHANGE( pointer_to_destination, new_value, original_value, value_type )  \
57   {                                                                                                     \
58     LFDS710_PAL_ASSERT( !"LFDS710_PAL_ATOMIC_EXCHANGE not implemented for this platform." );            \
59     LFDS710_MISC_DELIBERATELY_CRASH;                                                                    \
60   }
61 #else
62   #define LFDS710_MISC_ATOMIC_SUPPORT_EXCHANGE 1
63 #endif
64
65 #if( !defined LFDS710_PAL_ATOMIC_SET )
66   #define LFDS710_PAL_NO_ATOMIC_SET
67   #define LFDS710_MISC_ATOMIC_SUPPORT_SET 0
68   #define LFDS710_PAL_ATOMIC_SET( pointer_to_destination, new_value )                    \
69   {                                                                                      \
70     LFDS710_PAL_ASSERT( !"LFDS710_PAL_ATOMIC_SET not implemented for this platform." );  \
71     LFDS710_MISC_DELIBERATELY_CRASH;                                                     \
72   }
73 #else
74   #define LFDS710_MISC_ATOMIC_SUPPORT_SET 1
75 #endif
76
77 #if( defined LFDS710_PAL_BARRIER_COMPILER_LOAD && defined LFDS710_PAL_BARRIER_PROCESSOR_LOAD )
78   #define LFDS710_MISC_BARRIER_LOAD  ( LFDS710_PAL_BARRIER_COMPILER_LOAD, LFDS710_PAL_BARRIER_PROCESSOR_LOAD, LFDS710_PAL_BARRIER_COMPILER_LOAD )
79 #endif
80
81 #if( (!defined LFDS710_PAL_BARRIER_COMPILER_LOAD || defined LFDS710_PAL_COMPILER_BARRIERS_MISSING_PRESUMED_HAVING_A_GOOD_TIME) && defined LFDS710_PAL_BARRIER_PROCESSOR_LOAD )
82   #define LFDS710_MISC_BARRIER_LOAD  LFDS710_PAL_BARRIER_PROCESSOR_LOAD
83 #endif
84
85 #if( defined LFDS710_PAL_BARRIER_COMPILER_LOAD && !defined LFDS710_PAL_BARRIER_PROCESSOR_LOAD )
86   #define LFDS710_MISC_BARRIER_LOAD  LFDS710_PAL_BARRIER_COMPILER_LOAD
87 #endif
88
89 #if( !defined LFDS710_PAL_BARRIER_COMPILER_LOAD && !defined LFDS710_PAL_BARRIER_PROCESSOR_LOAD )
90   #define LFDS710_MISC_BARRIER_LOAD
91 #endif
92
93 #if( defined LFDS710_PAL_BARRIER_COMPILER_STORE && defined LFDS710_PAL_BARRIER_PROCESSOR_STORE )
94   #define LFDS710_MISC_BARRIER_STORE  ( LFDS710_PAL_BARRIER_COMPILER_STORE, LFDS710_PAL_BARRIER_PROCESSOR_STORE, LFDS710_PAL_BARRIER_COMPILER_STORE )
95 #endif
96
97 #if( (!defined LFDS710_PAL_BARRIER_COMPILER_STORE || defined LFDS710_PAL_COMPILER_BARRIERS_MISSING_PRESUMED_HAVING_A_GOOD_TIME) && defined LFDS710_PAL_BARRIER_PROCESSOR_STORE )
98   #define LFDS710_MISC_BARRIER_STORE  LFDS710_PAL_BARRIER_PROCESSOR_STORE
99 #endif
100
101 #if( defined LFDS710_PAL_BARRIER_COMPILER_STORE && !defined LFDS710_PAL_BARRIER_PROCESSOR_STORE )
102   #define LFDS710_MISC_BARRIER_STORE  LFDS710_PAL_BARRIER_COMPILER_STORE
103 #endif
104
105 #if( !defined LFDS710_PAL_BARRIER_COMPILER_STORE && !defined LFDS710_PAL_BARRIER_PROCESSOR_STORE )
106   #define LFDS710_MISC_BARRIER_STORE
107 #endif
108
109 #if( defined LFDS710_PAL_BARRIER_COMPILER_FULL && defined LFDS710_PAL_BARRIER_PROCESSOR_FULL )
110   #define LFDS710_MISC_BARRIER_FULL  ( LFDS710_PAL_BARRIER_COMPILER_FULL, LFDS710_PAL_BARRIER_PROCESSOR_FULL, LFDS710_PAL_BARRIER_COMPILER_FULL )
111 #endif
112
113 #if( (!defined LFDS710_PAL_BARRIER_COMPILER_FULL || defined LFDS710_PAL_COMPILER_BARRIERS_MISSING_PRESUMED_HAVING_A_GOOD_TIME) && defined LFDS710_PAL_BARRIER_PROCESSOR_FULL )
114   #define LFDS710_MISC_BARRIER_FULL  LFDS710_PAL_BARRIER_PROCESSOR_FULL
115 #endif
116
117 #if( defined LFDS710_PAL_BARRIER_COMPILER_FULL && !defined LFDS710_PAL_BARRIER_PROCESSOR_FULL )
118   #define LFDS710_MISC_BARRIER_FULL  LFDS710_PAL_BARRIER_COMPILER_FULL
119 #endif
120
121 #if( !defined LFDS710_PAL_BARRIER_COMPILER_FULL && !defined LFDS710_PAL_BARRIER_PROCESSOR_FULL )
122   #define LFDS710_MISC_BARRIER_FULL
123 #endif
124
125 #if( (defined LFDS710_PAL_BARRIER_COMPILER_LOAD && defined LFDS710_PAL_BARRIER_COMPILER_STORE && defined LFDS710_PAL_BARRIER_COMPILER_FULL) || (defined LFDS710_PAL_COMPILER_BARRIERS_MISSING_PRESUMED_HAVING_A_GOOD_TIME) )
126   #define LFDS710_MISC_ATOMIC_SUPPORT_COMPILER_BARRIERS  1
127 #else
128   #define LFDS710_MISC_ATOMIC_SUPPORT_COMPILER_BARRIERS  0
129 #endif
130
131 #if( defined LFDS710_PAL_BARRIER_PROCESSOR_LOAD && defined LFDS710_PAL_BARRIER_PROCESSOR_STORE && defined LFDS710_PAL_BARRIER_PROCESSOR_FULL )
132   #define LFDS710_MISC_ATOMIC_SUPPORT_PROCESSOR_BARRIERS  1
133 #else
134   #define LFDS710_MISC_ATOMIC_SUPPORT_PROCESSOR_BARRIERS  0
135 #endif
136
137 #define LFDS710_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE  LFDS710_MISC_BARRIER_LOAD
138 #define LFDS710_MISC_FLUSH                                                                                    { LFDS710_MISC_BARRIER_STORE; lfds710_misc_force_store(); }
139
140 /***** enums *****/
141 enum lfds710_misc_cas_strength
142 {
143   // TRD : GCC defined values
144   LFDS710_MISC_CAS_STRENGTH_STRONG = 0,
145   LFDS710_MISC_CAS_STRENGTH_WEAK   = 1,
146 };
147
148 enum lfds710_misc_validity
149 {
150   LFDS710_MISC_VALIDITY_UNKNOWN,
151   LFDS710_MISC_VALIDITY_VALID,
152   LFDS710_MISC_VALIDITY_INVALID_LOOP,
153   LFDS710_MISC_VALIDITY_INVALID_MISSING_ELEMENTS,
154   LFDS710_MISC_VALIDITY_INVALID_ADDITIONAL_ELEMENTS,
155   LFDS710_MISC_VALIDITY_INVALID_TEST_DATA,
156   LFDS710_MISC_VALIDITY_INVALID_ORDER,
157   LFDS710_MISC_VALIDITY_INVALID_ATOMIC_FAILED,
158   LFDS710_MISC_VALIDITY_INDETERMINATE_NONATOMIC_PASSED,
159 };
160
161 enum lfds710_misc_flag
162 {
163   LFDS710_MISC_FLAG_LOWERED,
164   LFDS710_MISC_FLAG_RAISED
165 };
166
167 enum lfds710_misc_query
168 {
169   LFDS710_MISC_QUERY_GET_BUILD_AND_VERSION_STRING
170 };
171
172 enum lfds710_misc_data_structure
173 {
174   LFDS710_MISC_DATA_STRUCTURE_BTREE_AU,
175   LFDS710_MISC_DATA_STRUCTURE_FREELIST,
176   LFDS710_MISC_DATA_STRUCTURE_HASH_A,
177   LFDS710_MISC_DATA_STRUCTURE_LIST_AOS,
178   LFDS710_MISC_DATA_STRUCTURE_LIST_ASU,
179   LFDS710_MISC_DATA_STRUCTURE_QUEUE_BMM,
180   LFDS710_MISC_DATA_STRUCTURE_QUEUE_BSS,
181   LFDS710_MISC_DATA_STRUCTURE_QUEUE_UMM,
182   LFDS710_MISC_DATA_STRUCTURE_RINGBUFFER,
183   LFDS710_MISC_DATA_STRUCTURE_STACK,
184   LFDS710_MISC_DATA_STRUCTURE_COUNT
185 };
186
187 /***** struct *****/
188 struct lfds710_misc_backoff_state
189 {
190   lfds710_pal_uint_t volatile LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
191     lock;
192
193   lfds710_pal_uint_t
194     backoff_iteration_frequency_counters[2],
195     metric,
196     total_operations;
197 };
198
199 struct lfds710_misc_globals
200 {
201   struct lfds710_prng_state
202     ps;
203 };
204
205 struct lfds710_misc_validation_info
206 {
207   lfds710_pal_uint_t
208     min_elements,
209     max_elements;
210 };
211
212 /***** externs *****/
213 extern struct lfds710_misc_globals
214   lfds710_misc_globals;
215
216 /***** public prototypes *****/
217 static LFDS710_PAL_INLINE void lfds710_misc_force_store( void );
218
219 void lfds710_misc_query( enum lfds710_misc_query query_type, void *query_input, void *query_output );
220
221 /***** public in-line functions *****/
222 #pragma prefast( disable : 28112, "blah" )
223
224 static LFDS710_PAL_INLINE void lfds710_misc_force_store()
225 {
226   lfds710_pal_uint_t volatile LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
227     destination;
228
229   LFDS710_PAL_ATOMIC_SET( &destination, 0 );
230
231   return;
232 }
233