@@ -28,6 +28,7 @@ umf_memory_provider_ops_t *umfFileMemoryProviderOps(void) {
2828#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC)
2929
3030#include "base_alloc_global.h"
31+ #include "coarse.h"
3132#include "critnib.h"
3233#include "utils_common.h"
3334#include "utils_concurrency.h"
@@ -65,6 +66,8 @@ typedef struct file_memory_provider_t {
6566 // It is needed mainly in the get_ipc_handle and open_ipc_handle hooks
6667 // to mmap a specific part of a file.
6768 critnib * fd_offset_map ;
69+
70+ coarse_t * coarse ; // coarse library handle
6871} file_memory_provider_t ;
6972
7073typedef struct file_last_native_error_t {
@@ -123,6 +126,14 @@ file_translate_params(umf_file_memory_provider_params_t *in_params,
123126 return UMF_RESULT_SUCCESS ;
124127}
125128
129+ static umf_result_t file_alloc_cb (void * provider , size_t size , size_t alignment ,
130+ void * * resultPtr );
131+ static umf_result_t file_allocation_split_cb (void * provider , void * ptr ,
132+ size_t totalSize ,
133+ size_t firstSize );
134+ static umf_result_t file_allocation_merge_cb (void * provider , void * lowPtr ,
135+ void * highPtr , size_t totalSize );
136+
126137static umf_result_t file_initialize (void * params , void * * provider ) {
127138 umf_result_t ret ;
128139
@@ -190,10 +201,27 @@ static umf_result_t file_initialize(void *params, void **provider) {
190201 file_provider -> page_size = utils_get_page_size ();
191202 }
192203
204+ coarse_params_t coarse_params = {0 };
205+ coarse_params .provider = file_provider ;
206+ coarse_params .page_size = file_provider -> page_size ;
207+ coarse_params .cb .alloc = file_alloc_cb ;
208+ coarse_params .cb .free = NULL ; // not available for the file provider
209+ coarse_params .cb .split = file_allocation_split_cb ;
210+ coarse_params .cb .merge = file_allocation_merge_cb ;
211+
212+ coarse_t * coarse = NULL ;
213+ ret = coarse_new (& coarse_params , & coarse );
214+ if (ret != UMF_RESULT_SUCCESS ) {
215+ LOG_ERR ("coarse_new() failed" );
216+ goto err_close_fd ;
217+ }
218+
219+ file_provider -> coarse = coarse ;
220+
193221 if (utils_mutex_init (& file_provider -> lock ) == NULL ) {
194222 LOG_ERR ("lock init failed" );
195223 ret = UMF_RESULT_ERROR_UNKNOWN ;
196- goto err_close_fd ;
224+ goto err_coarse_delete ;
197225 }
198226
199227 file_provider -> fd_offset_map = critnib_new ();
@@ -218,6 +246,8 @@ static umf_result_t file_initialize(void *params, void **provider) {
218246 critnib_delete (file_provider -> fd_offset_map );
219247err_mutex_destroy_not_free :
220248 utils_mutex_destroy_not_free (& file_provider -> lock );
249+ err_coarse_delete :
250+ coarse_delete (file_provider -> coarse );
221251err_close_fd :
222252 utils_close_fd (file_provider -> fd );
223253err_free_file_provider :
@@ -242,6 +272,7 @@ static void file_finalize(void *provider) {
242272 utils_close_fd (file_provider -> fd );
243273 critnib_delete (file_provider -> fd_offset_map );
244274 critnib_delete (file_provider -> mmaps );
275+ coarse_delete (file_provider -> coarse );
245276 umf_ba_global_free (file_provider );
246277}
247278
@@ -400,6 +431,12 @@ static umf_result_t file_alloc_aligned(file_memory_provider_t *file_provider,
400431
401432static umf_result_t file_alloc (void * provider , size_t size , size_t alignment ,
402433 void * * resultPtr ) {
434+ file_memory_provider_t * file_provider = (file_memory_provider_t * )provider ;
435+ return coarse_alloc (file_provider -> coarse , size , alignment , resultPtr );
436+ }
437+
438+ static umf_result_t file_alloc_cb (void * provider , size_t size , size_t alignment ,
439+ void * * resultPtr ) {
403440 umf_result_t umf_result ;
404441 int ret ;
405442
@@ -525,10 +562,15 @@ static const char *file_get_name(void *provider) {
525562 return "FILE" ;
526563}
527564
528- // This function is supposed to be thread-safe, so it should NOT be called concurrently
529- // with file_allocation_merge() with the same pointer.
530565static umf_result_t file_allocation_split (void * provider , void * ptr ,
531566 size_t totalSize , size_t firstSize ) {
567+ file_memory_provider_t * file_provider = (file_memory_provider_t * )provider ;
568+ return coarse_split (file_provider -> coarse , ptr , totalSize , firstSize );
569+ }
570+
571+ static umf_result_t file_allocation_split_cb (void * provider , void * ptr ,
572+ size_t totalSize ,
573+ size_t firstSize ) {
532574 (void )totalSize ;
533575
534576 file_memory_provider_t * file_provider = (file_memory_provider_t * )provider ;
@@ -558,9 +600,14 @@ static umf_result_t file_allocation_split(void *provider, void *ptr,
558600 return UMF_RESULT_SUCCESS ;
559601}
560602
561- // It should NOT be called concurrently with file_allocation_split() with the same pointer.
562603static umf_result_t file_allocation_merge (void * provider , void * lowPtr ,
563604 void * highPtr , size_t totalSize ) {
605+ file_memory_provider_t * file_provider = (file_memory_provider_t * )provider ;
606+ return coarse_merge (file_provider -> coarse , lowPtr , highPtr , totalSize );
607+ }
608+
609+ static umf_result_t file_allocation_merge_cb (void * provider , void * lowPtr ,
610+ void * highPtr , size_t totalSize ) {
564611 (void )lowPtr ;
565612 (void )totalSize ;
566613
0 commit comments