Skip to content

Commit

Permalink
move providers to UMF
Browse files Browse the repository at this point in the history
  • Loading branch information
bratpiorka committed Jul 12, 2023
1 parent 0d992a0 commit 72ec0fe
Show file tree
Hide file tree
Showing 12 changed files with 573 additions and 14 deletions.
4 changes: 3 additions & 1 deletion source/common/unified_malloc_framework/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@

set(UMF_SOURCES
src/memory_pool.c
src/memory_provider.c
src/memory_provider.cpp
src/memory_tracker.cpp
src/memory_provider_get_last_failed.cpp
src/os_memory_provider.c
)

if(UMF_BUILD_SHARED_LIBRARY)
Expand All @@ -23,5 +24,6 @@ else()
endif()

add_library(${PROJECT_NAME}::unified_malloc_framework ALIAS unified_malloc_framework)
target_link_libraries(unified_malloc_framework numa)

target_include_directories(unified_malloc_framework PUBLIC include)
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ void umfFree(void *ptr);
///
/// * The implementation of this function *should* be lock-free.
/// \param hPool specified memory hPool
/// \return Error code desciribng the failure of the last failed allocation operation.
/// \return Error code describing the failure of the last failed allocation operation.
/// The value is undefined if the previous allocation was successful.
enum umf_result_t umfPoolGetLastAllocationError(umf_memory_pool_handle_t hPool);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
extern "C" {
#endif

typedef struct umf_memory_provider_t *umf_memory_provider_handle_t;

/// \brief This structure comprises function pointers used by corresponding umfPool*
/// calls. Each memory pool implementation should initialize all function
/// pointers.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,14 @@ umfMemoryProviderCreate(struct umf_memory_provider_ops_t *ops, void *params,
///
void umfMemoryProviderDestroy(umf_memory_provider_handle_t hProvider);

// TODO comment
enum umf_result_t
umfMemoryProviderRegister(struct umf_memory_provider_ops_t *ops, char *name);
enum umf_result_t umfMemoryProvidersRegisterGetNames(char *providers,
size_t *numProviders);
umf_memory_provider_type_t umfMemoryProvidersRegisterGetType(char *name);
struct umf_memory_provider_ops_t umfMemoryProvidersRegisterGetOps(char *name);

///
/// \brief Allocates size bytes of uninitialized storage from memory provider
/// with specified alignment.
Expand Down Expand Up @@ -110,7 +118,7 @@ umfMemoryProviderGetMinPageSize(umf_memory_provider_handle_t hProvider,

///
/// \brief Discard physical pages within the virtual memory mapping associated at given addr and size.
/// This call is asynchronous and may delay puring the pages indefinitely.
/// This call is asynchronous and may delay purging the pages indefinitely.
/// \param hProvider handle to the memory provider
/// \param ptr beginning of the virtual memory range
/// \param size size of the virtual memory range
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,38 @@
extern "C" {
#endif

// TODO this is a fixed list - maybe this could be changed to a map?
// or other dynamic struct?
typedef enum umf_memory_provider_type_t {
UMF_MEMORY_PROVIDER_TYPE_INVALID = -1,
UMF_MEMORY_PROVIDER_TYPE_NUMA = 0,
UMF_MEMORY_PROVIDER_TYPE_USM,
UMF_MEMORY_PROVIDER_TYPE_FIXED,
UMF_MEMORY_PROVIDER_TYPE_FILE,
UMF_MEMORY_PROVIDER_TYPE_USER,
UMF_MEMORY_PROVIDER_TYPE_NUM = UMF_MEMORY_PROVIDER_TYPE_USER + 1
} umf_memory_provider_type_t;

/// This structure comprises function pointers used by corresponding
/// umfMemoryProvider* calls. Each memory provider implementation should
/// initialize all function pointers.
struct umf_memory_provider_ops_t {
/// Version of the ops structure.
/// Should be initialized using UMF_VERSION_CURRENT
uint32_t version;
umf_memory_provider_type_t type; // TODO change to caps?

///
/// \brief Initializes memory pool.
/// \param params pool-specific params
/// \param pool returns pointer to the pool
/// \brief Initializes memory provider.
/// \param params provider-specific params
/// \param provider returns pointer to the provider
/// \return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
enum umf_result_t (*initialize)(void *params, void **pool);
enum umf_result_t (*initialize)(void *params, void **provider);

///
/// \brief Finalizes memory pool.
/// \param pool pool to finalize
void (*finalize)(void *pool);
/// \brief Finalizes memory provider.
/// \param provider provider to finalize
void (*finalize)(void *provider);

/// Refer to memory_provider.h for description of those functions
enum umf_result_t (*alloc)(void *provider, size_t size, size_t alignment,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,30 @@
*
*/

#include "memory_provider_internal.h"
#include <umf/memory_provider.h>

#include <assert.h>
#include <stdlib.h>

#include <cstring>
#include <map>
#include <string>

#include <umf/memory_provider.h>

#include "memory_provider_internal.h"
#include "os_memory_provider.h"

struct umf_memory_provider_t {
struct umf_memory_provider_ops_t ops;
void *provider_priv;
};

std::map<std::string, umf_memory_provider_ops_t> globalProviders;

enum umf_result_t
umfMemoryProviderCreate(struct umf_memory_provider_ops_t *ops, void *params,
umf_memory_provider_handle_t *hProvider) {
umf_memory_provider_handle_t provider =
malloc(sizeof(struct umf_memory_provider_t));
(umf_memory_provider_t *)malloc(sizeof(struct umf_memory_provider_t));
if (!provider) {
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
}
Expand All @@ -46,6 +54,55 @@ umfMemoryProviderCreate(struct umf_memory_provider_ops_t *ops, void *params,
return UMF_RESULT_SUCCESS;
}

enum umf_result_t umfMemoryProviderRegister(umf_memory_provider_ops_t *ops,
char *name) {

// TODO improve - use the ops->get_name()
globalProviders[name] = *ops;

return UMF_RESULT_SUCCESS;
}

enum umf_result_t umfMemoryProvidersRegisterGetNames(char *providers,
size_t *numProviders) {
// TODO improve
if (globalProviders.count("OS") == 0) {

umfMemoryProviderRegister(&OS_MEMORY_PROVIDER_OPS,
std::string("OS").data());

// TODO IMPORTANT
// as the NUMA (OS) memory provider is the default provider here in the UMF,
// it should be available (predefined) somehow so a user could use it
// without any umalloc or UR libs etc
}

if (providers == NULL) {
*numProviders = globalProviders.size();
} else {
// get min
//size_t num = (*numProviders > UMF_MEMORY_PROVIDER_TYPE_NUM)
// ? UMF_MEMORY_PROVIDER_TYPE_NUM
// : *numProviders;

for (auto p : globalProviders) {
std::strcat(providers, p.first.c_str());
std::strcat(providers, ";");
}
}

return UMF_RESULT_SUCCESS;
}

// TODO rename ;)
umf_memory_provider_ops_t umfMemoryProvidersRegisterGetOps(char *name) {
return globalProviders[name];
}

umf_memory_provider_type_t umfMemoryProvidersRegisterGetType(char *name) {
return globalProviders[name].type;
}

void umfMemoryProviderDestroy(umf_memory_provider_handle_t hProvider) {
hProvider->ops.finalize(hProvider->provider_priv);
free(hProvider);
Expand Down
Loading

0 comments on commit 72ec0fe

Please sign in to comment.