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