137 shmhdr->
freeoffset = aligned - (
char *) shmhdr;
140 shmhdr->
index = NULL;
160 (
errcode(ERRCODE_OUT_OF_MEMORY),
161 errmsg(
"out of shared memory (%zu bytes requested)",
204 *allocated_size = size;
212 newFree = newStart + size;
213 if (newFree <= ShmemSegHdr->totalsize)
215 newSpace = (
char *)
ShmemBase + newStart;
253 newFree = newStart + size;
256 (
errcode(ERRCODE_OUT_OF_MEMORY),
257 errmsg(
"out of shared memory (%zu bytes requested)",
261 newSpace = (
char *)
ShmemBase + newStart;
405 structPtr = shmemseghdr->
index;
420 shmemseghdr->
index = structPtr;
435 (
errcode(ERRCODE_OUT_OF_MEMORY),
436 errmsg(
"could not create ShmemIndex entry for data structure \"%s\"",
447 if (result->
size != size)
451 (
errmsg(
"ShmemIndex entry size is wrong for data structure"
452 " \"%s\": expected %zu, actual %zu",
463 if (structPtr == NULL)
469 (
errcode(ERRCODE_OUT_OF_MEMORY),
470 errmsg(
"not enough shared memory for data structure"
471 " \"%s\" (%zu bytes requested)",
499 if (result <
s1 || result <
s2)
501 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
502 errmsg(
"requested shared memory size overflows size_t")));
514 if (
s1 == 0 ||
s2 == 0)
518 if (result /
s2 !=
s1)
520 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
521 errmsg(
"requested shared memory size overflows size_t")));
529#define PG_GET_SHMEM_SIZES_COLS 4
533 Size named_allocated = 0;
544 memset(nulls, 0,
sizeof(nulls));
551 named_allocated += ent->allocated_size;
586#define PG_GET_SHMEM_NUMA_SIZES_COLS 3
595 uint64 shm_total_page_count,
601 elog(
ERROR,
"libnuma initialization failed or NUMA is not supported on this platform");
606 nodes =
palloc(
sizeof(
Size) * (max_nodes + 1));
634 page_ptrs =
palloc0(
sizeof(
void *) * shm_total_page_count);
635 pages_status =
palloc(
sizeof(
int) * shm_total_page_count);
638 elog(
DEBUG1,
"NUMA: page-faulting shared memory segments for proper NUMA readouts");
645 memset(nulls, 0,
sizeof(nulls));
660 endptr = (
char *)
TYPEALIGN(os_page_size,
661 (
char *) ent->location + ent->allocated_size);
662 total_len = (endptr - startptr);
664 shm_ent_page_count = total_len / os_page_size;
670 memset(pages_status, 0xff,
sizeof(
int) * shm_ent_page_count);
680 for (
i = 0;
i < shm_ent_page_count;
i++)
684 page_ptrs[
i] = startptr + (
i * os_page_size);
693 elog(
ERROR,
"failed NUMA pages inquiry status: %m");
696 memset(nodes, 0,
sizeof(
Size) * (max_nodes + 1));
698 for (
i = 0;
i < shm_ent_page_count;
i++)
700 int s = pages_status[
i];
703 if (s < 0 || s > max_nodes)
705 elog(
ERROR,
"invalid NUMA node id outside of allowed range "
716 for (
i = 0;
i <= max_nodes;
i++)
748 GetSystemInfo(&sysinfo);
749 os_page_size = sysinfo.dwPageSize;
751 os_page_size = sysconf(_SC_PAGESIZE);
static Datum values[MAXATTR]
#define CStringGetTextDatum(s)
#define CACHELINEALIGN(LEN)
#define pg_attribute_unused()
#define TYPEALIGN(ALIGNVAL, LEN)
#define TYPEALIGN_DOWN(ALIGNVAL, LEN)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
Size hash_get_shared_size(HASHCTL *info, int flags)
void * hash_seq_search(HASH_SEQ_STATUS *status)
long hash_select_dirsize(long num_entries)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
Datum Int64GetDatum(int64 X)
#define PG_RETURN_BOOL(x)
void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags)
Assert(PointerIsAligned(start, uint64))
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(ro_volatile_var, ptr)
PGDLLIMPORT int pg_numa_query_pages(int pid, unsigned long count, void **pages, int *status)
PGDLLIMPORT int pg_numa_init(void)
bool ShmemAddrIsValid(const void *addr)
Datum pg_get_shmem_allocations_numa(PG_FUNCTION_ARGS)
Datum pg_numa_available(PG_FUNCTION_ARGS)
HTAB * ShmemInitHash(const char *name, long init_size, long max_size, HASHCTL *infoP, int hash_flags)
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)
void * ShmemAllocUnlocked(Size size)
#define PG_GET_SHMEM_NUMA_SIZES_COLS
void * ShmemAllocNoError(Size size)
Size mul_size(Size s1, Size s2)
void * ShmemAlloc(Size size)
#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 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)