mirror of
https://github.com/QuantumPackage/qp2.git
synced 2024-12-12 14:43:29 +01:00
109 lines
3.3 KiB
Fortran
109 lines
3.3 KiB
Fortran
module mmap_module
|
|
|
|
use iso_c_binding
|
|
|
|
interface
|
|
|
|
! File descriptors
|
|
! ----------------
|
|
|
|
type(c_ptr) function c_mmap_fortran(filename, length, fd, read_only) bind(c,name='mmap_fortran')
|
|
use iso_c_binding
|
|
character(c_char), intent(in) :: filename(*)
|
|
integer(c_size_t), intent(in), value :: length
|
|
integer(c_int), intent(out) :: fd
|
|
integer(c_int), intent(in), value :: read_only
|
|
end function
|
|
|
|
subroutine c_munmap_fortran(length, fd, map) bind(c,name='munmap_fortran')
|
|
use iso_c_binding
|
|
integer(c_size_t), intent(in), value :: length
|
|
integer(c_int), intent(in), value :: fd
|
|
type(c_ptr), intent(in), value :: map
|
|
end subroutine
|
|
|
|
subroutine c_msync_fortran(length, fd, map) bind(c,name='msync_fortran')
|
|
use iso_c_binding
|
|
integer(c_size_t), intent(in), value :: length
|
|
integer(c_int), intent(in), value :: fd
|
|
type(c_ptr), intent(in), value :: map
|
|
end subroutine
|
|
|
|
end interface
|
|
|
|
contains
|
|
|
|
subroutine mmap(filename, shape, bytes, fd, read_only, map)
|
|
use iso_c_binding
|
|
implicit none
|
|
character*(*), intent(in) :: filename ! Name of the mapped file
|
|
integer*8, intent(in) :: shape(:) ! Shape of the array to map
|
|
integer, intent(in) :: bytes ! Number of bytes per element
|
|
logical, intent(in) :: read_only ! If true, mmap is read-only
|
|
integer, intent(out) :: fd ! File descriptor
|
|
type(c_ptr), intent(out) :: map ! C Pointer
|
|
|
|
integer(c_size_t) :: length
|
|
integer(c_int) :: fd_
|
|
|
|
integer :: i
|
|
|
|
length = int(bytes,8)
|
|
do i=1,size(shape)
|
|
length = length * shape(i)
|
|
enddo
|
|
|
|
if (read_only) then
|
|
map = c_mmap_fortran( trim(filename)//char(0), length, fd_, 1)
|
|
else
|
|
map = c_mmap_fortran( trim(filename)//char(0), length, fd_, 0)
|
|
endif
|
|
fd = fd_
|
|
end subroutine
|
|
|
|
subroutine munmap(shape, bytes, fd, map)
|
|
use iso_c_binding
|
|
implicit none
|
|
integer*8, intent(in) :: shape(:) ! Shape of the array to map
|
|
integer, intent(in) :: bytes ! Number of bytes per element
|
|
integer, intent(in) :: fd ! File descriptor
|
|
type(c_ptr), intent(in) :: map ! C pointer
|
|
|
|
integer(c_size_t) :: length
|
|
integer(c_int) :: fd_
|
|
|
|
integer :: i
|
|
|
|
length = int(bytes,8)
|
|
do i=1,size(shape)
|
|
length = length * shape(i)
|
|
enddo
|
|
fd_ = fd
|
|
call c_munmap_fortran( length, fd_, map)
|
|
end subroutine
|
|
|
|
subroutine msync(shape, bytes, fd, map)
|
|
use iso_c_binding
|
|
implicit none
|
|
integer*8, intent(in) :: shape(:) ! Shape of the array to map
|
|
integer, intent(in) :: bytes ! Number of bytes per element
|
|
integer, intent(in) :: fd ! File descriptor
|
|
type(c_ptr), intent(in) :: map ! C pointer
|
|
|
|
integer(c_size_t) :: length
|
|
integer(c_int) :: fd_
|
|
|
|
integer :: i
|
|
|
|
length = int(bytes,8)
|
|
do i=1,size(shape)
|
|
length = length * shape(i)
|
|
enddo
|
|
fd_ = fd
|
|
call c_msync_fortran( length, fd_, map)
|
|
end subroutine
|
|
|
|
end module mmap_module
|
|
|
|
|