139 shmhdr->
freeoffset = aligned - (
char *) shmhdr;
142 shmhdr->
index = NULL;
162 (
errcode(ERRCODE_OUT_OF_MEMORY),
163 errmsg(
"out of shared memory (%zu bytes requested)",
206 *allocated_size = size;
214 newFree = newStart + size;
215 if (newFree <= ShmemSegHdr->totalsize)
217 newSpace = (
char *)
ShmemBase + newStart;
255 newFree = newStart + size;
258 (
errcode(ERRCODE_OUT_OF_MEMORY),
259 errmsg(
"out of shared memory (%zu bytes requested)",
263 newSpace = (
char *)
ShmemBase + newStart;
407 structPtr = shmemseghdr->
index;
422 shmemseghdr->
index = structPtr;
437 (
errcode(ERRCODE_OUT_OF_MEMORY),
438 errmsg(
"could not create ShmemIndex entry for data structure \"%s\"",
449 if (result->
size != size)
453 (
errmsg(
"ShmemIndex entry size is wrong for data structure"
454 " \"%s\": expected %zu, actual %zu",
465 if (structPtr == NULL)
471 (
errcode(ERRCODE_OUT_OF_MEMORY),
472 errmsg(
"not enough shared memory for data structure"
473 " \"%s\" (%zu bytes requested)",
501 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
502 errmsg(
"requested shared memory size overflows size_t")));
516 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
517 errmsg(
"requested shared memory size overflows size_t")));
525#define PG_GET_SHMEM_SIZES_COLS 4
529 Size named_allocated = 0;
540 memset(nulls, 0,
sizeof(nulls));
547 named_allocated += ent->allocated_size;
582#define PG_GET_SHMEM_NUMA_SIZES_COLS 3
591 uint64 shm_total_page_count,
597 elog(
ERROR,
"libnuma initialization failed or NUMA is not supported on this platform");
602 nodes =
palloc(
sizeof(
Size) * (max_nodes + 1));
627 page_ptrs =
palloc0(
sizeof(
void *) * shm_total_page_count);
628 pages_status =
palloc(
sizeof(
int) * shm_total_page_count);
631 elog(
DEBUG1,
"NUMA: page-faulting shared memory segments for proper NUMA readouts");
638 memset(nulls, 0,
sizeof(nulls));
653 endptr = (
char *)
TYPEALIGN(os_page_size,
654 (
char *) ent->location + ent->allocated_size);
655 total_len = (endptr - startptr);
657 shm_ent_page_count = total_len / os_page_size;
663 memset(pages_status, 0xff,
sizeof(
int) * shm_ent_page_count);
673 for (
i = 0;
i < shm_ent_page_count;
i++)
675 page_ptrs[
i] = startptr + (
i * os_page_size);
684 elog(
ERROR,
"failed NUMA pages inquiry status: %m");
687 memset(nodes, 0,
sizeof(
Size) * (max_nodes + 1));
689 for (
i = 0;
i < shm_ent_page_count;
i++)
691 int s = pages_status[
i];
694 if (s < 0 || s > max_nodes)
696 elog(
ERROR,
"invalid NUMA node id outside of allowed range "
707 for (
i = 0;
i <= max_nodes;
i++)
739 GetSystemInfo(&sysinfo);
740 os_page_size = sysinfo.dwPageSize;
742 os_page_size = sysconf(_SC_PAGESIZE);
static Datum values[MAXATTR]
#define CStringGetTextDatum(s)
#define CACHELINEALIGN(LEN)
#define TYPEALIGN(ALIGNVAL, LEN)
#define TYPEALIGN_DOWN(ALIGNVAL, LEN)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, int64 nelem, const HASHCTL *info, int flags)
Size hash_get_shared_size(HASHCTL *info, int flags)
int64 hash_select_dirsize(int64 num_entries)
void * hash_seq_search(HASH_SEQ_STATUS *status)
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define PG_RETURN_BOOL(x)
void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags)
Assert(PointerIsAligned(start, uint64))
static bool pg_mul_size_overflow(size_t a, size_t b, size_t *result)
static bool pg_add_size_overflow(size_t a, size_t b, size_t *result)
if(TABLE==NULL||TABLE_index==NULL)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
void * palloc0(Size size)
#define CHECK_FOR_INTERRUPTS()
PGDLLIMPORT int pg_numa_get_max_node(void)
#define pg_numa_touch_mem_if_required(ptr)
PGDLLIMPORT int pg_numa_query_pages(int pid, unsigned long count, void **pages, int *status)
PGDLLIMPORT int pg_numa_init(void)
static Datum Int64GetDatum(int64 X)
static Datum Int32GetDatum(int32 X)
bool ShmemAddrIsValid(const void *addr)
Datum pg_get_shmem_allocations_numa(PG_FUNCTION_ARGS)
Datum pg_numa_available(PG_FUNCTION_ARGS)
Datum pg_get_shmem_allocations(PG_FUNCTION_ARGS)
void InitShmemIndex(void)
void InitShmemAccess(PGShmemHeader *seghdr)
Size add_size(Size s1, Size s2)
Size pg_get_shmem_pagesize(void)
#define PG_GET_SHMEM_NUMA_SIZES_COLS
void * ShmemAllocNoError(Size size)
Size mul_size(Size s1, Size s2)
void * ShmemAlloc(Size size)
HTAB * ShmemInitHash(const char *name, int64 init_size, int64 max_size, HASHCTL *infoP, int hash_flags)
#define PG_GET_SHMEM_SIZES_COLS
void InitShmemAllocation(void)
static PGShmemHeader * ShmemSegHdr
static void * ShmemAllocRaw(Size size, Size *allocated_size)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
static void * ShmemAllocUnlocked(Size size)
static bool firstNumaTouch
#define SHMEM_INDEX_KEYSIZE
#define SpinLockInit(lock)
#define SpinLockRelease(lock)
#define SpinLockAcquire(lock)
Tuplestorestate * setResult
void GetHugePageSize(Size *hugepagesize, int *mmap_flags)
void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, const Datum *values, const bool *isnull)