PostgreSQL Source Code git master
Loading...
Searching...
No Matches
atomics.h File Reference
#include <limits.h>
#include "port/atomics/fallback.h"
#include "port/atomics/generic.h"
Include dependency graph for atomics.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define INSIDE_ATOMICS_H
 
#define pg_compiler_barrier()   pg_compiler_barrier_impl()
 
#define pg_memory_barrier()   pg_memory_barrier_impl()
 
#define pg_read_barrier()   pg_read_barrier_impl()
 
#define pg_write_barrier()   pg_write_barrier_impl()
 

Functions

static void pg_atomic_init_flag (volatile pg_atomic_flag *ptr)
 
static bool pg_atomic_test_set_flag (volatile pg_atomic_flag *ptr)
 
static bool pg_atomic_unlocked_test_flag (volatile pg_atomic_flag *ptr)
 
static void pg_atomic_clear_flag (volatile pg_atomic_flag *ptr)
 
static void pg_atomic_init_u32 (volatile pg_atomic_uint32 *ptr, uint32 val)
 
static uint32 pg_atomic_read_u32 (volatile pg_atomic_uint32 *ptr)
 
static uint32 pg_atomic_read_membarrier_u32 (volatile pg_atomic_uint32 *ptr)
 
static void pg_atomic_write_u32 (volatile pg_atomic_uint32 *ptr, uint32 val)
 
static void pg_atomic_unlocked_write_u32 (volatile pg_atomic_uint32 *ptr, uint32 val)
 
static void pg_atomic_write_membarrier_u32 (volatile pg_atomic_uint32 *ptr, uint32 val)
 
static uint32 pg_atomic_exchange_u32 (volatile pg_atomic_uint32 *ptr, uint32 newval)
 
static bool pg_atomic_compare_exchange_u32 (volatile pg_atomic_uint32 *ptr, uint32 *expected, uint32 newval)
 
static uint32 pg_atomic_fetch_add_u32 (volatile pg_atomic_uint32 *ptr, int32 add_)
 
static uint32 pg_atomic_fetch_sub_u32 (volatile pg_atomic_uint32 *ptr, int32 sub_)
 
static uint32 pg_atomic_fetch_and_u32 (volatile pg_atomic_uint32 *ptr, uint32 and_)
 
static uint32 pg_atomic_fetch_or_u32 (volatile pg_atomic_uint32 *ptr, uint32 or_)
 
static uint32 pg_atomic_add_fetch_u32 (volatile pg_atomic_uint32 *ptr, int32 add_)
 
static uint32 pg_atomic_sub_fetch_u32 (volatile pg_atomic_uint32 *ptr, int32 sub_)
 
static void pg_atomic_init_u64 (volatile pg_atomic_uint64 *ptr, uint64 val)
 
static uint64 pg_atomic_read_u64 (volatile pg_atomic_uint64 *ptr)
 
static uint64 pg_atomic_read_membarrier_u64 (volatile pg_atomic_uint64 *ptr)
 
static void pg_atomic_write_u64 (volatile pg_atomic_uint64 *ptr, uint64 val)
 
static void pg_atomic_unlocked_write_u64 (volatile pg_atomic_uint64 *ptr, uint64 val)
 
static void pg_atomic_write_membarrier_u64 (volatile pg_atomic_uint64 *ptr, uint64 val)
 
static uint64 pg_atomic_exchange_u64 (volatile pg_atomic_uint64 *ptr, uint64 newval)
 
static bool pg_atomic_compare_exchange_u64 (volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval)
 
static uint64 pg_atomic_fetch_add_u64 (volatile pg_atomic_uint64 *ptr, int64 add_)
 
static uint64 pg_atomic_fetch_sub_u64 (volatile pg_atomic_uint64 *ptr, int64 sub_)
 
static uint64 pg_atomic_fetch_and_u64 (volatile pg_atomic_uint64 *ptr, uint64 and_)
 
static uint64 pg_atomic_fetch_or_u64 (volatile pg_atomic_uint64 *ptr, uint64 or_)
 
static uint64 pg_atomic_add_fetch_u64 (volatile pg_atomic_uint64 *ptr, int64 add_)
 
static uint64 pg_atomic_sub_fetch_u64 (volatile pg_atomic_uint64 *ptr, int64 sub_)
 
static uint64 pg_atomic_monotonic_advance_u64 (volatile pg_atomic_uint64 *ptr, uint64 target)
 

Macro Definition Documentation

◆ INSIDE_ATOMICS_H

#define INSIDE_ATOMICS_H

Definition at line 45 of file atomics.h.

◆ pg_compiler_barrier

#define pg_compiler_barrier ( )    pg_compiler_barrier_impl()

Definition at line 129 of file atomics.h.

◆ pg_memory_barrier

#define pg_memory_barrier ( )    pg_memory_barrier_impl()

Definition at line 141 of file atomics.h.

◆ pg_read_barrier

#define pg_read_barrier ( )    pg_read_barrier_impl()

Definition at line 154 of file atomics.h.

◆ pg_write_barrier

#define pg_write_barrier ( )    pg_write_barrier_impl()

Definition at line 155 of file atomics.h.

Function Documentation

◆ pg_atomic_add_fetch_u32()

static uint32 pg_atomic_add_fetch_u32 ( volatile pg_atomic_uint32 ptr,
int32  add_ 
)
inlinestatic

◆ pg_atomic_add_fetch_u64()

static uint64 pg_atomic_add_fetch_u64 ( volatile pg_atomic_uint64 ptr,
int64  add_ 
)
inlinestatic

Definition at line 564 of file atomics.h.

565{
566#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
568#endif
570}

References AssertPointerAlignment, and fb().

Referenced by EmitProcSignalBarrier(), pgsa_clear_advice_string(), pgsa_create_stash(), pgsa_drop_stash(), pgsa_set_advice_string(), and test_atomic_uint64().

◆ pg_atomic_clear_flag()

static void pg_atomic_clear_flag ( volatile pg_atomic_flag ptr)
inlinestatic

Definition at line 200 of file atomics.h.

201{
203}

References fb().

Referenced by do_autovacuum(), FreeWorkerInfo(), and test_atomic_flag().

◆ pg_atomic_compare_exchange_u32()

static bool pg_atomic_compare_exchange_u32 ( volatile pg_atomic_uint32 ptr,
uint32 expected,
uint32  newval 
)
inlinestatic

Definition at line 344 of file atomics.h.

346{
349
351}
static bool pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 *expected, uint32 newval)
Definition arch-ppc.h:80
#define newval

References AssertPointerAlignment, fb(), newval, and pg_atomic_compare_exchange_u32_impl().

Referenced by ClockSweepTick(), LWLockAttemptLock(), LWLockWakeup(), ProcArrayGroupClearXid(), test_atomic_uint32(), and TransactionGroupUpdateXidStatus().

◆ pg_atomic_compare_exchange_u64()

static bool pg_atomic_compare_exchange_u64 ( volatile pg_atomic_uint64 ptr,
uint64 expected,
uint64  newval 
)
inlinestatic

Definition at line 517 of file atomics.h.

519{
520#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
522#endif
524}
bool pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval)
Definition atomics.c:34

References AssertPointerAlignment, fb(), newval, and pg_atomic_compare_exchange_u64_impl().

Referenced by BufferLockAttempt(), BufferLockWakeup(), GetBufferFromRing(), MarkBufferDirty(), pg_atomic_monotonic_advance_u64(), PinBuffer(), SharedBufferBeginSetHintBits(), StrategyGetBuffer(), test_atomic_uint64(), and UnlockBufHdrExt().

◆ pg_atomic_exchange_u32()

static uint32 pg_atomic_exchange_u32 ( volatile pg_atomic_uint32 ptr,
uint32  newval 
)
inlinestatic

Definition at line 325 of file atomics.h.

326{
328
330}
static uint32 pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)

References AssertPointerAlignment, newval, and pg_atomic_exchange_u32_impl().

Referenced by pgarch_readyXlog(), ProcArrayGroupClearXid(), ProcessProcSignalBarrier(), StrategySyncStart(), test_atomic_uint32(), and TransactionGroupUpdateXidStatus().

◆ pg_atomic_exchange_u64()

static uint64 pg_atomic_exchange_u64 ( volatile pg_atomic_uint64 ptr,
uint64  newval 
)
inlinestatic

Definition at line 508 of file atomics.h.

509{
510#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
512#endif
514}

References AssertPointerAlignment, fb(), and newval.

Referenced by LWLockReleaseClearVar(), LWLockUpdateVar(), and test_atomic_uint64().

◆ pg_atomic_fetch_add_u32()

◆ pg_atomic_fetch_add_u64()

static uint64 pg_atomic_fetch_add_u64 ( volatile pg_atomic_uint64 ptr,
int64  add_ 
)
inlinestatic

Definition at line 527 of file atomics.h.

528{
529#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
531#endif
533}
uint64 pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
Definition atomics.c:62

References AssertPointerAlignment, fb(), and pg_atomic_fetch_add_u64_impl().

Referenced by GetFakeLSNForUnloggedRel(), pgstat_init_entry(), pgstat_request_entry_refs_gc(), table_block_parallelscan_nextpage(), and test_atomic_uint64().

◆ pg_atomic_fetch_and_u32()

static uint32 pg_atomic_fetch_and_u32 ( volatile pg_atomic_uint32 ptr,
uint32  and_ 
)
inlinestatic

◆ pg_atomic_fetch_and_u64()

static uint64 pg_atomic_fetch_and_u64 ( volatile pg_atomic_uint64 ptr,
uint64  and_ 
)
inlinestatic

Definition at line 546 of file atomics.h.

547{
548#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
550#endif
552}

References AssertPointerAlignment, and fb().

Referenced by BufferLockAcquire(), BufferLockDequeueSelf(), ExtendBufferedRelShared(), and test_atomic_uint64().

◆ pg_atomic_fetch_or_u32()

◆ pg_atomic_fetch_or_u64()

static uint64 pg_atomic_fetch_or_u64 ( volatile pg_atomic_uint64 ptr,
uint64  or_ 
)
inlinestatic

Definition at line 555 of file atomics.h.

556{
557#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
559#endif
560 return pg_atomic_fetch_or_u64_impl(ptr, or_);
561}

References AssertPointerAlignment, and fb().

Referenced by BufferLockQueueSelf(), LockBufferForCleanup(), LockBufHdr(), and test_atomic_uint64().

◆ pg_atomic_fetch_sub_u32()

static uint32 pg_atomic_fetch_sub_u32 ( volatile pg_atomic_uint32 ptr,
int32  sub_ 
)
inlinestatic

Definition at line 376 of file atomics.h.

377{
379 Assert(sub_ != INT_MIN);
381}
#define Assert(condition)
Definition c.h:1002

References Assert, AssertPointerAlignment, and fb().

Referenced by LWLockAcquire(), LWLockAcquireOrWait(), LWLockDequeueSelf(), LWLockWaitForVar(), pgstat_release_entry_ref(), and test_atomic_uint32().

◆ pg_atomic_fetch_sub_u64()

static uint64 pg_atomic_fetch_sub_u64 ( volatile pg_atomic_uint64 ptr,
int64  sub_ 
)
inlinestatic

Definition at line 536 of file atomics.h.

537{
538#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
540#endif
543}
#define PG_INT64_MIN
Definition c.h:734

References Assert, AssertPointerAlignment, fb(), and PG_INT64_MIN.

Referenced by test_atomic_uint64(), UnlockBufHdr(), and UnpinBufferNoOwner().

◆ pg_atomic_init_flag()

static void pg_atomic_init_flag ( volatile pg_atomic_flag ptr)
inlinestatic

Definition at line 163 of file atomics.h.

164{
166}

References fb().

Referenced by AutoVacuumShmemInit(), pgsa_init_shared_state(), and test_atomic_flag().

◆ pg_atomic_init_u32()

◆ pg_atomic_init_u64()

static void pg_atomic_init_u64 ( volatile pg_atomic_uint64 ptr,
uint64  val 
)
inlinestatic

Definition at line 448 of file atomics.h.

449{
450 /*
451 * Can't necessarily enforce alignment - and don't need it - when using
452 * the spinlock based fallback implementation. Therefore only assert when
453 * not using it.
454 */
455#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
457#endif
459}
void pg_atomic_init_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val_)
Definition atomics.c:24

References AssertPointerAlignment, pg_atomic_init_u64_impl(), and val.

Referenced by BufferManagerShmemInit(), MarkAsPreparingGuts(), pgsa_init_shared_state(), ProcGlobalShmemInit(), ProcSignalShmemInit(), shm_mq_create(), shmem_slru_init(), StatsShmemInit(), table_block_parallelscan_initialize(), test_atomic_uint64(), WaitLSNShmemInit(), WalRcvShmemInit(), XLogPrefetchShmemInit(), and XLOGShmemInit().

◆ pg_atomic_monotonic_advance_u64()

static uint64 pg_atomic_monotonic_advance_u64 ( volatile pg_atomic_uint64 ptr,
uint64  target 
)
inlinestatic

Definition at line 590 of file atomics.h.

591{
593
594#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
596#endif
597
599 if (currval >= target)
600 {
602 return currval;
603 }
604
605 while (currval < target)
606 {
607 if (pg_atomic_compare_exchange_u64(ptr, &currval, target))
608 return target;
609 }
610
611 return currval;
612}
#define pg_memory_barrier()
Definition atomics.h:141
static bool pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval)
Definition atomics.h:517
uint64_t uint64
Definition c.h:684
static uint64 pg_atomic_read_u64_impl(volatile pg_atomic_uint64 *ptr)
Definition generic.h:322

References AssertPointerAlignment, fb(), pg_atomic_compare_exchange_u64(), pg_atomic_read_u64_impl(), and pg_memory_barrier.

Referenced by WaitXLogInsertionsToFinish().

◆ pg_atomic_read_membarrier_u32()

static uint32 pg_atomic_read_membarrier_u32 ( volatile pg_atomic_uint32 ptr)
inlinestatic

Definition at line 251 of file atomics.h.

252{
254
256}

References AssertPointerAlignment, and fb().

Referenced by ProcessRecoveryConflictInterrupts().

◆ pg_atomic_read_membarrier_u64()

static uint64 pg_atomic_read_membarrier_u64 ( volatile pg_atomic_uint64 ptr)
inlinestatic

Definition at line 471 of file atomics.h.

472{
473#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
475#endif
477}

References AssertPointerAlignment, and fb().

Referenced by CreateCheckPoint(), GetWalRcvWriteRecPtr(), WaitLSNWakeup(), and WaitXLogInsertionsToFinish().

◆ pg_atomic_read_u32()

◆ pg_atomic_read_u64()

static uint64 pg_atomic_read_u64 ( volatile pg_atomic_uint64 ptr)
inlinestatic

Definition at line 462 of file atomics.h.

463{
464#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
466#endif
467 return pg_atomic_read_u64_impl(ptr);
468}

References AssertPointerAlignment, and pg_atomic_read_u64_impl().

Referenced by AdvanceXLInsertBuffer(), buffer_readv_complete_one(), buffer_stage_common(), BufferIsDirty(), BufferIsPermanent(), BufferLockAttempt(), BufferLockDequeueSelf(), BufferLockWakeup(), BufferSync(), CheckReadBuffersOperation(), create_toy_buffer(), DebugPrintBufferRefcount(), DropRelationAllLocalBuffers(), DropRelationLocalBuffers(), EvictAllUnpinnedBuffers(), EvictRelUnpinnedBuffers(), EvictUnpinnedBufferInternal(), ExtendBufferedRelLocal(), FlushBuffer(), FlushRelationBuffers(), GetBufferFromRing(), GetLocalVictimBuffer(), GetLockStatusData(), GetVictimBuffer(), GetXLogBuffer(), InjectionPointAttach(), InjectionPointDetach(), InjectionPointList(), invalidate_one_block(), InvalidateLocalBuffer(), InvalidateVictimBuffer(), LocalBufferAlloc(), LockBufferForCleanup(), LockBufHdr(), LWLockConflictsWithVar(), MarkBufferDirty(), MarkBufferDirtyHint(), MarkDirtyAllUnpinnedBuffers(), MarkDirtyRelUnpinnedBuffers(), MarkDirtyUnpinnedBufferInternal(), MarkLocalBufferDirty(), pg_buffercache_summary(), pg_buffercache_usage_counts(), pg_stash_advice_worker_main(), pg_stat_get_recovery_prefetch(), pg_stat_get_wal_receiver(), pgstat_gc_entry_refs(), pgstat_get_entry_count(), pgstat_need_entry_refs_gc(), pgstat_setup_shared_refs(), PinBuffer(), PinBuffer_Locked(), PinLocalBuffer(), ProcessProcSignalBarrier(), ProcSignalInit(), ReadRecentBuffer(), ResolveRecoveryConflictWithLock(), SharedBufferBeginSetHintBits(), shm_mq_inc_bytes_read(), shm_mq_inc_bytes_written(), shm_mq_receive_bytes(), shm_mq_send_bytes(), SimpleLruTruncate(), SlruSelectLRUPage(), StartLocalBufferIO(), StartReadBuffersImpl(), StrategyGetBuffer(), TerminateLocalBufferIO(), test_atomic_uint64(), UnlockBufHdr(), UnpinLocalBufferNoOwner(), WaitBufHdrUnlocked(), WaitForProcSignalBarrier(), WaitReadBuffers(), WALReadFromBuffers(), XLogPrefetchIncrement(), and XLogWrite().

◆ pg_atomic_sub_fetch_u32()

◆ pg_atomic_sub_fetch_u64()

static uint64 pg_atomic_sub_fetch_u64 ( volatile pg_atomic_uint64 ptr,
int64  sub_ 
)
inlinestatic

Definition at line 573 of file atomics.h.

574{
575#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
577#endif
580}

References Assert, AssertPointerAlignment, fb(), and PG_INT64_MIN.

Referenced by BufferLockUnlock(), pgstat_free_entry(), test_atomic_uint64(), and UnlockReleaseBuffer().

◆ pg_atomic_test_set_flag()

static bool pg_atomic_test_set_flag ( volatile pg_atomic_flag ptr)
inlinestatic

Definition at line 176 of file atomics.h.

177{
179}

References fb().

Referenced by do_autovacuum(), pg_stash_advice_worker_main(), pgsa_init_shared_state(), and test_atomic_flag().

◆ pg_atomic_unlocked_test_flag()

◆ pg_atomic_unlocked_write_u32()

static void pg_atomic_unlocked_write_u32 ( volatile pg_atomic_uint32 ptr,
uint32  val 
)
inlinestatic

Definition at line 290 of file atomics.h.

291{
293
295}
static void pg_atomic_unlocked_write_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)
Definition generic.h:58

References AssertPointerAlignment, pg_atomic_unlocked_write_u32_impl(), and val.

◆ pg_atomic_unlocked_write_u64()

static void pg_atomic_unlocked_write_u64 ( volatile pg_atomic_uint64 ptr,
uint64  val 
)
inlinestatic

Definition at line 489 of file atomics.h.

490{
491#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
493#endif
494
496}
static void pg_atomic_unlocked_write_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)
Definition generic.h:297

References AssertPointerAlignment, pg_atomic_unlocked_write_u64_impl(), and val.

Referenced by buffer_stage_common(), create_toy_buffer(), ExtendBufferedRelLocal(), GetLocalVictimBuffer(), InvalidateLocalBuffer(), LocalBufferAlloc(), MarkLocalBufferDirty(), PinLocalBuffer(), TerminateLocalBufferIO(), and UnpinLocalBufferNoOwner().

◆ pg_atomic_write_membarrier_u32()

static void pg_atomic_write_membarrier_u32 ( volatile pg_atomic_uint32 ptr,
uint32  val 
)
inlinestatic

Definition at line 310 of file atomics.h.

311{
313
315}

References AssertPointerAlignment, fb(), and val.

Referenced by PgArchForceDirScan(), and ProcSignalInit().

◆ pg_atomic_write_membarrier_u64()

static void pg_atomic_write_membarrier_u64 ( volatile pg_atomic_uint64 ptr,
uint64  val 
)
inlinestatic

Definition at line 499 of file atomics.h.

500{
501#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
503#endif
505}

References AssertPointerAlignment, fb(), and val.

Referenced by RequestXLogStreaming(), StartupXLOG(), updateMinWaitedLSN(), and XLogWalRcvWrite().

◆ pg_atomic_write_u32()

◆ pg_atomic_write_u64()