@@ -657,6 +657,104 @@ static umf_result_t os_allocation_merge(void *provider, void *lowPtr,
657
657
return UMF_RESULT_SUCCESS ;
658
658
}
659
659
660
+ typedef struct os_ipc_data_t {
661
+ int pid ;
662
+ int fd ;
663
+ size_t fd_offset ;
664
+ size_t size ;
665
+ } os_ipc_data_t ;
666
+
667
+ static umf_result_t os_get_ipc_handle_size (void * provider , size_t * size ) {
668
+ if (provider == NULL || size == NULL ) {
669
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
670
+ }
671
+
672
+ * size = sizeof (os_ipc_data_t );
673
+ return UMF_RESULT_SUCCESS ;
674
+ }
675
+
676
+ static umf_result_t os_get_ipc_handle (void * provider , const void * ptr ,
677
+ size_t size , void * providerIpcData ) {
678
+ if (provider == NULL || providerIpcData == NULL ) {
679
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
680
+ }
681
+
682
+ os_memory_provider_t * os_provider = (os_memory_provider_t * )provider ;
683
+
684
+ void * value = critnib_get (os_provider -> ptr_off , (uintptr_t )ptr );
685
+ if (value == NULL ) {
686
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
687
+ }
688
+
689
+ os_ipc_data_t * os_ipc_data = (os_ipc_data_t * )providerIpcData ;
690
+ os_ipc_data -> pid = os_getpid ();
691
+ os_ipc_data -> fd = os_provider -> fd ;
692
+ os_ipc_data -> fd_offset = (size_t )value ;
693
+ os_ipc_data -> size = size ;
694
+
695
+ return UMF_RESULT_SUCCESS ;
696
+ }
697
+
698
+ static umf_result_t os_put_ipc_handle (void * provider , void * providerIpcData ) {
699
+ if (provider == NULL || providerIpcData == NULL ) {
700
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
701
+ }
702
+
703
+ os_memory_provider_t * os_provider = (os_memory_provider_t * )provider ;
704
+ os_ipc_data_t * os_ipc_data = (os_ipc_data_t * )providerIpcData ;
705
+
706
+ if (os_ipc_data -> fd != os_provider -> fd || os_ipc_data -> pid != os_getpid ()) {
707
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
708
+ }
709
+
710
+ return UMF_RESULT_SUCCESS ;
711
+ }
712
+
713
+ static umf_result_t os_open_ipc_handle (void * provider , void * providerIpcData ,
714
+ void * * ptr ) {
715
+ if (provider == NULL || providerIpcData == NULL || ptr == NULL ) {
716
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
717
+ }
718
+
719
+ os_memory_provider_t * os_provider = (os_memory_provider_t * )provider ;
720
+ os_ipc_data_t * os_ipc_data = (os_ipc_data_t * )providerIpcData ;
721
+
722
+ int fd = os_duplicate_fd (os_ipc_data -> pid , os_ipc_data -> fd );
723
+ if (fd == -1 ) {
724
+ LOG_PERR ("duplicating file descriptor failed" );
725
+ return UMF_RESULT_ERROR_UNKNOWN ;
726
+ }
727
+
728
+ * ptr = os_mmap (NULL , os_ipc_data -> size , os_provider -> protection ,
729
+ os_provider -> flag , fd , os_ipc_data -> fd_offset );
730
+ if (* ptr == NULL ) {
731
+ os_store_last_native_error (UMF_OS_RESULT_ERROR_ALLOC_FAILED , errno );
732
+ LOG_PERR ("memory mapping failed" );
733
+ return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
734
+ }
735
+
736
+ return UMF_RESULT_SUCCESS ;
737
+ }
738
+
739
+ static umf_result_t os_close_ipc_handle (void * provider , void * ptr ,
740
+ size_t size ) {
741
+ if (provider == NULL || ptr == NULL ) {
742
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
743
+ }
744
+
745
+ errno = 0 ;
746
+ int ret = os_munmap (ptr , size );
747
+ // ignore error when size == 0
748
+ if (ret && (size > 0 )) {
749
+ os_store_last_native_error (UMF_OS_RESULT_ERROR_FREE_FAILED , errno );
750
+ LOG_PERR ("memory unmapping failed" );
751
+
752
+ return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
753
+ }
754
+
755
+ return UMF_RESULT_SUCCESS ;
756
+ }
757
+
660
758
static umf_memory_provider_ops_t UMF_OS_MEMORY_PROVIDER_OPS = {
661
759
.version = UMF_VERSION_CURRENT ,
662
760
.initialize = os_initialize ,
@@ -671,11 +769,11 @@ static umf_memory_provider_ops_t UMF_OS_MEMORY_PROVIDER_OPS = {
671
769
.ext .purge_force = os_purge_force ,
672
770
.ext .allocation_merge = os_allocation_merge ,
673
771
.ext .allocation_split = os_allocation_split ,
674
- .ipc .get_ipc_handle_size = NULL ,
675
- .ipc .get_ipc_handle = NULL ,
676
- .ipc .put_ipc_handle = NULL ,
677
- .ipc .open_ipc_handle = NULL ,
678
- .ipc .close_ipc_handle = NULL };
772
+ .ipc .get_ipc_handle_size = os_get_ipc_handle_size ,
773
+ .ipc .get_ipc_handle = os_get_ipc_handle ,
774
+ .ipc .put_ipc_handle = os_put_ipc_handle ,
775
+ .ipc .open_ipc_handle = os_open_ipc_handle ,
776
+ .ipc .close_ipc_handle = os_close_ipc_handle };
679
777
680
778
umf_memory_provider_ops_t * umfOsMemoryProviderOps (void ) {
681
779
return & UMF_OS_MEMORY_PROVIDER_OPS ;
0 commit comments