LCOV - differential code coverage report
Current view: top level - src/include/access - multixact_internal.h (source / functions) Coverage Total Hit UNC GNC
Current: 7a15cff1f11193467898da1c1fabf06fd2caee04 vs 84a3778c79c2d28b4dc281d03ef2ab019b16483b Lines: 82.6 % 23 19 4 19
Current Date: 2025-12-15 18:36:29 -0500 Functions: 75.0 % 8 6 2 6
Baseline: lcov-20251216-010103-baseline Line coverage date bins:
Baseline Date: 2025-12-15 13:30:48 -0800 (1,7] days: 82.6 % 23 19 4 19
Legend: Lines:     hit not hit Function coverage date bins:
(1,7] days: 75.0 % 8 6 2 6

 Age         Owner                  TLA  Line data    Source code
                                  1                 : /*
                                  2                 :  * multixact_internal.h
                                  3                 :  *
                                  4                 :  * PostgreSQL multi-transaction-log manager internal declarations
                                  5                 :  *
                                  6                 :  * These functions and definitions are for dealing with pg_multixact SLRU
                                  7                 :  * pages.  They are internal to multixact.c, but they are exported here to
                                  8                 :  * allow pg_upgrade to write pg_multixact files directly.
                                  9                 :  *
                                 10                 :  * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
                                 11                 :  * Portions Copyright (c) 1994, Regents of the University of California
                                 12                 :  *
                                 13                 :  * src/include/access/multixact_internal.h
                                 14                 :  */
                                 15                 : #ifndef MULTIXACT_INTERNAL_H
                                 16                 : 
                                 17                 : /*
                                 18                 :  * Note: This is not only to prevent including this file twice.
                                 19                 :  * MULTIXACT_INTERNAL_H is checked explicitly in multixact_read_v18.c.
                                 20                 :  */
                                 21                 : #define MULTIXACT_INTERNAL_H
                                 22                 : 
                                 23                 : #include "access/multixact.h"
                                 24                 : 
                                 25                 : 
                                 26                 : /*
                                 27                 :  * Defines for MultiXactOffset page sizes.  A page is the same BLCKSZ as is
                                 28                 :  * used everywhere else in Postgres.
                                 29                 :  */
                                 30                 : 
                                 31                 : /* We need 8 bytes per offset */
                                 32                 : #define MULTIXACT_OFFSETS_PER_PAGE (BLCKSZ / sizeof(MultiXactOffset))
                                 33                 : 
                                 34                 : static inline int64
    7 heikki.linnakangas@i       35 GNC      195899 : MultiXactIdToOffsetPage(MultiXactId multi)
                                 36                 : {
                                 37          195899 :     return multi / MULTIXACT_OFFSETS_PER_PAGE;
                                 38                 : }
                                 39                 : 
                                 40                 : static inline int
                                 41          200267 : MultiXactIdToOffsetEntry(MultiXactId multi)
                                 42                 : {
                                 43          200267 :     return multi % MULTIXACT_OFFSETS_PER_PAGE;
                                 44                 : }
                                 45                 : 
                                 46                 : static inline int64
    7 heikki.linnakangas@i       47 UNC           0 : MultiXactIdToOffsetSegment(MultiXactId multi)
                                 48                 : {
                                 49               0 :     return MultiXactIdToOffsetPage(multi) / SLRU_PAGES_PER_SEGMENT;
                                 50                 : }
                                 51                 : 
                                 52                 : /*
                                 53                 :  * The situation for members is a bit more complex: we store one byte of
                                 54                 :  * additional flag bits for each TransactionId.  To do this without getting
                                 55                 :  * into alignment issues, we store four bytes of flags, and then the
                                 56                 :  * corresponding 4 Xids.  Each such 5-word (20-byte) set we call a "group", and
                                 57                 :  * are stored as a whole in pages.  Thus, with 8kB BLCKSZ, we keep 409 groups
                                 58                 :  * per page.  This wastes 12 bytes per page, but that's OK -- simplicity (and
                                 59                 :  * performance) trumps space efficiency here.
                                 60                 :  *
                                 61                 :  * Note that the "offset" macros work with byte offset, not array indexes, so
                                 62                 :  * arithmetic must be done using "char *" pointers.
                                 63                 :  */
                                 64                 : /* We need eight bits per xact, so one xact fits in a byte */
                                 65                 : #define MXACT_MEMBER_BITS_PER_XACT          8
                                 66                 : #define MXACT_MEMBER_FLAGS_PER_BYTE         1
                                 67                 : #define MXACT_MEMBER_XACT_BITMASK   ((1 << MXACT_MEMBER_BITS_PER_XACT) - 1)
                                 68                 : 
                                 69                 : /* how many full bytes of flags are there in a group? */
                                 70                 : #define MULTIXACT_FLAGBYTES_PER_GROUP       4
                                 71                 : #define MULTIXACT_MEMBERS_PER_MEMBERGROUP   \
                                 72                 :     (MULTIXACT_FLAGBYTES_PER_GROUP * MXACT_MEMBER_FLAGS_PER_BYTE)
                                 73                 : /* size in bytes of a complete group */
                                 74                 : #define MULTIXACT_MEMBERGROUP_SIZE \
                                 75                 :     (sizeof(TransactionId) * MULTIXACT_MEMBERS_PER_MEMBERGROUP + MULTIXACT_FLAGBYTES_PER_GROUP)
                                 76                 : #define MULTIXACT_MEMBERGROUPS_PER_PAGE (BLCKSZ / MULTIXACT_MEMBERGROUP_SIZE)
                                 77                 : #define MULTIXACT_MEMBERS_PER_PAGE  \
                                 78                 :     (MULTIXACT_MEMBERGROUPS_PER_PAGE * MULTIXACT_MEMBERS_PER_MEMBERGROUP)
                                 79                 : 
                                 80                 : /* page in which a member is to be found */
                                 81                 : static inline int64
    7 heikki.linnakangas@i       82 GNC     1832752 : MXOffsetToMemberPage(MultiXactOffset offset)
                                 83                 : {
                                 84         1832752 :     return offset / MULTIXACT_MEMBERS_PER_PAGE;
                                 85                 : }
                                 86                 : 
                                 87                 : static inline int64
    7 heikki.linnakangas@i       88 UNC           0 : MXOffsetToMemberSegment(MultiXactOffset offset)
                                 89                 : {
                                 90               0 :     return MXOffsetToMemberPage(offset) / SLRU_PAGES_PER_SEGMENT;
                                 91                 : }
                                 92                 : 
                                 93                 : /* Location (byte offset within page) of flag word for a given member */
                                 94                 : static inline int
    7 heikki.linnakangas@i       95 GNC     3668038 : MXOffsetToFlagsOffset(MultiXactOffset offset)
                                 96                 : {
                                 97         3668038 :     MultiXactOffset group = offset / MULTIXACT_MEMBERS_PER_MEMBERGROUP;
                                 98         3668038 :     int         grouponpg = group % MULTIXACT_MEMBERGROUPS_PER_PAGE;
                                 99         3668038 :     int         byteoff = grouponpg * MULTIXACT_MEMBERGROUP_SIZE;
                                100                 : 
                                101         3668038 :     return byteoff;
                                102                 : }
                                103                 : 
                                104                 : static inline int
                                105         1836252 : MXOffsetToFlagsBitShift(MultiXactOffset offset)
                                106                 : {
                                107         1836252 :     int         member_in_group = offset % MULTIXACT_MEMBERS_PER_MEMBERGROUP;
                                108         1836252 :     int         bshift = member_in_group * MXACT_MEMBER_BITS_PER_XACT;
                                109                 : 
                                110         1836252 :     return bshift;
                                111                 : }
                                112                 : 
                                113                 : /* Location (byte offset within page) of TransactionId of given member */
                                114                 : static inline int
                                115         1830916 : MXOffsetToMemberOffset(MultiXactOffset offset)
                                116                 : {
                                117         1830916 :     int         member_in_group = offset % MULTIXACT_MEMBERS_PER_MEMBERGROUP;
                                118                 : 
                                119         1830916 :     return MXOffsetToFlagsOffset(offset) +
                                120         1830916 :         MULTIXACT_FLAGBYTES_PER_GROUP +
                                121                 :         member_in_group * sizeof(TransactionId);
                                122                 : }
                                123                 : 
                                124                 : #endif                          /* MULTIXACT_INTERNAL_H */
        

Generated by: LCOV version 2.4-beta