Use FLEXIBLE_ARRAY_MEMBER in some more places.
authorTom Lane
Fri, 20 Feb 2015 22:32:01 +0000 (17:32 -0500)
committerTom Lane
Fri, 20 Feb 2015 22:32:01 +0000 (17:32 -0500)
Fix a batch of structs that are only visible within individual .c files.

Michael Paquier

src/backend/access/nbtree/nbtutils.c
src/backend/access/transam/multixact.c
src/backend/access/transam/twophase.c
src/backend/commands/tablespace.c
src/backend/commands/trigger.c
src/backend/executor/nodeAgg.c
src/backend/postmaster/checkpointer.c
src/backend/storage/ipc/pmsignal.c
src/backend/storage/ipc/procarray.c
src/backend/utils/cache/inval.c
src/backend/utils/cache/typcache.c

index 43e048cc0c04e451eb8e2c288329619c0a2c1d6f..379dac98a57c97eb8e95200050a11df4612c7107 100644 (file)
@@ -1836,7 +1836,7 @@ typedef struct BTVacInfo
    BTCycleId   cycle_ctr;      /* cycle ID most recently assigned */
    int         num_vacuums;    /* number of currently active VACUUMs */
    int         max_vacuums;    /* allocated length of vacuums[] array */
-   BTOneVacInfo vacuums[1];    /* VARIABLE LENGTH ARRAY */
+   BTOneVacInfo vacuums[FLEXIBLE_ARRAY_MEMBER];
 } BTVacInfo;
 
 static BTVacInfo *btvacinfo;
@@ -1984,7 +1984,7 @@ BTreeShmemSize(void)
 {
    Size        size;
 
-   size = offsetof(BTVacInfo, vacuums[0]);
+   size = offsetof(BTVacInfo, vacuums);
    size = add_size(size, mul_size(MaxBackends, sizeof(BTOneVacInfo)));
    return size;
 }
index b2cf770f9f7c0a8480347df6ff8921af4c29b58b..f9ca0283e256a05fe435e15a1eb62e1096d0e325 100644 (file)
@@ -258,7 +258,7 @@ typedef struct MultiXactStateData
     * stored in pg_control and used as truncation point for pg_multixact.  At
     * checkpoint or restartpoint, unneeded segments are removed.
     */
-   MultiXactId perBackendXactIds[1];   /* VARIABLE LENGTH ARRAY */
+   MultiXactId perBackendXactIds[FLEXIBLE_ARRAY_MEMBER];
 } MultiXactStateData;
 
 /*
@@ -1744,8 +1744,9 @@ MultiXactShmemSize(void)
 {
    Size        size;
 
+   /* We need 2*MaxOldestSlot + 1 perBackendXactIds[] entries */
 #define SHARED_MULTIXACT_STATE_SIZE \
-   add_size(sizeof(MultiXactStateData), \
+   add_size(offsetof(MultiXactStateData, perBackendXactIds) + sizeof(MultiXactId), \
             mul_size(sizeof(MultiXactId) * 2, MaxOldestSlot))
 
    size = SHARED_MULTIXACT_STATE_SIZE;
index 6c7029edf0b91894e5755ea65c9d3d218b1a3cd5..6edc22704cc5b00a08d1154c49a2152063264398 100644 (file)
@@ -134,12 +134,9 @@ typedef struct TwoPhaseStateData
    /* Number of valid prepXacts entries. */
    int         numPrepXacts;
 
-   /*
-    * There are max_prepared_xacts items in this array, but C wants a
-    * fixed-size array.
-    */
-   GlobalTransaction prepXacts[1];     /* VARIABLE LENGTH ARRAY */
-} TwoPhaseStateData;           /* VARIABLE LENGTH STRUCT */
+   /* There are max_prepared_xacts items in this array */
+   GlobalTransaction prepXacts[FLEXIBLE_ARRAY_MEMBER];
+} TwoPhaseStateData;
 
 static TwoPhaseStateData *TwoPhaseState;
 
index e098b9f9685a1bddd85acfa77f139516ebdd605c..03cc8fe8d800faff9c2c21365aa3cdcf4f7e1a62 100644 (file)
@@ -1088,7 +1088,7 @@ GetDefaultTablespace(char relpersistence)
 typedef struct
 {
    int         numSpcs;
-   Oid         tblSpcs[1];     /* VARIABLE LENGTH ARRAY */
+   Oid         tblSpcs[FLEXIBLE_ARRAY_MEMBER];
 } temp_tablespaces_extra;
 
 /* check_hook: validate new temp_tablespaces */
index 5c1c1beb2b8553536b896e7491b1b9668541015d..a84e86ef805b4af0889609db1b905a13901847fb 100644 (file)
@@ -3005,7 +3005,7 @@ typedef struct SetConstraintStateData
    bool        all_isdeferred;
    int         numstates;      /* number of trigstates[] entries in use */
    int         numalloc;       /* allocated size of trigstates[] */
-   SetConstraintTriggerData trigstates[1];     /* VARIABLE LENGTH ARRAY */
+   SetConstraintTriggerData trigstates[FLEXIBLE_ARRAY_MEMBER];
 } SetConstraintStateData;
 
 typedef SetConstraintStateData *SetConstraintState;
@@ -4398,8 +4398,8 @@ SetConstraintStateCreate(int numalloc)
     */
    state = (SetConstraintState)
        MemoryContextAllocZero(TopTransactionContext,
-                              sizeof(SetConstraintStateData) +
-                          (numalloc - 1) *sizeof(SetConstraintTriggerData));
+                              offsetof(SetConstraintStateData, trigstates) +
+                          numalloc * sizeof(SetConstraintTriggerData));
 
    state->numalloc = numalloc;
 
@@ -4440,8 +4440,8 @@ SetConstraintStateAddItem(SetConstraintState state,
        newalloc = Max(newalloc, 8);    /* in case original has size 0 */
        state = (SetConstraintState)
            repalloc(state,
-                    sizeof(SetConstraintStateData) +
-                    (newalloc - 1) *sizeof(SetConstraintTriggerData));
+                    offsetof(SetConstraintStateData, trigstates) +
+                    newalloc * sizeof(SetConstraintTriggerData));
        state->numalloc = newalloc;
        Assert(state->numstates < state->numalloc);
    }
index 8079d97764318fdda3f939ae7165e79e220232df..9ff0eff6d7b90771b4649e9f41f783df0deed19b 100644 (file)
@@ -297,9 +297,9 @@ typedef struct AggHashEntryData *AggHashEntry;
 typedef struct AggHashEntryData
 {
    TupleHashEntryData shared;  /* common header for hash table entries */
-   /* per-aggregate transition status array - must be last! */
-   AggStatePerGroupData pergroup[1];   /* VARIABLE LENGTH ARRAY */
-}  AggHashEntryData;   /* VARIABLE LENGTH STRUCT */
+   /* per-aggregate transition status array */
+   AggStatePerGroupData pergroup[FLEXIBLE_ARRAY_MEMBER];
+}  AggHashEntryData;
 
 
 static void initialize_aggregates(AggState *aggstate,
@@ -941,8 +941,8 @@ build_hash_table(AggState *aggstate)
    Assert(node->aggstrategy == AGG_HASHED);
    Assert(node->numGroups > 0);
 
-   entrysize = sizeof(AggHashEntryData) +
-       (aggstate->numaggs - 1) * sizeof(AggStatePerGroupData);
+   entrysize = offsetof(AggHashEntryData, pergroup) +
+       aggstate->numaggs * sizeof(AggStatePerGroupData);
 
    aggstate->hashtable = BuildTupleHashTable(node->numCols,
                                              node->grpColIdx,
@@ -1013,8 +1013,8 @@ hash_agg_entry_size(int numAggs)
    Size        entrysize;
 
    /* This must match build_hash_table */
-   entrysize = sizeof(AggHashEntryData) +
-       (numAggs - 1) * sizeof(AggStatePerGroupData);
+   entrysize = offsetof(AggHashEntryData, pergroup) +
+       numAggs * sizeof(AggStatePerGroupData);
    entrysize = MAXALIGN(entrysize);
    /* Account for hashtable overhead (assuming fill factor = 1) */
    entrysize += 3 * sizeof(void *);
index 237be121dd658fc4e305e0562e6e291d453a766f..cfad08d5528e992191c89139278ed4c159dad3ef 100644 (file)
@@ -130,7 +130,7 @@ typedef struct
 
    int         num_requests;   /* current # of requests */
    int         max_requests;   /* allocated array size */
-   CheckpointerRequest requests[1];    /* VARIABLE LENGTH ARRAY */
+   CheckpointerRequest requests[FLEXIBLE_ARRAY_MEMBER];
 } CheckpointerShmemStruct;
 
 static CheckpointerShmemStruct *CheckpointerShmem;
index 0c89eb7d9d0cf7baa06eafe286a4c38f54eab970..ea3fe20549189acb551efa868e922d7ef75a3b88 100644 (file)
@@ -66,7 +66,7 @@ struct PMSignalData
    /* per-child-process flags */
    int         num_child_flags;    /* # of entries in PMChildFlags[] */
    int         next_child_flag;    /* next slot to try to assign */
-   sig_atomic_t PMChildFlags[1];       /* VARIABLE LENGTH ARRAY */
+   sig_atomic_t PMChildFlags[FLEXIBLE_ARRAY_MEMBER];
 };
 
 NON_EXEC_STATIC volatile PMSignalData *PMSignalState = NULL;
index a1ebc72d8d55730aace019f565055794f5b44720..8eaec0ca6eda7bb66301cf3cb8b5811ca8ad6c78 100644 (file)
@@ -90,11 +90,8 @@ typedef struct ProcArrayStruct
    /* oldest catalog xmin of any replication slot */
    TransactionId replication_slot_catalog_xmin;
 
-   /*
-    * We declare pgprocnos[] as 1 entry because C wants a fixed-size array,
-    * but actually it is maxProcs entries long.
-    */
-   int         pgprocnos[1];   /* VARIABLE LENGTH ARRAY */
+   /* indexes into allPgXact[], has PROCARRAY_MAXPROCS entries */
+   int         pgprocnos[FLEXIBLE_ARRAY_MEMBER];
 } ProcArrayStruct;
 
 static ProcArrayStruct *procArray;
index 0f2192c7252f8ef264c77f27b744aec5588049f6..8826a5d50b22ddcfed3972d10fae35e168965aec 100644 (file)
@@ -122,8 +122,8 @@ typedef struct InvalidationChunk
    struct InvalidationChunk *next;     /* list link */
    int         nitems;         /* # items currently stored in chunk */
    int         maxitems;       /* size of allocated array in this chunk */
-   SharedInvalidationMessage msgs[1];  /* VARIABLE LENGTH ARRAY */
-} InvalidationChunk;           /* VARIABLE LENGTH STRUCTURE */
+   SharedInvalidationMessage msgs[FLEXIBLE_ARRAY_MEMBER];
+} InvalidationChunk;
 
 typedef struct InvalidationListHeader
 {
@@ -225,8 +225,8 @@ AddInvalidationMessage(InvalidationChunk **listHdr,
 #define FIRSTCHUNKSIZE 32
        chunk = (InvalidationChunk *)
            MemoryContextAlloc(CurTransactionContext,
-                              sizeof(InvalidationChunk) +
-                   (FIRSTCHUNKSIZE - 1) *sizeof(SharedInvalidationMessage));
+                              offsetof(InvalidationChunk, msgs) +
+                   FIRSTCHUNKSIZE * sizeof(SharedInvalidationMessage));
        chunk->nitems = 0;
        chunk->maxitems = FIRSTCHUNKSIZE;
        chunk->next = *listHdr;
@@ -239,8 +239,8 @@ AddInvalidationMessage(InvalidationChunk **listHdr,
 
        chunk = (InvalidationChunk *)
            MemoryContextAlloc(CurTransactionContext,
-                              sizeof(InvalidationChunk) +
-                        (chunksize - 1) *sizeof(SharedInvalidationMessage));
+                              offsetof(InvalidationChunk, msgs) +
+                        chunksize * sizeof(SharedInvalidationMessage));
        chunk->nitems = 0;
        chunk->maxitems = chunksize;
        chunk->next = *listHdr;
index 82b66683d167432cdfa25bfb7d35e94d330a4516..04927184379d4f1f9d61d55de35ac9b61163f6c9 100644 (file)
@@ -93,7 +93,7 @@ typedef struct TypeCacheEnumData
    Oid         bitmap_base;    /* OID corresponding to bit 0 of bitmapset */
    Bitmapset  *sorted_values;  /* Set of OIDs known to be in order */
    int         num_values;     /* total number of values in enum */
-   EnumItem    enum_values[1]; /* VARIABLE LENGTH ARRAY */
+   EnumItem    enum_values[FLEXIBLE_ARRAY_MEMBER];
 } TypeCacheEnumData;
 
 /*