opal: fix FIND_FIRST_ZERO macro for opal_pointer_array internal handling
Thanks George for the patch. Signed-off-by: Gilles Gouaillardet <gilles@rist.or.jp>
Этот коммит содержится в:
родитель
d7ebcca93f
Коммит
3c6631ff6c
@ -88,9 +88,13 @@ static void opal_pointer_array_destruct(opal_pointer_array_t *array)
|
|||||||
* from the indicated position until it finds a zero bit. If SET is true,
|
* from the indicated position until it finds a zero bit. If SET is true,
|
||||||
* the bit is set. The position of the bit is returned in store.
|
* the bit is set. The position of the bit is returned in store.
|
||||||
*/
|
*/
|
||||||
#define FIND_FIRST_ZERO(START_IDX, STORE, SET) \
|
#define FIND_FIRST_ZERO(START_IDX, STORE) \
|
||||||
do { \
|
do { \
|
||||||
uint32_t __b_idx, __b_pos; \
|
uint32_t __b_idx, __b_pos; \
|
||||||
|
if( 0 == table->number_free ) { \
|
||||||
|
(STORE) = table->size; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
GET_BIT_POS((START_IDX), __b_idx, __b_pos); \
|
GET_BIT_POS((START_IDX), __b_idx, __b_pos); \
|
||||||
for (; table->free_bits[__b_idx] == 0xFFFFFFFFFFFFFFFFULL; __b_idx++); \
|
for (; table->free_bits[__b_idx] == 0xFFFFFFFFFFFFFFFFULL; __b_idx++); \
|
||||||
assert(__b_idx < (uint32_t)table->size); \
|
assert(__b_idx < (uint32_t)table->size); \
|
||||||
@ -115,9 +119,6 @@ static void opal_pointer_array_destruct(opal_pointer_array_t *array)
|
|||||||
if( 0x0000000000000001ULL == (__check_value & 0x0000000000000001ULL) ) { \
|
if( 0x0000000000000001ULL == (__check_value & 0x0000000000000001ULL) ) { \
|
||||||
__b_pos += 1; \
|
__b_pos += 1; \
|
||||||
} \
|
} \
|
||||||
if( (SET) ) { \
|
|
||||||
table->free_bits[__b_idx] |= (1ULL << __b_pos); \
|
|
||||||
} \
|
|
||||||
(STORE) = (__b_idx * 8 * sizeof(uint64_t)) + __b_pos; \
|
(STORE) = (__b_idx * 8 * sizeof(uint64_t)) + __b_pos; \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
@ -240,7 +241,7 @@ int opal_pointer_array_add(opal_pointer_array_t *table, void *ptr)
|
|||||||
table->number_free--;
|
table->number_free--;
|
||||||
SET_BIT(index);
|
SET_BIT(index);
|
||||||
if (table->number_free > 0) {
|
if (table->number_free > 0) {
|
||||||
FIND_FIRST_ZERO(index, table->lowest_free, 0);
|
FIND_FIRST_ZERO(index, table->lowest_free);
|
||||||
} else {
|
} else {
|
||||||
table->lowest_free = table->size;
|
table->lowest_free = table->size;
|
||||||
}
|
}
|
||||||
@ -297,7 +298,7 @@ int opal_pointer_array_set_item(opal_pointer_array_t *table, int index,
|
|||||||
SET_BIT(index);
|
SET_BIT(index);
|
||||||
/* Reset lowest_free if required */
|
/* Reset lowest_free if required */
|
||||||
if ( index == table->lowest_free ) {
|
if ( index == table->lowest_free ) {
|
||||||
FIND_FIRST_ZERO(index, table->lowest_free, 0);
|
FIND_FIRST_ZERO(index, table->lowest_free);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
assert( index != table->lowest_free );
|
assert( index != table->lowest_free );
|
||||||
@ -373,7 +374,7 @@ bool opal_pointer_array_test_and_set_item (opal_pointer_array_t *table,
|
|||||||
/* Reset lowest_free if required */
|
/* Reset lowest_free if required */
|
||||||
if( table->number_free > 0 ) {
|
if( table->number_free > 0 ) {
|
||||||
if ( index == table->lowest_free ) {
|
if ( index == table->lowest_free ) {
|
||||||
FIND_FIRST_ZERO(index, table->lowest_free, 0);
|
FIND_FIRST_ZERO(index, table->lowest_free);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
table->lowest_free = table->size;
|
table->lowest_free = table->size;
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user