2 #define LFDS710_MISC_VERSION_STRING "7.1.0"
3 #define LFDS710_MISC_VERSION_INTEGER 710
6 #define NULL ( (void *) 0 )
13 #define LFDS710_MISC_DELIBERATELY_CRASH { char *c = 0; *c = 0; }
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 ) \
20 LFDS710_PAL_ASSERT( !"LFDS710_PAL_ATOMIC_ADD not implemented for this platform." ); \
21 LFDS710_MISC_DELIBERATELY_CRASH; \
24 #define LFDS710_MISC_ATOMIC_SUPPORT_ADD 1
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 ) \
32 LFDS710_PAL_ASSERT( !"LFDS710_PAL_ATOMIC_CAS not implemented for this platform." ); \
34 LFDS710_MISC_DELIBERATELY_CRASH; \
37 #define LFDS710_MISC_ATOMIC_SUPPORT_CAS 1
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 ) \
45 LFDS710_PAL_ASSERT( !"LFDS710_PAL_ATOMIC_DWCAS not implemented for this platform." ); \
47 LFDS710_MISC_DELIBERATELY_CRASH; \
50 #define LFDS710_MISC_ATOMIC_SUPPORT_DWCAS 1
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 ) \
58 LFDS710_PAL_ASSERT( !"LFDS710_PAL_ATOMIC_EXCHANGE not implemented for this platform." ); \
59 LFDS710_MISC_DELIBERATELY_CRASH; \
62 #define LFDS710_MISC_ATOMIC_SUPPORT_EXCHANGE 1
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 ) \
70 LFDS710_PAL_ASSERT( !"LFDS710_PAL_ATOMIC_SET not implemented for this platform." ); \
71 LFDS710_MISC_DELIBERATELY_CRASH; \
74 #define LFDS710_MISC_ATOMIC_SUPPORT_SET 1
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 )
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
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
89 #if( !defined LFDS710_PAL_BARRIER_COMPILER_LOAD && !defined LFDS710_PAL_BARRIER_PROCESSOR_LOAD )
90 #define LFDS710_MISC_BARRIER_LOAD
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 )
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
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
105 #if( !defined LFDS710_PAL_BARRIER_COMPILER_STORE && !defined LFDS710_PAL_BARRIER_PROCESSOR_STORE )
106 #define LFDS710_MISC_BARRIER_STORE
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 )
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
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
121 #if( !defined LFDS710_PAL_BARRIER_COMPILER_FULL && !defined LFDS710_PAL_BARRIER_PROCESSOR_FULL )
122 #define LFDS710_MISC_BARRIER_FULL
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
128 #define LFDS710_MISC_ATOMIC_SUPPORT_COMPILER_BARRIERS 0
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
134 #define LFDS710_MISC_ATOMIC_SUPPORT_PROCESSOR_BARRIERS 0
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(); }
141 enum lfds710_misc_cas_strength
143 // TRD : GCC defined values
144 LFDS710_MISC_CAS_STRENGTH_STRONG = 0,
145 LFDS710_MISC_CAS_STRENGTH_WEAK = 1,
148 enum lfds710_misc_validity
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,
161 enum lfds710_misc_flag
163 LFDS710_MISC_FLAG_LOWERED,
164 LFDS710_MISC_FLAG_RAISED
167 enum lfds710_misc_query
169 LFDS710_MISC_QUERY_GET_BUILD_AND_VERSION_STRING
172 enum lfds710_misc_data_structure
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
188 struct lfds710_misc_backoff_state
190 lfds710_pal_uint_t volatile LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
194 backoff_iteration_frequency_counters[2],
199 struct lfds710_misc_globals
201 struct lfds710_prng_state
205 struct lfds710_misc_validation_info
212 /***** externs *****/
213 extern struct lfds710_misc_globals
214 lfds710_misc_globals;
216 /***** public prototypes *****/
217 static LFDS710_PAL_INLINE void lfds710_misc_force_store( void );
219 void lfds710_misc_query( enum lfds710_misc_query query_type, void *query_input, void *query_output );
221 /***** public in-line functions *****/
222 #pragma prefast( disable : 28112, "blah" )
224 static LFDS710_PAL_INLINE void lfds710_misc_force_store()
226 lfds710_pal_uint_t volatile LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
229 LFDS710_PAL_ATOMIC_SET( &destination, 0 );