mirror of
https://github.com/postgres/postgres.git
synced 2025-10-27 00:12:01 +03:00
Eliminate divide in new fast-path locking code
c4d5cb71d2 adjusted the fast-path locking code to allow some
configuration of the number of fast-path locking slots via the
max_locks_per_transaction GUC. In that commit the FAST_PATH_REL_GROUP()
macro used integer division to determine the fast-path locking group slot
to use for the lock.
The divisor in this case is always a power-of-two value. Here we swap
out the divide by a bitwise-AND, which is a significantly faster
operation to perform.
In passing, adjust the code that's setting FastPathLockGroupsPerBackend
so that it's more clear that the value being set is a power-of-two.
Also, adjust some comments in the area which contained some magic
numbers. It seems better to justify the 1024 upper limit in the
location where the #define is made instead of where it is used.
Author: David Rowley <drowleyml@gmail.com>
Reviewed-by: Tomas Vondra <tomas@vondra.me>
Discussion: https://postgr.es/m/CAApHDvodr3bcnpxcs7+k-3cFwYR0tP-BYhyd2PpDhe-bCx9i=g@mail.gmail.com
This commit is contained in:
@@ -210,9 +210,12 @@ int FastPathLockGroupsPerBackend = 0;
|
||||
*
|
||||
* The selected constant (49157) is a prime not too close to 2^k, and it's
|
||||
* small enough to not cause overflows (in 64-bit).
|
||||
*
|
||||
* We can assume that FastPathLockGroupsPerBackend is a power-of-two per
|
||||
* InitializeFastPathLocks().
|
||||
*/
|
||||
#define FAST_PATH_REL_GROUP(rel) \
|
||||
(((uint64) (rel) * 49157) % FastPathLockGroupsPerBackend)
|
||||
(((uint64) (rel) * 49157) & (FastPathLockGroupsPerBackend - 1))
|
||||
|
||||
/*
|
||||
* Given the group/slot indexes, calculate the slot index in the whole array
|
||||
|
||||
Reference in New Issue
Block a user