@@ -2015,34 +2015,37 @@ EstimateSnapshotSpace(Snapshot snap)
2015
2015
void
2016
2016
SerializeSnapshot (Snapshot snapshot , char * start_address )
2017
2017
{
2018
- SerializedSnapshotData * serialized_snapshot ;
2018
+ SerializedSnapshotData serialized_snapshot ;
2019
2019
2020
2020
Assert (snapshot -> subxcnt >= 0 );
2021
2021
2022
- serialized_snapshot = (SerializedSnapshotData * ) start_address ;
2023
-
2024
2022
/* Copy all required fields */
2025
- serialized_snapshot -> xmin = snapshot -> xmin ;
2026
- serialized_snapshot -> xmax = snapshot -> xmax ;
2027
- serialized_snapshot -> xcnt = snapshot -> xcnt ;
2028
- serialized_snapshot -> subxcnt = snapshot -> subxcnt ;
2029
- serialized_snapshot -> suboverflowed = snapshot -> suboverflowed ;
2030
- serialized_snapshot -> takenDuringRecovery = snapshot -> takenDuringRecovery ;
2031
- serialized_snapshot -> curcid = snapshot -> curcid ;
2032
- serialized_snapshot -> whenTaken = snapshot -> whenTaken ;
2033
- serialized_snapshot -> lsn = snapshot -> lsn ;
2023
+ serialized_snapshot . xmin = snapshot -> xmin ;
2024
+ serialized_snapshot . xmax = snapshot -> xmax ;
2025
+ serialized_snapshot . xcnt = snapshot -> xcnt ;
2026
+ serialized_snapshot . subxcnt = snapshot -> subxcnt ;
2027
+ serialized_snapshot . suboverflowed = snapshot -> suboverflowed ;
2028
+ serialized_snapshot . takenDuringRecovery = snapshot -> takenDuringRecovery ;
2029
+ serialized_snapshot . curcid = snapshot -> curcid ;
2030
+ serialized_snapshot . whenTaken = snapshot -> whenTaken ;
2031
+ serialized_snapshot . lsn = snapshot -> lsn ;
2034
2032
2035
2033
/*
2036
2034
* Ignore the SubXID array if it has overflowed, unless the snapshot was
2037
2035
* taken during recovey - in that case, top-level XIDs are in subxip as
2038
2036
* well, and we mustn't lose them.
2039
2037
*/
2040
- if (serialized_snapshot -> suboverflowed && !snapshot -> takenDuringRecovery )
2041
- serialized_snapshot -> subxcnt = 0 ;
2038
+ if (serialized_snapshot .suboverflowed && !snapshot -> takenDuringRecovery )
2039
+ serialized_snapshot .subxcnt = 0 ;
2040
+
2041
+ /* Copy struct to possibly-unaligned buffer */
2042
+ memcpy (start_address ,
2043
+ & serialized_snapshot , sizeof (SerializedSnapshotData ));
2042
2044
2043
2045
/* Copy XID array */
2044
2046
if (snapshot -> xcnt > 0 )
2045
- memcpy ((TransactionId * ) (serialized_snapshot + 1 ),
2047
+ memcpy ((TransactionId * ) (start_address +
2048
+ sizeof (SerializedSnapshotData )),
2046
2049
snapshot -> xip , snapshot -> xcnt * sizeof (TransactionId ));
2047
2050
2048
2051
/*
@@ -2051,12 +2054,12 @@ SerializeSnapshot(Snapshot snapshot, char *start_address)
2051
2054
* snapshot taken during recovery; all the top-level XIDs are in subxip as
2052
2055
* well in that case, so we mustn't lose them.
2053
2056
*/
2054
- if (serialized_snapshot -> subxcnt > 0 )
2057
+ if (serialized_snapshot . subxcnt > 0 )
2055
2058
{
2056
2059
Size subxipoff = sizeof (SerializedSnapshotData ) +
2057
2060
snapshot -> xcnt * sizeof (TransactionId );
2058
2061
2059
- memcpy ((TransactionId * ) (( char * ) serialized_snapshot + subxipoff ),
2062
+ memcpy ((TransactionId * ) (start_address + subxipoff ),
2060
2063
snapshot -> subxip , snapshot -> subxcnt * sizeof (TransactionId ));
2061
2064
}
2062
2065
}
@@ -2071,50 +2074,51 @@ SerializeSnapshot(Snapshot snapshot, char *start_address)
2071
2074
Snapshot
2072
2075
RestoreSnapshot (char * start_address )
2073
2076
{
2074
- SerializedSnapshotData * serialized_snapshot ;
2077
+ SerializedSnapshotData serialized_snapshot ;
2075
2078
Size size ;
2076
2079
Snapshot snapshot ;
2077
2080
TransactionId * serialized_xids ;
2078
2081
2079
- serialized_snapshot = (SerializedSnapshotData * ) start_address ;
2082
+ memcpy (& serialized_snapshot , start_address ,
2083
+ sizeof (SerializedSnapshotData ));
2080
2084
serialized_xids = (TransactionId * )
2081
2085
(start_address + sizeof (SerializedSnapshotData ));
2082
2086
2083
2087
/* We allocate any XID arrays needed in the same palloc block. */
2084
2088
size = sizeof (SnapshotData )
2085
- + serialized_snapshot -> xcnt * sizeof (TransactionId )
2086
- + serialized_snapshot -> subxcnt * sizeof (TransactionId );
2089
+ + serialized_snapshot . xcnt * sizeof (TransactionId )
2090
+ + serialized_snapshot . subxcnt * sizeof (TransactionId );
2087
2091
2088
2092
/* Copy all required fields */
2089
2093
snapshot = (Snapshot ) MemoryContextAlloc (TopTransactionContext , size );
2090
2094
snapshot -> satisfies = HeapTupleSatisfiesMVCC ;
2091
- snapshot -> xmin = serialized_snapshot -> xmin ;
2092
- snapshot -> xmax = serialized_snapshot -> xmax ;
2095
+ snapshot -> xmin = serialized_snapshot . xmin ;
2096
+ snapshot -> xmax = serialized_snapshot . xmax ;
2093
2097
snapshot -> xip = NULL ;
2094
- snapshot -> xcnt = serialized_snapshot -> xcnt ;
2098
+ snapshot -> xcnt = serialized_snapshot . xcnt ;
2095
2099
snapshot -> subxip = NULL ;
2096
- snapshot -> subxcnt = serialized_snapshot -> subxcnt ;
2097
- snapshot -> suboverflowed = serialized_snapshot -> suboverflowed ;
2098
- snapshot -> takenDuringRecovery = serialized_snapshot -> takenDuringRecovery ;
2099
- snapshot -> curcid = serialized_snapshot -> curcid ;
2100
- snapshot -> whenTaken = serialized_snapshot -> whenTaken ;
2101
- snapshot -> lsn = serialized_snapshot -> lsn ;
2100
+ snapshot -> subxcnt = serialized_snapshot . subxcnt ;
2101
+ snapshot -> suboverflowed = serialized_snapshot . suboverflowed ;
2102
+ snapshot -> takenDuringRecovery = serialized_snapshot . takenDuringRecovery ;
2103
+ snapshot -> curcid = serialized_snapshot . curcid ;
2104
+ snapshot -> whenTaken = serialized_snapshot . whenTaken ;
2105
+ snapshot -> lsn = serialized_snapshot . lsn ;
2102
2106
2103
2107
/* Copy XIDs, if present. */
2104
- if (serialized_snapshot -> xcnt > 0 )
2108
+ if (serialized_snapshot . xcnt > 0 )
2105
2109
{
2106
2110
snapshot -> xip = (TransactionId * ) (snapshot + 1 );
2107
2111
memcpy (snapshot -> xip , serialized_xids ,
2108
- serialized_snapshot -> xcnt * sizeof (TransactionId ));
2112
+ serialized_snapshot . xcnt * sizeof (TransactionId ));
2109
2113
}
2110
2114
2111
2115
/* Copy SubXIDs, if present. */
2112
- if (serialized_snapshot -> subxcnt > 0 )
2116
+ if (serialized_snapshot . subxcnt > 0 )
2113
2117
{
2114
2118
snapshot -> subxip = ((TransactionId * ) (snapshot + 1 )) +
2115
- serialized_snapshot -> xcnt ;
2116
- memcpy (snapshot -> subxip , serialized_xids + serialized_snapshot -> xcnt ,
2117
- serialized_snapshot -> subxcnt * sizeof (TransactionId ));
2119
+ serialized_snapshot . xcnt ;
2120
+ memcpy (snapshot -> subxip , serialized_xids + serialized_snapshot . xcnt ,
2121
+ serialized_snapshot . subxcnt * sizeof (TransactionId ));
2118
2122
}
2119
2123
2120
2124
/* Set the copied flag so that the caller will set refcounts correctly. */
0 commit comments