@@ -86,37 +86,42 @@ static void pmix_pointer_array_destruct(pmix_pointer_array_t *array)
8686 * A classical find first zero bit (ffs) on a large array. It checks starting
8787 * from the indicated position until it finds a zero bit. If SET is true,
8888 * the bit is set. The position of the bit is returned in store.
89+ *
90+ * According to Section 6.4.4.1 of the C standard we don't need to prepend a type
91+ * indicator to constants (the type is inferred by the compiler according to
92+ * the number of bits necessary to represent it).
8993 */
90- #define FIND_FIRST_ZERO (START_IDX , STORE , SET ) \
94+ #define FIND_FIRST_ZERO (START_IDX , STORE ) \
9195 do { \
9296 uint32_t __b_idx, __b_pos; \
97+ if( 0 == table->number_free ) { \
98+ (STORE) = table->size; \
99+ break; \
100+ } \
93101 GET_BIT_POS((START_IDX), __b_idx, __b_pos); \
94- for (; table->free_bits[__b_idx] == 0xFFFFFFFFFFFFFFFFULL ; __b_idx++); \
102+ for (; table->free_bits[__b_idx] == 0xFFFFFFFFFFFFFFFFu ; __b_idx++); \
95103 assert(__b_idx < (uint32_t)table->size); \
96104 uint64_t __check_value = table->free_bits[__b_idx]; \
97105 __b_pos = 0; \
98106 \
99- if( 0x00000000FFFFFFFFULL == (__check_value & 0x00000000FFFFFFFFULL ) ) { \
107+ if( 0x00000000FFFFFFFFu == (__check_value & 0x00000000FFFFFFFFu ) ) { \
100108 __check_value >>= 32; __b_pos += 32; \
101109 } \
102- if( 0x000000000000FFFFULL == (__check_value & 0x000000000000FFFFULL ) ) { \
110+ if( 0x000000000000FFFFu == (__check_value & 0x000000000000FFFFu ) ) { \
103111 __check_value >>= 16; __b_pos += 16; \
104112 } \
105- if( 0x00000000000000FFULL == (__check_value & 0x00000000000000FFULL ) ) { \
113+ if( 0x00000000000000FFu == (__check_value & 0x00000000000000FFu ) ) { \
106114 __check_value >>= 8; __b_pos += 8; \
107115 } \
108- if( 0x000000000000000FULL == (__check_value & 0x000000000000000FULL ) ) { \
116+ if( 0x000000000000000Fu == (__check_value & 0x000000000000000Fu ) ) { \
109117 __check_value >>= 4; __b_pos += 4; \
110118 } \
111- if( 0x0000000000000003ULL == (__check_value & 0x0000000000000003ULL ) ) { \
119+ if( 0x0000000000000003u == (__check_value & 0x0000000000000003u ) ) { \
112120 __check_value >>= 2; __b_pos += 2; \
113121 } \
114- if( 0x0000000000000001ULL == (__check_value & 0x0000000000000001ULL ) ) { \
122+ if( 0x0000000000000001u == (__check_value & 0x0000000000000001u ) ) { \
115123 __b_pos += 1; \
116124 } \
117- if( (SET) ) { \
118- table->free_bits[__b_idx] |= (1ULL << __b_pos); \
119- } \
120125 (STORE) = (__b_idx * 8 * sizeof(uint64_t)) + __b_pos; \
121126 } while(0)
122127
@@ -127,8 +132,8 @@ static void pmix_pointer_array_destruct(pmix_pointer_array_t *array)
127132 do { \
128133 uint32_t __b_idx, __b_pos; \
129134 GET_BIT_POS((IDX), __b_idx, __b_pos); \
130- assert( 0 == (table->free_bits[__b_idx] & (1UL << __b_pos))); \
131- table->free_bits[__b_idx] |= (1ULL << __b_pos); \
135+ assert( 0 == (table->free_bits[__b_idx] & (((uint64_t)1) << __b_pos))); \
136+ table->free_bits[__b_idx] |= (((uint64_t)1) << __b_pos); \
132137 } while(0)
133138
134139/**
@@ -138,8 +143,8 @@ static void pmix_pointer_array_destruct(pmix_pointer_array_t *array)
138143 do { \
139144 uint32_t __b_idx, __b_pos; \
140145 GET_BIT_POS((IDX), __b_idx, __b_pos); \
141- assert( (table->free_bits[__b_idx] & (1UL << __b_pos))); \
142- table->free_bits[__b_idx] ^= (1ULL << __b_pos); \
146+ assert( (table->free_bits[__b_idx] & (((uint64_t)1) << __b_pos))); \
147+ table->free_bits[__b_idx] ^= (((uint64_t)1) << __b_pos); \
143148 } while(0)
144149
145150#if 0
@@ -157,9 +162,9 @@ static void pmix_pointer_array_validate(pmix_pointer_array_t *array)
157162 GET_BIT_POS (i , b_idx , p_idx );
158163 if ( NULL == array -> addr [i ] ) {
159164 cnt ++ ;
160- assert ( 0 == (array -> free_bits [b_idx ] & (1ULL << p_idx )) );
165+ assert ( 0 == (array -> free_bits [b_idx ] & ((( uint64_t ) 1 ) << p_idx )) );
161166 } else {
162- assert ( 0 != (array -> free_bits [b_idx ] & (1ULL << p_idx )) );
167+ assert ( 0 != (array -> free_bits [b_idx ] & ((( uint64_t ) 1 ) << p_idx )) );
163168 }
164169 }
165170 assert (cnt == array -> number_free );
@@ -236,7 +241,7 @@ int pmix_pointer_array_add(pmix_pointer_array_t *table, void *ptr)
236241 table -> number_free -- ;
237242 SET_BIT (index );
238243 if (table -> number_free > 0 ) {
239- FIND_FIRST_ZERO (index , table -> lowest_free , 0 );
244+ FIND_FIRST_ZERO (index , table -> lowest_free );
240245 } else {
241246 table -> lowest_free = table -> size ;
242247 }
@@ -290,7 +295,7 @@ int pmix_pointer_array_set_item(pmix_pointer_array_t *table, int index,
290295 SET_BIT (index );
291296 /* Reset lowest_free if required */
292297 if ( index == table -> lowest_free ) {
293- FIND_FIRST_ZERO (index , table -> lowest_free , 0 );
298+ FIND_FIRST_ZERO (index , table -> lowest_free );
294299 }
295300 } else {
296301 assert ( index != table -> lowest_free );
@@ -362,7 +367,7 @@ bool pmix_pointer_array_test_and_set_item (pmix_pointer_array_t *table,
362367 /* Reset lowest_free if required */
363368 if ( table -> number_free > 0 ) {
364369 if ( index == table -> lowest_free ) {
365- FIND_FIRST_ZERO (index , table -> lowest_free , 0 );
370+ FIND_FIRST_ZERO (index , table -> lowest_free );
366371 }
367372 } else {
368373 table -> lowest_free = table -> size ;
0 commit comments