Skip to content

Commit bbe56f1

Browse files
committed
Use libcoarse in the file provider
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 958b690 commit bbe56f1

File tree

1 file changed

+51
-4
lines changed

1 file changed

+51
-4
lines changed

src/provider/provider_file_memory.c

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ umf_result_t umfFileMemoryProviderParamsSetVisibility(
6363
#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC)
6464

6565
#include "base_alloc_global.h"
66+
#include "coarse.h"
6667
#include "critnib.h"
6768
#include "libumf.h"
6869
#include "utils_common.h"
@@ -101,6 +102,8 @@ typedef struct file_memory_provider_t {
101102
// It is needed mainly in the get_ipc_handle and open_ipc_handle hooks
102103
// to mmap a specific part of a file.
103104
critnib *fd_offset_map;
105+
106+
coarse_t *coarse; // coarse library handle
104107
} file_memory_provider_t;
105108

106109
// File Memory Provider settings struct
@@ -166,6 +169,14 @@ file_translate_params(umf_file_memory_provider_params_t *in_params,
166169
return UMF_RESULT_SUCCESS;
167170
}
168171

172+
static umf_result_t file_alloc_cb(void *provider, size_t size, size_t alignment,
173+
void **resultPtr);
174+
static umf_result_t file_allocation_split_cb(void *provider, void *ptr,
175+
size_t totalSize,
176+
size_t firstSize);
177+
static umf_result_t file_allocation_merge_cb(void *provider, void *lowPtr,
178+
void *highPtr, size_t totalSize);
179+
169180
static umf_result_t file_initialize(void *params, void **provider) {
170181
umf_result_t ret;
171182

@@ -233,10 +244,27 @@ static umf_result_t file_initialize(void *params, void **provider) {
233244
file_provider->page_size = utils_get_page_size();
234245
}
235246

247+
coarse_params_t coarse_params = {0};
248+
coarse_params.provider = file_provider;
249+
coarse_params.page_size = file_provider->page_size;
250+
coarse_params.cb.alloc = file_alloc_cb;
251+
coarse_params.cb.free = NULL; // not available for the file provider
252+
coarse_params.cb.split = file_allocation_split_cb;
253+
coarse_params.cb.merge = file_allocation_merge_cb;
254+
255+
coarse_t *coarse = NULL;
256+
ret = coarse_new(&coarse_params, &coarse);
257+
if (ret != UMF_RESULT_SUCCESS) {
258+
LOG_ERR("coarse_new() failed");
259+
goto err_close_fd;
260+
}
261+
262+
file_provider->coarse = coarse;
263+
236264
if (utils_mutex_init(&file_provider->lock) == NULL) {
237265
LOG_ERR("lock init failed");
238266
ret = UMF_RESULT_ERROR_UNKNOWN;
239-
goto err_close_fd;
267+
goto err_coarse_delete;
240268
}
241269

242270
file_provider->fd_offset_map = critnib_new();
@@ -261,6 +289,8 @@ static umf_result_t file_initialize(void *params, void **provider) {
261289
critnib_delete(file_provider->fd_offset_map);
262290
err_mutex_destroy_not_free:
263291
utils_mutex_destroy_not_free(&file_provider->lock);
292+
err_coarse_delete:
293+
coarse_delete(file_provider->coarse);
264294
err_close_fd:
265295
utils_close_fd(file_provider->fd);
266296
err_free_file_provider:
@@ -285,6 +315,7 @@ static void file_finalize(void *provider) {
285315
utils_close_fd(file_provider->fd);
286316
critnib_delete(file_provider->fd_offset_map);
287317
critnib_delete(file_provider->mmaps);
318+
coarse_delete(file_provider->coarse);
288319
umf_ba_global_free(file_provider);
289320
}
290321

@@ -443,6 +474,12 @@ static umf_result_t file_alloc_aligned(file_memory_provider_t *file_provider,
443474

444475
static umf_result_t file_alloc(void *provider, size_t size, size_t alignment,
445476
void **resultPtr) {
477+
file_memory_provider_t *file_provider = (file_memory_provider_t *)provider;
478+
return coarse_alloc(file_provider->coarse, size, alignment, resultPtr);
479+
}
480+
481+
static umf_result_t file_alloc_cb(void *provider, size_t size, size_t alignment,
482+
void **resultPtr) {
446483
umf_result_t umf_result;
447484
int ret;
448485

@@ -568,10 +605,15 @@ static const char *file_get_name(void *provider) {
568605
return "FILE";
569606
}
570607

571-
// This function is supposed to be thread-safe, so it should NOT be called concurrently
572-
// with file_allocation_merge() with the same pointer.
573608
static umf_result_t file_allocation_split(void *provider, void *ptr,
574609
size_t totalSize, size_t firstSize) {
610+
file_memory_provider_t *file_provider = (file_memory_provider_t *)provider;
611+
return coarse_split(file_provider->coarse, ptr, totalSize, firstSize);
612+
}
613+
614+
static umf_result_t file_allocation_split_cb(void *provider, void *ptr,
615+
size_t totalSize,
616+
size_t firstSize) {
575617
(void)totalSize;
576618

577619
file_memory_provider_t *file_provider = (file_memory_provider_t *)provider;
@@ -601,9 +643,14 @@ static umf_result_t file_allocation_split(void *provider, void *ptr,
601643
return UMF_RESULT_SUCCESS;
602644
}
603645

604-
// It should NOT be called concurrently with file_allocation_split() with the same pointer.
605646
static umf_result_t file_allocation_merge(void *provider, void *lowPtr,
606647
void *highPtr, size_t totalSize) {
648+
file_memory_provider_t *file_provider = (file_memory_provider_t *)provider;
649+
return coarse_merge(file_provider->coarse, lowPtr, highPtr, totalSize);
650+
}
651+
652+
static umf_result_t file_allocation_merge_cb(void *provider, void *lowPtr,
653+
void *highPtr, size_t totalSize) {
607654
(void)lowPtr;
608655
(void)totalSize;
609656

0 commit comments

Comments
 (0)