mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-12 09:27:04 +08:00
Change pg_bsd_indent to follow upstream rules for placement of comments to the right of code, and remove pgindent hack that caused comments following #endif to not obey the general rule. Commit e3860ffa4dd0dad0dd9eea4be9cc1412373a8c89 wasn't actually using the published version of pg_bsd_indent, but a hacked-up version that tried to minimize the amount of movement of comments to the right of code. The situation of interest is where such a comment has to be moved to the right of its default placement at column 33 because there's code there. BSD indent has always moved right in units of tab stops in such cases --- but in the previous incarnation, indent was working in 8-space tab stops, while now it knows we use 4-space tabs. So the net result is that in about half the cases, such comments are placed one tab stop left of before. This is better all around: it leaves more room on the line for comment text, and it means that in such cases the comment uniformly starts at the next 4-space tab stop after the code, rather than sometimes one and sometimes two tabs after. Also, ensure that comments following #endif are indented the same as comments following other preprocessor commands such as #else. That inconsistency turns out to have been self-inflicted damage from a poorly-thought-through post-indent "fixup" in pgindent. This patch is much less interesting than the first round of indent changes, but also bulkier, so I thought it best to separate the effects. Discussion: https://postgr.es/m/E1dAmxK-0006EE-1r@gemulon.postgresql.org Discussion: https://postgr.es/m/30527.1495162840@sss.pgh.pa.us
130 lines
4.2 KiB
C
130 lines
4.2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* snapshot.h
|
|
* POSTGRES snapshot definition
|
|
*
|
|
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/utils/snapshot.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef SNAPSHOT_H
|
|
#define SNAPSHOT_H
|
|
|
|
#include "access/htup.h"
|
|
#include "access/xlogdefs.h"
|
|
#include "datatype/timestamp.h"
|
|
#include "lib/pairingheap.h"
|
|
#include "storage/buf.h"
|
|
|
|
|
|
typedef struct SnapshotData *Snapshot;
|
|
|
|
#define InvalidSnapshot ((Snapshot) NULL)
|
|
|
|
/*
|
|
* We use SnapshotData structures to represent both "regular" (MVCC)
|
|
* snapshots and "special" snapshots that have non-MVCC semantics.
|
|
* The specific semantics of a snapshot are encoded by the "satisfies"
|
|
* function.
|
|
*/
|
|
typedef bool (*SnapshotSatisfiesFunc) (HeapTuple htup,
|
|
Snapshot snapshot, Buffer buffer);
|
|
|
|
/*
|
|
* Struct representing all kind of possible snapshots.
|
|
*
|
|
* There are several different kinds of snapshots:
|
|
* * Normal MVCC snapshots
|
|
* * MVCC snapshots taken during recovery (in Hot-Standby mode)
|
|
* * Historic MVCC snapshots used during logical decoding
|
|
* * snapshots passed to HeapTupleSatisfiesDirty()
|
|
* * snapshots used for SatisfiesAny, Toast, Self where no members are
|
|
* accessed.
|
|
*
|
|
* TODO: It's probably a good idea to split this struct using a NodeTag
|
|
* similar to how parser and executor nodes are handled, with one type for
|
|
* each different kind of snapshot to avoid overloading the meaning of
|
|
* individual fields.
|
|
*/
|
|
typedef struct SnapshotData
|
|
{
|
|
SnapshotSatisfiesFunc satisfies; /* tuple test function */
|
|
|
|
/*
|
|
* The remaining fields are used only for MVCC snapshots, and are normally
|
|
* just zeroes in special snapshots. (But xmin and xmax are used
|
|
* specially by HeapTupleSatisfiesDirty.)
|
|
*
|
|
* An MVCC snapshot can never see the effects of XIDs >= xmax. It can see
|
|
* the effects of all older XIDs except those listed in the snapshot. xmin
|
|
* is stored as an optimization to avoid needing to search the XID arrays
|
|
* for most tuples.
|
|
*/
|
|
TransactionId xmin; /* all XID < xmin are visible to me */
|
|
TransactionId xmax; /* all XID >= xmax are invisible to me */
|
|
|
|
/*
|
|
* For normal MVCC snapshot this contains the all xact IDs that are in
|
|
* progress, unless the snapshot was taken during recovery in which case
|
|
* it's empty. For historic MVCC snapshots, the meaning is inverted, i.e.
|
|
* it contains *committed* transactions between xmin and xmax.
|
|
*
|
|
* note: all ids in xip[] satisfy xmin <= xip[i] < xmax
|
|
*/
|
|
TransactionId *xip;
|
|
uint32 xcnt; /* # of xact ids in xip[] */
|
|
|
|
/*
|
|
* For non-historic MVCC snapshots, this contains subxact IDs that are in
|
|
* progress (and other transactions that are in progress if taken during
|
|
* recovery). For historic snapshot it contains *all* xids assigned to the
|
|
* replayed transaction, including the toplevel xid.
|
|
*
|
|
* note: all ids in subxip[] are >= xmin, but we don't bother filtering
|
|
* out any that are >= xmax
|
|
*/
|
|
TransactionId *subxip;
|
|
int32 subxcnt; /* # of xact ids in subxip[] */
|
|
bool suboverflowed; /* has the subxip array overflowed? */
|
|
|
|
bool takenDuringRecovery; /* recovery-shaped snapshot? */
|
|
bool copied; /* false if it's a static snapshot */
|
|
|
|
CommandId curcid; /* in my xact, CID < curcid are visible */
|
|
|
|
/*
|
|
* An extra return value for HeapTupleSatisfiesDirty, not used in MVCC
|
|
* snapshots.
|
|
*/
|
|
uint32 speculativeToken;
|
|
|
|
/*
|
|
* Book-keeping information, used by the snapshot manager
|
|
*/
|
|
uint32 active_count; /* refcount on ActiveSnapshot stack */
|
|
uint32 regd_count; /* refcount on RegisteredSnapshots */
|
|
pairingheap_node ph_node; /* link in the RegisteredSnapshots heap */
|
|
|
|
TimestampTz whenTaken; /* timestamp when snapshot was taken */
|
|
XLogRecPtr lsn; /* position in the WAL stream when taken */
|
|
} SnapshotData;
|
|
|
|
/*
|
|
* Result codes for HeapTupleSatisfiesUpdate. This should really be in
|
|
* tqual.h, but we want to avoid including that file elsewhere.
|
|
*/
|
|
typedef enum
|
|
{
|
|
HeapTupleMayBeUpdated,
|
|
HeapTupleInvisible,
|
|
HeapTupleSelfUpdated,
|
|
HeapTupleUpdated,
|
|
HeapTupleBeingUpdated,
|
|
HeapTupleWouldBlock /* can be returned by heap_tuple_lock */
|
|
} HTSU_Result;
|
|
|
|
#endif /* SNAPSHOT_H */
|