init
This commit is contained in:
106
db_include/port/atomics/generic-sunpro.h
Executable file
106
db_include/port/atomics/generic-sunpro.h
Executable file
@@ -0,0 +1,106 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* generic-sunpro.h
|
||||
* Atomic operations for solaris' CC
|
||||
*
|
||||
* Portions Copyright (c) 2013-2021, PostgreSQL Global Development Group
|
||||
*
|
||||
* NOTES:
|
||||
*
|
||||
* Documentation:
|
||||
* * manpage for atomic_cas(3C)
|
||||
* http://www.unix.com/man-page/opensolaris/3c/atomic_cas/
|
||||
* http://docs.oracle.com/cd/E23824_01/html/821-1465/atomic-cas-3c.html
|
||||
*
|
||||
* src/include/port/atomics/generic-sunpro.h
|
||||
*
|
||||
* -------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#if defined(HAVE_ATOMICS)
|
||||
|
||||
#ifdef HAVE_MBARRIER_H
|
||||
#include <mbarrier.h>
|
||||
|
||||
#define pg_compiler_barrier_impl() __compiler_barrier()
|
||||
|
||||
#ifndef pg_memory_barrier_impl
|
||||
/*
|
||||
* Despite the name this is actually a full barrier. Expanding to mfence/
|
||||
* membar #StoreStore | #LoadStore | #StoreLoad | #LoadLoad on x86/sparc
|
||||
* respectively.
|
||||
*/
|
||||
# define pg_memory_barrier_impl() __machine_rw_barrier()
|
||||
#endif
|
||||
#ifndef pg_read_barrier_impl
|
||||
# define pg_read_barrier_impl() __machine_r_barrier()
|
||||
#endif
|
||||
#ifndef pg_write_barrier_impl
|
||||
# define pg_write_barrier_impl() __machine_w_barrier()
|
||||
#endif
|
||||
|
||||
#endif /* HAVE_MBARRIER_H */
|
||||
|
||||
/* Older versions of the compiler don't have atomic.h... */
|
||||
#ifdef HAVE_ATOMIC_H
|
||||
|
||||
#include <atomic.h>
|
||||
|
||||
#define PG_HAVE_ATOMIC_U32_SUPPORT
|
||||
typedef struct pg_atomic_uint32
|
||||
{
|
||||
volatile uint32 value;
|
||||
} pg_atomic_uint32;
|
||||
|
||||
#define PG_HAVE_ATOMIC_U64_SUPPORT
|
||||
typedef struct pg_atomic_uint64
|
||||
{
|
||||
/*
|
||||
* Syntax to enforce variable alignment should be supported by versions
|
||||
* supporting atomic.h, but it's hard to find accurate documentation. If
|
||||
* it proves to be a problem, we'll have to add more version checks for 64
|
||||
* bit support.
|
||||
*/
|
||||
volatile uint64 value pg_attribute_aligned(8);
|
||||
} pg_atomic_uint64;
|
||||
|
||||
#endif /* HAVE_ATOMIC_H */
|
||||
|
||||
#endif /* defined(HAVE_ATOMICS) */
|
||||
|
||||
|
||||
#if defined(HAVE_ATOMICS)
|
||||
|
||||
#ifdef HAVE_ATOMIC_H
|
||||
|
||||
#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32
|
||||
static inline bool
|
||||
pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
|
||||
uint32 *expected, uint32 newval)
|
||||
{
|
||||
bool ret;
|
||||
uint32 current;
|
||||
|
||||
current = atomic_cas_32(&ptr->value, *expected, newval);
|
||||
ret = current == *expected;
|
||||
*expected = current;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64
|
||||
static inline bool
|
||||
pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
||||
uint64 *expected, uint64 newval)
|
||||
{
|
||||
bool ret;
|
||||
uint64 current;
|
||||
|
||||
current = atomic_cas_64(&ptr->value, *expected, newval);
|
||||
ret = current == *expected;
|
||||
*expected = current;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* HAVE_ATOMIC_H */
|
||||
|
||||
#endif /* defined(HAVE_ATOMICS) */
|
||||
Reference in New Issue
Block a user