PostgreSQL Source Code  git master
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()
 
#define pg_spin_delay()   pg_spin_delay_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_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 124 of file atomics.h.

◆ pg_memory_barrier

#define pg_memory_barrier ( )    pg_memory_barrier_impl()

Definition at line 136 of file atomics.h.

◆ pg_read_barrier

#define pg_read_barrier ( )    pg_read_barrier_impl()

Definition at line 149 of file atomics.h.

◆ pg_spin_delay

#define pg_spin_delay ( )    pg_spin_delay_impl()

Definition at line 155 of file atomics.h.

◆ pg_write_barrier

#define pg_write_barrier ( )    pg_write_barrier_impl()

Definition at line 150 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

Definition at line 417 of file atomics.h.

418 {
419  AssertPointerAlignment(ptr, 4);
420  return pg_atomic_add_fetch_u32_impl(ptr, add_);
421 }
#define AssertPointerAlignment(ptr, bndr)
Definition: c.h:894

References AssertPointerAlignment.

Referenced by apply_handle_stream_abort(), apply_handle_stream_start(), compute_parallel_delay(), parallel_vacuum_process_safe_indexes(), parallel_vacuum_process_unsafe_indexes(), tbm_prepare_shared_iterate(), and test_atomic_uint32().

◆ pg_atomic_add_fetch_u64()

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

Definition at line 552 of file atomics.h.

553 {
554 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
555  AssertPointerAlignment(ptr, 8);
556 #endif
557  return pg_atomic_add_fetch_u64_impl(ptr, add_);
558 }

References AssertPointerAlignment.

Referenced by EmitProcSignalBarrier(), 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 }
void pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr)
Definition: atomics.c:89

References pg_atomic_clear_flag_impl().

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 342 of file atomics.h.

344 {
345  AssertPointerAlignment(ptr, 4);
346  AssertPointerAlignment(expected, 4);
347 
348  return pg_atomic_compare_exchange_u32_impl(ptr, expected, newval);
349 }
bool pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 *expected, uint32 newval)
Definition: atomics.c:137
#define newval

References AssertPointerAlignment, newval, and pg_atomic_compare_exchange_u32_impl().

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

◆ 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 505 of file atomics.h.

507 {
508 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
509  AssertPointerAlignment(ptr, 8);
510 #endif
511  return pg_atomic_compare_exchange_u64_impl(ptr, expected, newval);
512 }
bool pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval)
Definition: atomics.c:200

References AssertPointerAlignment, newval, and pg_atomic_compare_exchange_u64_impl().

Referenced by pg_atomic_monotonic_advance_u64(), and test_atomic_uint64().

◆ pg_atomic_exchange_u32()

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

Definition at line 323 of file atomics.h.

324 {
325  AssertPointerAlignment(ptr, 4);
326 
327  return pg_atomic_exchange_u32_impl(ptr, newval);
328 }

References AssertPointerAlignment, and newval.

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 496 of file atomics.h.

497 {
498 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
499  AssertPointerAlignment(ptr, 8);
500 #endif
501  return pg_atomic_exchange_u64_impl(ptr, newval);
502 }

References AssertPointerAlignment, and newval.

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

◆ pg_atomic_fetch_add_u32()

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

◆ pg_atomic_fetch_add_u64()

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

Definition at line 515 of file atomics.h.

516 {
517 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
518  AssertPointerAlignment(ptr, 8);
519 #endif
520  return pg_atomic_fetch_add_u64_impl(ptr, add_);
521 }
uint64 pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
Definition: atomics.c:228

References AssertPointerAlignment, and pg_atomic_fetch_add_u64_impl().

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

◆ pg_atomic_fetch_and_u32()

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

Definition at line 389 of file atomics.h.

390 {
391  AssertPointerAlignment(ptr, 4);
392  return pg_atomic_fetch_and_u32_impl(ptr, and_);
393 }

References AssertPointerAlignment.

Referenced by LWLockDequeueSelf(), LWLockWaitListUnlock(), and test_atomic_uint32().

◆ pg_atomic_fetch_and_u64()

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

Definition at line 534 of file atomics.h.

535 {
536 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
537  AssertPointerAlignment(ptr, 8);
538 #endif
539  return pg_atomic_fetch_and_u64_impl(ptr, and_);
540 }

References AssertPointerAlignment.

Referenced by test_atomic_uint64().

◆ pg_atomic_fetch_or_u32()

static uint32 pg_atomic_fetch_or_u32 ( volatile pg_atomic_uint32 ptr,
uint32  or_ 
)
inlinestatic

Definition at line 403 of file atomics.h.

404 {
405  AssertPointerAlignment(ptr, 4);
406  return pg_atomic_fetch_or_u32_impl(ptr, or_);
407 }

References AssertPointerAlignment.

Referenced by EmitProcSignalBarrier(), LockBufHdr(), LWLockAcquire(), LWLockDequeueSelf(), LWLockQueueSelf(), LWLockWaitForVar(), LWLockWaitListLock(), ResetProcSignalBarrierBits(), and test_atomic_uint32().

◆ pg_atomic_fetch_or_u64()

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

Definition at line 543 of file atomics.h.

544 {
545 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
546  AssertPointerAlignment(ptr, 8);
547 #endif
548  return pg_atomic_fetch_or_u64_impl(ptr, or_);
549 }

References AssertPointerAlignment.

Referenced by 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 374 of file atomics.h.

375 {
376  AssertPointerAlignment(ptr, 4);
377  Assert(sub_ != INT_MIN);
378  return pg_atomic_fetch_sub_u32_impl(ptr, sub_);
379 }
#define Assert(condition)
Definition: c.h:858

References Assert, and AssertPointerAlignment.

Referenced by LWLockAcquire(), LWLockAcquireOrWait(), LWLockDequeueSelf(), LWLockWaitForVar(), pgstat_release_entry_ref(), test_atomic_spin_nest(), 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 524 of file atomics.h.

525 {
526 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
527  AssertPointerAlignment(ptr, 8);
528 #endif
529  Assert(sub_ != PG_INT64_MIN);
530  return pg_atomic_fetch_sub_u64_impl(ptr, sub_);
531 }
#define PG_INT64_MIN
Definition: c.h:591

References Assert, AssertPointerAlignment, and PG_INT64_MIN.

Referenced by test_atomic_spin_nest(), and test_atomic_uint64().

◆ 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 }
void pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr)
Definition: atomics.c:55

References pg_atomic_init_flag_impl().

Referenced by AutoVacuumShmemInit(), 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 446 of file atomics.h.

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

References AssertPointerAlignment, pg_atomic_init_u64_impl(), and val.

Referenced by InitProcGlobal(), InjectionPointShmemInit(), MarkAsPreparingGuts(), ProcSignalShmemInit(), shm_mq_create(), SimpleLruInit(), StatsShmemInit(), table_block_parallelscan_initialize(), test_atomic_spin_nest(), test_atomic_uint64(), 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 578 of file atomics.h.

579 {
580  uint64 currval;
581 
582 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
583  AssertPointerAlignment(ptr, 8);
584 #endif
585 
586  currval = pg_atomic_read_u64_impl(ptr);
587  if (currval >= target)
588  {
590  return currval;
591  }
592 
593  while (currval < target)
594  {
595  if (pg_atomic_compare_exchange_u64(ptr, &currval, target))
596  return target;
597  }
598 
599  return currval;
600 }
#define pg_memory_barrier()
Definition: atomics.h:136
static bool pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval)
Definition: atomics.h:505
static uint64 pg_atomic_read_u64_impl(volatile pg_atomic_uint64 *ptr)
Definition: generic.h:329

References AssertPointerAlignment, 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 {
253  AssertPointerAlignment(ptr, 4);
254 
255  return pg_atomic_read_membarrier_u32_impl(ptr);
256 }

References AssertPointerAlignment.

◆ pg_atomic_read_membarrier_u64()

static uint64 pg_atomic_read_membarrier_u64 ( volatile pg_atomic_uint64 ptr)
inlinestatic

Definition at line 469 of file atomics.h.

470 {
471 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
472  AssertPointerAlignment(ptr, 8);
473 #endif
474  return pg_atomic_read_membarrier_u64_impl(ptr);
475 }

References AssertPointerAlignment.

Referenced by CreateCheckPoint(), and WaitXLogInsertionsToFinish().

◆ pg_atomic_read_u32()

static uint32 pg_atomic_read_u32 ( volatile pg_atomic_uint32 ptr)
inlinestatic

Definition at line 232 of file atomics.h.

233 {
234  AssertPointerAlignment(ptr, 4);
235  return pg_atomic_read_u32_impl(ptr);
236 }
static uint32 pg_atomic_read_u32_impl(volatile pg_atomic_uint32 *ptr)
Definition: generic.h:46

References AssertPointerAlignment, and pg_atomic_read_u32_impl().

Referenced by autovac_recalculate_workers_for_balance(), AutoVacuumUpdateCostLimit(), BufferIsDirty(), BufferIsPermanent(), BufferSync(), compute_parallel_delay(), DebugPrintBufferRefcount(), DropRelationAllLocalBuffers(), DropRelationLocalBuffers(), ExtendBufferedRelLocal(), FlushRelationBuffers(), GetLocalVictimBuffer(), GetVictimBuffer(), InitProcess(), InjectionPointAttach(), InjectionPointDetach(), InvalidateBuffer(), InvalidateVictimBuffer(), LocalBufferAlloc(), LWLockAttemptLock(), LWLockConflictsWithVar(), LWLockDequeueSelf(), LWLockUpdateVar(), LWLockWaitListLock(), LWLockWakeup(), MarkBufferDirty(), MarkBufferDirtyHint(), MarkLocalBufferDirty(), pa_decr_and_wait_stream_block(), parallel_vacuum_process_all_indexes(), pg_buffercache_summary(), pgstat_acquire_entry_ref(), pgstat_build_snapshot(), pgstat_drop_entry_internal(), pgstat_get_entry_ref_cached(), pgstat_release_entry_ref(), pgstat_write_statsfile(), PinBuffer(), PinBuffer_Locked(), PinLocalBuffer(), ProcArrayGroupClearXid(), ReadRecentBuffer(), StrategySyncStart(), test_atomic_spin_nest(), test_atomic_uint32(), TransactionGroupUpdateXidStatus(), UnpinBufferNoOwner(), WaitBufHdrUnlocked(), WaitReadBuffers(), WaitReadBuffersCanStartIO(), and ZeroAndLockBuffer().

◆ pg_atomic_read_u64()

◆ pg_atomic_sub_fetch_u32()

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

Definition at line 432 of file atomics.h.

433 {
434  AssertPointerAlignment(ptr, 4);
435  Assert(sub_ != INT_MIN);
436  return pg_atomic_sub_fetch_u32_impl(ptr, sub_);
437 }

References Assert, and AssertPointerAlignment.

Referenced by compute_parallel_delay(), LWLockRelease(), pa_decr_and_wait_stream_block(), parallel_vacuum_process_safe_indexes(), parallel_vacuum_process_unsafe_indexes(), pgstat_drop_entry_internal(), tbm_free_shared_area(), and test_atomic_uint32().

◆ pg_atomic_sub_fetch_u64()

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

Definition at line 561 of file atomics.h.

562 {
563 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
564  AssertPointerAlignment(ptr, 8);
565 #endif
566  Assert(sub_ != PG_INT64_MIN);
567  return pg_atomic_sub_fetch_u64_impl(ptr, sub_);
568 }

References Assert, AssertPointerAlignment, and PG_INT64_MIN.

Referenced by test_atomic_uint64().

◆ 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 {
178  return pg_atomic_test_set_flag_impl(ptr);
179 }
bool pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)
Definition: atomics.c:76

References pg_atomic_test_set_flag_impl().

Referenced by do_autovacuum(), and test_atomic_flag().

◆ pg_atomic_unlocked_test_flag()

static bool pg_atomic_unlocked_test_flag ( volatile pg_atomic_flag ptr)
inlinestatic

Definition at line 189 of file atomics.h.

190 {
192 }
bool pg_atomic_unlocked_test_flag_impl(volatile pg_atomic_flag *ptr)
Definition: atomics.c:97

References pg_atomic_unlocked_test_flag_impl().

Referenced by autovac_recalculate_workers_for_balance(), AutoVacuumUpdateCostLimit(), test_atomic_flag(), and VacuumUpdateCosts().

◆ pg_atomic_unlocked_write_u32()

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

◆ pg_atomic_write_membarrier_u32()

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

Definition at line 308 of file atomics.h.

309 {
310  AssertPointerAlignment(ptr, 4);
311 
312  pg_atomic_write_membarrier_u32_impl(ptr, val);
313 }

References AssertPointerAlignment, and val.

Referenced by PgArchForceDirScan().

◆ pg_atomic_write_membarrier_u64()

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

Definition at line 487 of file atomics.h.

488 {
489 #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
490  AssertPointerAlignment(ptr, 8);
491 #endif
492  pg_atomic_write_membarrier_u64_impl(ptr, val);
493 }

References AssertPointerAlignment, and val.

Referenced by StartupXLOG().

◆ pg_atomic_write_u32()

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

◆ pg_atomic_write_u64()