Blame include/memkind/internal/memkind_private.h

Packit Service 7f3b24
// SPDX-License-Identifier: BSD-2-Clause
Packit Service 7f3b24
/* Copyright (C) 2016 - 2020 Intel Corporation. */
Packit 345191
Packit 345191
#pragma once
Packit 345191
#ifdef __cplusplus
Packit 345191
extern "C" {
Packit 345191
#endif
Packit 345191
Packit 345191
#include "memkind.h"
Packit 345191
Packit 345191
#include <stdbool.h>
Packit 345191
#include <pthread.h>
Packit 345191
Packit 345191
#ifdef __GNUC__
Packit 345191
#   define MEMKIND_LIKELY(x)       __builtin_expect(!!(x), 1)
Packit 345191
#   define MEMKIND_UNLIKELY(x)     __builtin_expect(!!(x), 0)
Packit 345191
#else
Packit 345191
#   define MEMKIND_LIKELY(x)       (x)
Packit 345191
#   define MEMKIND_UNLIKELY(x)     (x)
Packit 345191
#endif
Packit 345191
Packit 345191
#ifndef MEMKIND_EXPORT
Packit 345191
#   define MEMKIND_EXPORT __attribute__((visibility("default")))
Packit 345191
#endif
Packit 345191
Packit 345191
// This ladder call is required due to meanders of C's preprocessor logic.
Packit 345191
// Without it, JE_PREFIX would be used directly (i.e. 'JE_PREFIX') and not
Packit 345191
// substituted with defined value.
Packit 345191
#define JE_SYMBOL2(a, b) a ## b
Packit 345191
#define JE_SYMBOL1(a, b) JE_SYMBOL2(a, b)
Packit 345191
#define JE_SYMBOL(b)     JE_SYMBOL1(JE_PREFIX, b)
Packit 345191
Packit 345191
// Redefine symbols
Packit 345191
#define jemk_malloc                 JE_SYMBOL(malloc)
Packit 345191
#define jemk_mallocx                JE_SYMBOL(mallocx)
Packit 345191
#define jemk_calloc                 JE_SYMBOL(calloc)
Packit 345191
#define jemk_rallocx                JE_SYMBOL(rallocx)
Packit 345191
#define jemk_realloc                JE_SYMBOL(realloc)
Packit 345191
#define jemk_mallctl                JE_SYMBOL(mallctl)
Packit 345191
#define jemk_memalign               JE_SYMBOL(memalign)
Packit 345191
#define jemk_posix_memalign         JE_SYMBOL(posix_memalign)
Packit 345191
#define jemk_free                   JE_SYMBOL(free)
Packit 345191
#define jemk_dallocx                JE_SYMBOL(dallocx)
Packit 345191
#define jemk_malloc_usable_size     JE_SYMBOL(malloc_usable_size)
Packit Service 7f3b24
#define jemk_arenalookupx           JE_SYMBOL(arenalookupx)
Packit Service 7f3b24
#define jemk_check_reallocatex      JE_SYMBOL(check_reallocatex)
Packit 345191
Packit 345191
enum memkind_const_private {
Packit 345191
    MEMKIND_NAME_LENGTH_PRIV = 64
Packit 345191
};
Packit 345191
Packit 345191
struct memkind_ops {
Packit 345191
    int (* create)(struct memkind *kind, struct memkind_ops *ops, const char *name);
Packit 345191
    int (* destroy)(struct memkind *kind);
Packit 345191
    void *(* malloc)(struct memkind *kind, size_t size);
Packit 345191
    void *(* calloc)(struct memkind *kind, size_t num, size_t size);
Packit 345191
    int (* posix_memalign)(struct memkind *kind, void **memptr, size_t alignment,
Packit 345191
                           size_t size);
Packit 345191
    void *(* realloc)(struct memkind *kind, void *ptr, size_t size);
Packit 345191
    void (* free)(struct memkind *kind, void *ptr);
Packit 345191
    void *(* mmap)(struct memkind *kind, void *addr, size_t size);
Packit 345191
    int (* mbind)(struct memkind *kind, void *ptr, size_t size);
Packit 345191
    int (* madvise)(struct memkind *kind, void *addr, size_t size);
Packit 345191
    int (* get_mmap_flags)(struct memkind *kind, int *flags);
Packit 345191
    int (* get_mbind_mode)(struct memkind *kind, int *mode);
Packit 345191
    int (* get_mbind_nodemask)(struct memkind *kind, unsigned long *nodemask,
Packit 345191
                               unsigned long maxnode);
Packit 345191
    int (* get_arena)(struct memkind *kind, unsigned int *arena, size_t size);
Packit 345191
    int (* check_available)(struct memkind *kind);
Packit 345191
    void (* init_once)(void);
Packit 345191
    int (* finalize)(struct memkind *kind);
Packit 345191
    size_t (* malloc_usable_size)(struct memkind *kind, void *ptr);
Packit 345191
    int (* update_memory_usage_policy)(struct memkind *kind,
Packit 345191
                                       memkind_mem_usage_policy policy);
Packit 345191
    int (* get_stat)(memkind_t kind, memkind_stat_type stat, size_t *value);
Packit 345191
    void *(* defrag_reallocate)(struct memkind *kind, void *ptr);
Packit 345191
};
Packit 345191
Packit 345191
struct memkind {
Packit 345191
    struct memkind_ops *ops;
Packit 345191
    unsigned int partition;
Packit 345191
    char name[MEMKIND_NAME_LENGTH_PRIV];
Packit 345191
    pthread_once_t init_once;
Packit 345191
    unsigned int arena_map_len; // is power of 2
Packit 345191
    unsigned int *arena_map; // To be deleted beyond 1.2.0+
Packit 345191
    pthread_key_t arena_key;
Packit 345191
    void *priv;
Packit 345191
    unsigned int
Packit 345191
    arena_map_mask; // arena_map_len - 1 to optimize modulo operation on arena_map_len
Packit 345191
    unsigned int arena_zero; // index first jemalloc arena of this kind
Packit 345191
};
Packit 345191
Packit 345191
struct memkind_config {
Packit 345191
    const char *pmem_dir;            //PMEM kind path
Packit 345191
    size_t pmem_size;                //PMEM kind size
Packit 345191
    memkind_mem_usage_policy policy; //kind memory usage policy
Packit 345191
};
Packit 345191
Packit 345191
void memkind_init(memkind_t kind, bool check_numa);
Packit 345191
Packit 345191
void *kind_mmap(struct memkind *kind, void *addr, size_t size);
Packit 345191
Packit 345191
#ifdef __cplusplus
Packit 345191
}
Packit 345191
#endif
Packit 345191