@@ -63,6 +63,7 @@ umf_result_t umfFileMemoryProviderParamsSetVisibility(
63
63
#else // !defined(_WIN32) && !defined(UMF_NO_HWLOC)
64
64
65
65
#include "base_alloc_global.h"
66
+ #include "coarse.h"
66
67
#include "critnib.h"
67
68
#include "libumf.h"
68
69
#include "utils_common.h"
@@ -101,6 +102,8 @@ typedef struct file_memory_provider_t {
101
102
// It is needed mainly in the get_ipc_handle and open_ipc_handle hooks
102
103
// to mmap a specific part of a file.
103
104
critnib * fd_offset_map ;
105
+
106
+ coarse_t * coarse ; // coarse library handle
104
107
} file_memory_provider_t ;
105
108
106
109
// File Memory Provider settings struct
@@ -166,6 +169,14 @@ file_translate_params(umf_file_memory_provider_params_t *in_params,
166
169
return UMF_RESULT_SUCCESS ;
167
170
}
168
171
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
+
169
180
static umf_result_t file_initialize (void * params , void * * provider ) {
170
181
umf_result_t ret ;
171
182
@@ -233,10 +244,27 @@ static umf_result_t file_initialize(void *params, void **provider) {
233
244
file_provider -> page_size = utils_get_page_size ();
234
245
}
235
246
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
+
236
264
if (utils_mutex_init (& file_provider -> lock ) == NULL ) {
237
265
LOG_ERR ("lock init failed" );
238
266
ret = UMF_RESULT_ERROR_UNKNOWN ;
239
- goto err_close_fd ;
267
+ goto err_coarse_delete ;
240
268
}
241
269
242
270
file_provider -> fd_offset_map = critnib_new ();
@@ -261,6 +289,8 @@ static umf_result_t file_initialize(void *params, void **provider) {
261
289
critnib_delete (file_provider -> fd_offset_map );
262
290
err_mutex_destroy_not_free :
263
291
utils_mutex_destroy_not_free (& file_provider -> lock );
292
+ err_coarse_delete :
293
+ coarse_delete (file_provider -> coarse );
264
294
err_close_fd :
265
295
utils_close_fd (file_provider -> fd );
266
296
err_free_file_provider :
@@ -285,6 +315,7 @@ static void file_finalize(void *provider) {
285
315
utils_close_fd (file_provider -> fd );
286
316
critnib_delete (file_provider -> fd_offset_map );
287
317
critnib_delete (file_provider -> mmaps );
318
+ coarse_delete (file_provider -> coarse );
288
319
umf_ba_global_free (file_provider );
289
320
}
290
321
@@ -443,6 +474,12 @@ static umf_result_t file_alloc_aligned(file_memory_provider_t *file_provider,
443
474
444
475
static umf_result_t file_alloc (void * provider , size_t size , size_t alignment ,
445
476
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 ) {
446
483
umf_result_t umf_result ;
447
484
int ret ;
448
485
@@ -568,10 +605,15 @@ static const char *file_get_name(void *provider) {
568
605
return "FILE" ;
569
606
}
570
607
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.
573
608
static umf_result_t file_allocation_split (void * provider , void * ptr ,
574
609
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 ) {
575
617
(void )totalSize ;
576
618
577
619
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,
601
643
return UMF_RESULT_SUCCESS ;
602
644
}
603
645
604
- // It should NOT be called concurrently with file_allocation_split() with the same pointer.
605
646
static umf_result_t file_allocation_merge (void * provider , void * lowPtr ,
606
647
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 ) {
607
654
(void )lowPtr ;
608
655
(void )totalSize ;
609
656
0 commit comments