mirror of
https://github.com/postgres/postgres.git
synced 2025-04-25 21:42:33 +03:00
Remove fls(), use pg_leftmost_one_pos32() instead.
Commit 4f658dc8 provided the traditional BSD fls() function in src/port/fls.c so it could be used in several places. Later we added a bunch of similar facilities in pg_bitutils.h, based on compiler builtins that map to hardware instructions. It's a bit confusing to have both 1-based and 0-based variants of this operation in use in different parts of the tree, and neither is blessed by a standard. Let's drop fls.c and the configure probe, and reuse the newer code. Reviewed-by: David Rowley <dgrowleyml@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/CA%2BhUKG%2B7dSX1XF8yFGmYk-%3D48dbjH2kmzZj16XvhbrWP-9BzRg%40mail.gmail.com
This commit is contained in:
parent
3225399021
commit
4f1f5a7f85
13
configure
vendored
13
configure
vendored
@ -16771,19 +16771,6 @@ esac
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ac_fn_c_check_func "$LINENO" "fls" "ac_cv_func_fls"
|
|
||||||
if test "x$ac_cv_func_fls" = xyes; then :
|
|
||||||
$as_echo "#define HAVE_FLS 1" >>confdefs.h
|
|
||||||
|
|
||||||
else
|
|
||||||
case " $LIBOBJS " in
|
|
||||||
*" fls.$ac_objext "* ) ;;
|
|
||||||
*) LIBOBJS="$LIBOBJS fls.$ac_objext"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
ac_fn_c_check_func "$LINENO" "getopt" "ac_cv_func_getopt"
|
ac_fn_c_check_func "$LINENO" "getopt" "ac_cv_func_getopt"
|
||||||
if test "x$ac_cv_func_getopt" = xyes; then :
|
if test "x$ac_cv_func_getopt" = xyes; then :
|
||||||
$as_echo "#define HAVE_GETOPT 1" >>confdefs.h
|
$as_echo "#define HAVE_GETOPT 1" >>confdefs.h
|
||||||
|
@ -1911,7 +1911,6 @@ fi
|
|||||||
AC_REPLACE_FUNCS(m4_normalize([
|
AC_REPLACE_FUNCS(m4_normalize([
|
||||||
dlopen
|
dlopen
|
||||||
explicit_bzero
|
explicit_bzero
|
||||||
fls
|
|
||||||
getopt
|
getopt
|
||||||
getpeereid
|
getpeereid
|
||||||
getrusage
|
getrusage
|
||||||
|
@ -436,7 +436,7 @@ _hash_get_oldblock_from_newbucket(Relation rel, Bucket new_bucket)
|
|||||||
* started. Masking the most significant bit of new bucket would give us
|
* started. Masking the most significant bit of new bucket would give us
|
||||||
* old bucket.
|
* old bucket.
|
||||||
*/
|
*/
|
||||||
mask = (((uint32) 1) << (fls(new_bucket) - 1)) - 1;
|
mask = (((uint32) 1) << pg_leftmost_one_pos32(new_bucket)) - 1;
|
||||||
old_bucket = new_bucket & mask;
|
old_bucket = new_bucket & mask;
|
||||||
|
|
||||||
metabuf = _hash_getbuf(rel, HASH_METAPAGE, HASH_READ, LH_META_PAGE);
|
metabuf = _hash_getbuf(rel, HASH_METAPAGE, HASH_READ, LH_META_PAGE);
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
#include "parser/parsetree.h"
|
#include "parser/parsetree.h"
|
||||||
#include "partitioning/partbounds.h"
|
#include "partitioning/partbounds.h"
|
||||||
#include "partitioning/partprune.h"
|
#include "partitioning/partprune.h"
|
||||||
|
#include "port/pg_bitutils.h"
|
||||||
#include "rewrite/rewriteManip.h"
|
#include "rewrite/rewriteManip.h"
|
||||||
#include "utils/lsyscache.h"
|
#include "utils/lsyscache.h"
|
||||||
|
|
||||||
@ -1491,7 +1492,7 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel,
|
|||||||
if (enable_parallel_append)
|
if (enable_parallel_append)
|
||||||
{
|
{
|
||||||
parallel_workers = Max(parallel_workers,
|
parallel_workers = Max(parallel_workers,
|
||||||
fls(list_length(live_childrels)));
|
pg_leftmost_one_pos32(list_length(live_childrels)) + 1);
|
||||||
parallel_workers = Min(parallel_workers,
|
parallel_workers = Min(parallel_workers,
|
||||||
max_parallel_workers_per_gather);
|
max_parallel_workers_per_gather);
|
||||||
}
|
}
|
||||||
@ -1542,7 +1543,7 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel,
|
|||||||
* the planned number of parallel workers.
|
* the planned number of parallel workers.
|
||||||
*/
|
*/
|
||||||
parallel_workers = Max(parallel_workers,
|
parallel_workers = Max(parallel_workers,
|
||||||
fls(list_length(live_childrels)));
|
pg_leftmost_one_pos32(list_length(live_childrels)) + 1);
|
||||||
parallel_workers = Min(parallel_workers,
|
parallel_workers = Min(parallel_workers,
|
||||||
max_parallel_workers_per_gather);
|
max_parallel_workers_per_gather);
|
||||||
Assert(parallel_workers > 0);
|
Assert(parallel_workers > 0);
|
||||||
|
@ -675,7 +675,7 @@ generate_union_paths(SetOperationStmt *op, PlannerInfo *root,
|
|||||||
if (enable_parallel_append)
|
if (enable_parallel_append)
|
||||||
{
|
{
|
||||||
parallel_workers = Max(parallel_workers,
|
parallel_workers = Max(parallel_workers,
|
||||||
fls(list_length(partial_pathlist)));
|
pg_leftmost_one_pos32(list_length(partial_pathlist)) + 1);
|
||||||
parallel_workers = Min(parallel_workers,
|
parallel_workers = Min(parallel_workers,
|
||||||
max_parallel_workers_per_gather);
|
max_parallel_workers_per_gather);
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@
|
|||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
|
||||||
#include "port/atomics.h"
|
#include "port/atomics.h"
|
||||||
|
#include "port/pg_bitutils.h"
|
||||||
#include "storage/dsm.h"
|
#include "storage/dsm.h"
|
||||||
#include "storage/ipc.h"
|
#include "storage/ipc.h"
|
||||||
#include "storage/lwlock.h"
|
#include "storage/lwlock.h"
|
||||||
@ -137,7 +138,18 @@ typedef size_t dsa_segment_index;
|
|||||||
* free pages? There is no point in looking in segments in lower bins; they
|
* free pages? There is no point in looking in segments in lower bins; they
|
||||||
* definitely can't service a request for n free pages.
|
* definitely can't service a request for n free pages.
|
||||||
*/
|
*/
|
||||||
#define contiguous_pages_to_segment_bin(n) Min(fls(n), DSA_NUM_SEGMENT_BINS - 1)
|
static inline size_t
|
||||||
|
contiguous_pages_to_segment_bin(size_t n)
|
||||||
|
{
|
||||||
|
size_t bin;
|
||||||
|
|
||||||
|
if (n == 0)
|
||||||
|
bin = 0;
|
||||||
|
else
|
||||||
|
bin = pg_leftmost_one_pos_size_t(n) + 1;
|
||||||
|
|
||||||
|
return Min(bin, DSA_NUM_SEGMENT_BINS - 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Macros for access to locks. */
|
/* Macros for access to locks. */
|
||||||
#define DSA_AREA_LOCK(area) (&area->control->lock)
|
#define DSA_AREA_LOCK(area) (&area->control->lock)
|
||||||
|
@ -191,9 +191,6 @@
|
|||||||
/* Define to 1 if you have the `fdatasync' function. */
|
/* Define to 1 if you have the `fdatasync' function. */
|
||||||
#undef HAVE_FDATASYNC
|
#undef HAVE_FDATASYNC
|
||||||
|
|
||||||
/* Define to 1 if you have the `fls' function. */
|
|
||||||
#undef HAVE_FLS
|
|
||||||
|
|
||||||
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
|
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
|
||||||
#undef HAVE_FSEEKO
|
#undef HAVE_FSEEKO
|
||||||
|
|
||||||
|
@ -366,10 +366,6 @@ extern int gettimeofday(struct timeval *tp, struct timezone *tzp);
|
|||||||
#define pgoff_t off_t
|
#define pgoff_t off_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_FLS
|
|
||||||
extern int fls(int mask);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_GETPEEREID
|
#ifndef HAVE_GETPEEREID
|
||||||
/* On Windows, Perl might have incompatible definitions of uid_t and gid_t. */
|
/* On Windows, Perl might have incompatible definitions of uid_t and gid_t. */
|
||||||
#ifndef PLPERL_HAVE_UID_GID
|
#ifndef PLPERL_HAVE_UID_GID
|
||||||
|
@ -1,64 +0,0 @@
|
|||||||
/*-------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* fls.c
|
|
||||||
* finds the last (most significant) bit that is set
|
|
||||||
*
|
|
||||||
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* IDENTIFICATION
|
|
||||||
* src/port/fls.c
|
|
||||||
*
|
|
||||||
* This file was taken from FreeBSD to provide an implementation of fls()
|
|
||||||
* for platforms that lack it. Note that the operating system's version may
|
|
||||||
* be substantially more efficient than ours, since some platforms have an
|
|
||||||
* assembly instruction that does exactly this.
|
|
||||||
*
|
|
||||||
* The FreeBSD copyright terms follow.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 1990, 1993
|
|
||||||
* The Regents of the University of California. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 4. Neither the name of the University nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "c.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Find Last Set bit
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
fls(int mask)
|
|
||||||
{
|
|
||||||
int bit;
|
|
||||||
|
|
||||||
if (mask == 0)
|
|
||||||
return (0);
|
|
||||||
for (bit = 1; mask != 1; bit++)
|
|
||||||
mask = (unsigned int) mask >> 1;
|
|
||||||
return (bit);
|
|
||||||
}
|
|
@ -99,7 +99,7 @@ sub mkvcbuild
|
|||||||
$solution = CreateSolution($vsVersion, $config);
|
$solution = CreateSolution($vsVersion, $config);
|
||||||
|
|
||||||
our @pgportfiles = qw(
|
our @pgportfiles = qw(
|
||||||
chklocale.c explicit_bzero.c fls.c fdatasync.c
|
chklocale.c explicit_bzero.c fdatasync.c
|
||||||
getpeereid.c getrusage.c inet_aton.c
|
getpeereid.c getrusage.c inet_aton.c
|
||||||
getaddrinfo.c gettimeofday.c inet_net_ntop.c kill.c open.c
|
getaddrinfo.c gettimeofday.c inet_net_ntop.c kill.c open.c
|
||||||
snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c
|
snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c
|
||||||
|
@ -258,7 +258,6 @@ sub GenerateFiles
|
|||||||
HAVE_EXECINFO_H => undef,
|
HAVE_EXECINFO_H => undef,
|
||||||
HAVE_EXPLICIT_BZERO => undef,
|
HAVE_EXPLICIT_BZERO => undef,
|
||||||
HAVE_FDATASYNC => 1,
|
HAVE_FDATASYNC => 1,
|
||||||
HAVE_FLS => undef,
|
|
||||||
HAVE_FSEEKO => 1,
|
HAVE_FSEEKO => 1,
|
||||||
HAVE_FUNCNAME__FUNC => undef,
|
HAVE_FUNCNAME__FUNC => undef,
|
||||||
HAVE_FUNCNAME__FUNCTION => 1,
|
HAVE_FUNCNAME__FUNCTION => 1,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user