@@ -525,6 +525,14 @@ static umf_result_t os_initialize(void *params, void **provider) {
525
525
goto err_destroy_bitmaps ;
526
526
}
527
527
528
+ if (os_provider -> fd > 0 ) {
529
+ if (util_mutex_init (& os_provider -> lock_fd ) == NULL ) {
530
+ LOG_ERR ("initializing the file size lock failed" );
531
+ ret = UMF_RESULT_ERROR_UNKNOWN ;
532
+ goto err_destroy_bitmaps ;
533
+ }
534
+ }
535
+
528
536
os_provider -> nodeset_str_buf = umf_ba_global_alloc (NODESET_STR_BUF_LEN );
529
537
if (!os_provider -> nodeset_str_buf ) {
530
538
LOG_INFO ("allocating memory for printing NUMA nodes failed" );
@@ -562,6 +570,10 @@ static void os_finalize(void *provider) {
562
570
563
571
os_memory_provider_t * os_provider = provider ;
564
572
573
+ if (os_provider -> fd > 0 ) {
574
+ util_mutex_destroy_not_free (& os_provider -> lock_fd );
575
+ }
576
+
565
577
critnib_delete (os_provider -> fd_offset_map );
566
578
567
579
free_bitmaps (os_provider );
@@ -624,8 +636,8 @@ static inline void assert_is_page_aligned(uintptr_t ptr, size_t page_size) {
624
636
625
637
static int os_mmap_aligned (void * hint_addr , size_t length , size_t alignment ,
626
638
size_t page_size , int prot , int flag , int fd ,
627
- size_t max_fd_size , void * * out_addr ,
628
- size_t * fd_size ) {
639
+ size_t max_fd_size , os_mutex_t * lock_fd ,
640
+ void * * out_addr , size_t * fd_size ) {
629
641
assert (out_addr );
630
642
631
643
size_t extended_length = length ;
@@ -641,13 +653,20 @@ static int os_mmap_aligned(void *hint_addr, size_t length, size_t alignment,
641
653
size_t fd_offset = 0 ;
642
654
643
655
if (fd > 0 ) {
656
+ if (util_mutex_lock (lock_fd )) {
657
+ LOG_ERR ("locking file size failed" );
658
+ return -1 ;
659
+ }
660
+
644
661
if (* fd_size + extended_length > max_fd_size ) {
662
+ util_mutex_unlock (lock_fd );
645
663
LOG_ERR ("cannot grow a file size beyond %zu" , max_fd_size );
646
664
return -1 ;
647
665
}
648
666
649
667
fd_offset = * fd_size ;
650
668
* fd_size += extended_length ;
669
+ util_mutex_unlock (lock_fd );
651
670
}
652
671
653
672
void * ptr = os_mmap (hint_addr , extended_length , prot , flag , fd , fd_offset );
@@ -899,11 +918,11 @@ static umf_result_t os_alloc(void *provider, size_t size, size_t alignment,
899
918
errno = 0 ;
900
919
ret = os_mmap_aligned (NULL , size , alignment , page_size ,
901
920
os_provider -> protection , os_provider -> visibility ,
902
- os_provider -> fd , os_provider -> max_size_fd , & addr ,
903
- & os_provider -> size_fd );
921
+ os_provider -> fd , os_provider -> max_size_fd ,
922
+ & os_provider -> lock_fd , & addr , & os_provider -> size_fd );
904
923
if (ret ) {
905
- os_store_last_native_error (UMF_OS_RESULT_ERROR_ALLOC_FAILED , errno );
906
- LOG_PERR ("memory allocation failed" );
924
+ os_store_last_native_error (UMF_OS_RESULT_ERROR_ALLOC_FAILED , 0 );
925
+ LOG_ERR ("memory allocation failed" );
907
926
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
908
927
}
909
928
0 commit comments