.shared_data_off = offsetof(PgStatShared_Archiver, stats),
.shared_data_len = sizeof(((PgStatShared_Archiver *) 0)->stats),
+ .init_shmem_cb = pgstat_archiver_init_shmem_cb,
.reset_all_cb = pgstat_archiver_reset_all_cb,
.snapshot_cb = pgstat_archiver_snapshot_cb,
},
.shared_data_off = offsetof(PgStatShared_BgWriter, stats),
.shared_data_len = sizeof(((PgStatShared_BgWriter *) 0)->stats),
+ .init_shmem_cb = pgstat_bgwriter_init_shmem_cb,
.reset_all_cb = pgstat_bgwriter_reset_all_cb,
.snapshot_cb = pgstat_bgwriter_snapshot_cb,
},
.shared_data_off = offsetof(PgStatShared_Checkpointer, stats),
.shared_data_len = sizeof(((PgStatShared_Checkpointer *) 0)->stats),
+ .init_shmem_cb = pgstat_checkpointer_init_shmem_cb,
.reset_all_cb = pgstat_checkpointer_reset_all_cb,
.snapshot_cb = pgstat_checkpointer_snapshot_cb,
},
.shared_data_off = offsetof(PgStatShared_IO, stats),
.shared_data_len = sizeof(((PgStatShared_IO *) 0)->stats),
+ .init_shmem_cb = pgstat_io_init_shmem_cb,
.reset_all_cb = pgstat_io_reset_all_cb,
.snapshot_cb = pgstat_io_snapshot_cb,
},
.shared_data_off = offsetof(PgStatShared_SLRU, stats),
.shared_data_len = sizeof(((PgStatShared_SLRU *) 0)->stats),
+ .init_shmem_cb = pgstat_slru_init_shmem_cb,
.reset_all_cb = pgstat_slru_reset_all_cb,
.snapshot_cb = pgstat_slru_snapshot_cb,
},
.shared_data_off = offsetof(PgStatShared_Wal, stats),
.shared_data_len = sizeof(((PgStatShared_Wal *) 0)->stats),
+ .init_shmem_cb = pgstat_wal_init_shmem_cb,
.reset_all_cb = pgstat_wal_reset_all_cb,
.snapshot_cb = pgstat_wal_snapshot_cb,
},
return &pgStatLocal.snapshot.archiver;
}
+void
+pgstat_archiver_init_shmem_cb(void *stats)
+{
+ PgStatShared_Archiver *stats_shmem = (PgStatShared_Archiver *) stats;
+
+ LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
+}
+
void
pgstat_archiver_reset_all_cb(TimestampTz ts)
{
return &pgStatLocal.snapshot.bgwriter;
}
+void
+pgstat_bgwriter_init_shmem_cb(void *stats)
+{
+ PgStatShared_BgWriter *stats_shmem = (PgStatShared_BgWriter *) stats;
+
+ LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
+}
+
void
pgstat_bgwriter_reset_all_cb(TimestampTz ts)
{
return &pgStatLocal.snapshot.checkpointer;
}
+void
+pgstat_checkpointer_init_shmem_cb(void *stats)
+{
+ PgStatShared_Checkpointer *stats_shmem = (PgStatShared_Checkpointer *) stats;
+
+ LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
+}
+
void
pgstat_checkpointer_reset_all_cb(TimestampTz ts)
{
pg_unreachable();
}
+void
+pgstat_io_init_shmem_cb(void *stats)
+{
+ PgStatShared_IO *stat_shmem = (PgStatShared_IO *) stats;
+
+ for (int i = 0; i < BACKEND_NUM_TYPES; i++)
+ LWLockInitialize(&stat_shmem->locks[i], LWTRANCHE_PGSTATS_DATA);
+}
+
void
pgstat_io_reset_all_cb(TimestampTz ts)
{
pg_atomic_init_u64(&ctl->gc_request_count, 1);
-
/* initialize fixed-numbered stats */
- LWLockInitialize(&ctl->archiver.lock, LWTRANCHE_PGSTATS_DATA);
- LWLockInitialize(&ctl->bgwriter.lock, LWTRANCHE_PGSTATS_DATA);
- LWLockInitialize(&ctl->checkpointer.lock, LWTRANCHE_PGSTATS_DATA);
- LWLockInitialize(&ctl->slru.lock, LWTRANCHE_PGSTATS_DATA);
- LWLockInitialize(&ctl->wal.lock, LWTRANCHE_PGSTATS_DATA);
-
- for (int i = 0; i < BACKEND_NUM_TYPES; i++)
- LWLockInitialize(&ctl->io.locks[i],
- LWTRANCHE_PGSTATS_DATA);
+ for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++)
+ {
+ const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind);
+ char *ptr;
+
+ if (!kind_info->fixed_amount)
+ continue;
+
+ ptr = ((char *) ctl) + kind_info->shared_ctl_off;
+ kind_info->init_shmem_cb(ptr);
+ }
}
else
{
return false;
}
+void
+pgstat_slru_init_shmem_cb(void *stats)
+{
+ PgStatShared_SLRU *stats_shmem = (PgStatShared_SLRU *) stats;
+
+ LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
+}
+
void
pgstat_slru_reset_all_cb(TimestampTz ts)
{
PendingWalStats.wal_sync != 0;
}
+void
+pgstat_wal_init_shmem_cb(void *stats)
+{
+ PgStatShared_Wal *stats_shmem = (PgStatShared_Wal *) stats;
+
+ LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
+}
+
void
pgstat_wal_reset_all_cb(TimestampTz ts)
{
const PgStatShared_Common *header, NameData *name);
bool (*from_serialized_name) (const NameData *name, PgStat_HashKey *key);
+ /*
+ * For fixed-numbered statistics: Initialize shared memory state.
+ *
+ * "stats" is the pointer to the allocated shared memory area.
+ */
+ void (*init_shmem_cb) (void *stats);
+
/*
* For fixed-numbered statistics: Reset All.
*/
* Functions in pgstat_archiver.c
*/
+extern void pgstat_archiver_init_shmem_cb(void *stats);
extern void pgstat_archiver_reset_all_cb(TimestampTz ts);
extern void pgstat_archiver_snapshot_cb(void);
* Functions in pgstat_bgwriter.c
*/
+extern void pgstat_bgwriter_init_shmem_cb(void *stats);
extern void pgstat_bgwriter_reset_all_cb(TimestampTz ts);
extern void pgstat_bgwriter_snapshot_cb(void);
* Functions in pgstat_checkpointer.c
*/
+extern void pgstat_checkpointer_init_shmem_cb(void *stats);
extern void pgstat_checkpointer_reset_all_cb(TimestampTz ts);
extern void pgstat_checkpointer_snapshot_cb(void);
*/
extern bool pgstat_flush_io(bool nowait);
+extern void pgstat_io_init_shmem_cb(void *stats);
extern void pgstat_io_reset_all_cb(TimestampTz ts);
extern void pgstat_io_snapshot_cb(void);
*/
extern bool pgstat_slru_flush(bool nowait);
+extern void pgstat_slru_init_shmem_cb(void *stats);
extern void pgstat_slru_reset_all_cb(TimestampTz ts);
extern void pgstat_slru_snapshot_cb(void);
extern void pgstat_init_wal(void);
extern bool pgstat_have_pending_wal(void);
+extern void pgstat_wal_init_shmem_cb(void *stats);
extern void pgstat_wal_reset_all_cb(TimestampTz ts);
extern void pgstat_wal_snapshot_cb(void);