@@ -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+
169180static 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 );
262290err_mutex_destroy_not_free :
263291 utils_mutex_destroy_not_free (& file_provider -> lock );
292+ err_coarse_delete :
293+ coarse_delete (file_provider -> coarse );
264294err_close_fd :
265295 utils_close_fd (file_provider -> fd );
266296err_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
444475static 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.
573608static 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.
605646static 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