From: Robert Haas Date: Wed, 22 Sep 2021 19:18:53 +0000 (-0400) Subject: replace cb_metapage_find_free_segment with something less clever but X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=3a01ad90cd905cbd8e40fab7166aa4ecde360dbf;p=users%2Frhaas%2Fpostgres.git replace cb_metapage_find_free_segment with something less clever but maybe more correct --- diff --git a/src/backend/access/conveyor/cbmetapage.c b/src/backend/access/conveyor/cbmetapage.c index 188089b71b..091bce072f 100644 --- a/src/backend/access/conveyor/cbmetapage.c +++ b/src/backend/access/conveyor/cbmetapage.c @@ -467,24 +467,19 @@ CBSegNo cb_metapage_find_free_segment(CBMetapageData *meta) { unsigned i; + unsigned j; - StaticAssertStmt(CB_METAPAGE_FREESPACE_BYTES % sizeof(uint64) == 0, - "CB_METAPAGE_FREESPACE_BYTES should be a multiple of 8"); - - for (i = 0; i < CB_METAPAGE_FREESPACE_BYTES; i += sizeof(uint64)) + for (i = 0; i < CB_METAPAGE_FREESPACE_BYTES; ++i) { - uint64 word = *(uint64 *) &meta->cbm_freespace_map[i]; - - if (word != PG_UINT64_MAX) - { - uint64 flipword = ~word; - int b = fls((int) flipword); + uint8 b = meta->cbm_freespace_map[i]; - if (b == 0) - b = 32 + fls((int) (flipword >> 32)); + if (b == 0xFF) + continue; - Assert(b >= 1 && b <= 64); - return (i * BITS_PER_BYTE) + (b - 1); + for (j = 0; j < BITS_PER_BYTES; ++j) + { + if ((b & (1 << j)) == 0) + return (i * BITS_PER_BYTE) + j; } }