diff options
Diffstat (limited to 'src/backend/postmaster/checkpointer.c')
-rw-r--r-- | src/backend/postmaster/checkpointer.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index aa3df373247..6aeade92e6a 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -1346,3 +1346,28 @@ UpdateSharedMemoryConfig(void) elog(DEBUG2, "checkpointer updated shared memory configuration values"); } + +/* + * FirstCallSinceLastCheckpoint allows a process to take an action once + * per checkpoint cycle by asynchronously checking for checkpoint completion. + */ +bool +FirstCallSinceLastCheckpoint(void) +{ + /* use volatile pointer to prevent code rearrangement */ + volatile CheckpointerShmemStruct *cps = CheckpointerShmem; + static int ckpt_done = 0; + int new_done; + bool FirstCall = false; + + SpinLockAcquire(&cps->ckpt_lck); + new_done = cps->ckpt_done; + SpinLockRelease(&cps->ckpt_lck); + + if (new_done != ckpt_done) + FirstCall = true; + + ckpt_done = new_done; + + return FirstCall; +} |