LCOV - code coverage report
Current view: top level - src - sockets_interface.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 0.0 % 51 0
Test Date: 2025-12-04 06:27:48 Functions: 0.0 % 8 0

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Implements UNIX and INET sockets
      10              : !> \par History
      11              : !>      08.2023 moved here and expanded for AS module by S. Battaglia
      12              : !>      03.2012 created by MC in ipi_driver.F
      13              : !> \author M. Ceriotti
      14              : ! **************************************************************************************************
      15              : 
      16              : MODULE sockets_interface
      17              : 
      18              :    USE ISO_C_BINDING,                   ONLY: C_CHAR,&
      19              :                                               C_DOUBLE,&
      20              :                                               C_INT,&
      21              :                                               C_LOC,&
      22              :                                               C_PTR
      23              :    USE kinds,                           ONLY: dp
      24              : #include "./base/base_uses.f90"
      25              : 
      26              :    IMPLICIT NONE
      27              :    PRIVATE
      28              : 
      29              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'sockets_interface'
      30              : 
      31              : #ifndef __NO_SOCKETS
      32              :    PUBLIC :: writebuffer, readbuffer, open_connect_socket, &
      33              :              uwait, open_bind_socket, listen_socket, &
      34              :              accept_socket, close_socket, remove_socket_file
      35              : 
      36              :    INTERFACE writebuffer
      37              :       MODULE PROCEDURE writebuffer_s, &
      38              :          writebuffer_d, writebuffer_dv, &
      39              :          writebuffer_i
      40              : 
      41              :    END INTERFACE
      42              : 
      43              :    INTERFACE readbuffer
      44              :       MODULE PROCEDURE readbuffer_s, &
      45              :          readbuffer_dv, readbuffer_d, &
      46              :          readbuffer_i
      47              : 
      48              :    END INTERFACE
      49              : 
      50              :    INTERFACE
      51              :       SUBROUTINE uwait(sec) BIND(C, NAME="uwait")
      52              :          USE ISO_C_BINDING, ONLY: C_DOUBLE
      53              :       REAL(C_DOUBLE)                                     :: sec
      54              : 
      55              :       END SUBROUTINE uwait
      56              :    END INTERFACE
      57              : 
      58              :    INTERFACE
      59              :       SUBROUTINE open_connect_socket(psockfd, inet, port, host) BIND(C)
      60              :          IMPORT
      61              :          INTEGER(KIND=C_INT)                      :: psockfd, inet, port
      62              :          CHARACTER(KIND=C_CHAR), DIMENSION(*)     :: host
      63              : 
      64              :       END SUBROUTINE open_connect_socket
      65              : 
      66              :       SUBROUTINE open_bind_socket(psockfd, inet, port, host) BIND(C)
      67              :          IMPORT
      68              :          INTEGER(KIND=C_INT)                      :: psockfd, inet, port
      69              :          CHARACTER(KIND=C_CHAR), DIMENSION(*)     :: host
      70              : 
      71              :       END SUBROUTINE open_bind_socket
      72              : 
      73              :       SUBROUTINE listen_socket(psockfd, backlog) BIND(C)
      74              :          IMPORT
      75              :          INTEGER(KIND=C_INT)                      :: psockfd, backlog
      76              : 
      77              :       END SUBROUTINE listen_socket
      78              : 
      79              :       SUBROUTINE accept_socket(psockfd, pclientfd) BIND(C)
      80              :          IMPORT
      81              :          INTEGER(KIND=C_INT)                      :: psockfd, pclientfd
      82              : 
      83              :       END SUBROUTINE accept_socket
      84              : 
      85              :       SUBROUTINE close_socket(psockfd) BIND(C)
      86              :          IMPORT
      87              :          INTEGER(KIND=C_INT)                      :: psockfd
      88              : 
      89              :       END SUBROUTINE close_socket
      90              : 
      91              :       SUBROUTINE remove_socket_file(host) BIND(C)
      92              :          IMPORT
      93              :          CHARACTER(KIND=C_CHAR), DIMENSION(*)     :: host
      94              : 
      95              :       END SUBROUTINE remove_socket_file
      96              : 
      97              :       SUBROUTINE writebuffer_csocket(psockfd, pdata, plen) BIND(C, name="writebuffer")
      98              :          IMPORT
      99              :          INTEGER(KIND=C_INT)                      :: psockfd
     100              :          TYPE(C_PTR), VALUE                       :: pdata
     101              :          INTEGER(KIND=C_INT)                      :: plen
     102              : 
     103              :       END SUBROUTINE writebuffer_csocket
     104              : 
     105              :       SUBROUTINE readbuffer_csocket(psockfd, pdata, plen) BIND(C, name="readbuffer")
     106              :          IMPORT
     107              :          INTEGER(KIND=C_INT)                      :: psockfd
     108              :          TYPE(C_PTR), VALUE                       :: pdata
     109              :          INTEGER(KIND=C_INT)                      :: plen
     110              : 
     111              :       END SUBROUTINE readbuffer_csocket
     112              :    END INTERFACE
     113              : #endif
     114              : 
     115              : CONTAINS
     116              : 
     117              : #ifndef __NO_SOCKETS
     118              : ! **************************************************************************************************
     119              : !> \brief ...
     120              : !> \param psockfd ...
     121              : !> \param fdata ...
     122              : ! **************************************************************************************************
     123            0 :    SUBROUTINE writebuffer_d(psockfd, fdata)
     124              :       INTEGER, INTENT(IN)                                :: psockfd
     125              :       REAL(KIND=dp), INTENT(IN)                          :: fdata
     126              : 
     127              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'writebuffer_d'
     128              : 
     129              :       INTEGER                                            :: handle
     130              :       REAL(KIND=C_DOUBLE), TARGET                        :: cdata
     131              : 
     132            0 :       CALL timeset(routineN, handle)
     133              : 
     134            0 :       cdata = fdata
     135            0 :       CALL writebuffer_csocket(psockfd, c_loc(cdata), 8)
     136              : 
     137            0 :       CALL timestop(handle)
     138            0 :    END SUBROUTINE writebuffer_d
     139              : 
     140              : ! **************************************************************************************************
     141              : !> \brief ...
     142              : !> \param psockfd ...
     143              : !> \param fdata ...
     144              : ! **************************************************************************************************
     145            0 :    SUBROUTINE writebuffer_i(psockfd, fdata)
     146              :       INTEGER, INTENT(IN)                                :: psockfd, fdata
     147              : 
     148              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'writebuffer_i'
     149              : 
     150              :       INTEGER                                            :: handle
     151              :       INTEGER(KIND=C_INT), TARGET                        :: cdata
     152              : 
     153            0 :       CALL timeset(routineN, handle)
     154              : 
     155            0 :       cdata = fdata
     156            0 :       CALL writebuffer_csocket(psockfd, c_loc(cdata), 4)
     157              : 
     158            0 :       CALL timestop(handle)
     159            0 :    END SUBROUTINE writebuffer_i
     160              : 
     161              : ! **************************************************************************************************
     162              : !> \brief ...
     163              : !> \param psockfd ...
     164              : !> \param fstring ...
     165              : !> \param plen ...
     166              : ! **************************************************************************************************
     167            0 :    SUBROUTINE writebuffer_s(psockfd, fstring, plen)
     168              :       INTEGER, INTENT(IN)                                :: psockfd
     169              :       CHARACTER(LEN=*), INTENT(IN)                       :: fstring
     170              :       INTEGER, INTENT(IN)                                :: plen
     171              : 
     172              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'writebuffer_s'
     173              : 
     174              :       INTEGER                                            :: handle, i
     175            0 :       CHARACTER(LEN=1, KIND=C_CHAR), TARGET              :: cstring(plen)
     176              : 
     177            0 :       CALL timeset(routineN, handle)
     178              : 
     179            0 :       DO i = 1, plen
     180            0 :          cstring(i) = fstring(i:i)
     181              :       END DO
     182            0 :       CALL writebuffer_csocket(psockfd, c_loc(cstring(1)), plen)
     183              : 
     184            0 :       CALL timestop(handle)
     185              : 
     186            0 :    END SUBROUTINE writebuffer_s
     187              : 
     188              : ! **************************************************************************************************
     189              : !> \brief ...
     190              : !> \param psockfd ...
     191              : !> \param fdata ...
     192              : !> \param plen ...
     193              : ! **************************************************************************************************
     194            0 :    SUBROUTINE writebuffer_dv(psockfd, fdata, plen)
     195              :       INTEGER, INTENT(IN)                                :: psockfd, plen
     196              :       REAL(KIND=dp), INTENT(IN), TARGET                  :: fdata(plen)
     197              : 
     198              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'writebuffer_dv'
     199              : 
     200              :       INTEGER                                            :: handle
     201              : 
     202            0 :       CALL timeset(routineN, handle)
     203              : 
     204            0 :       CALL writebuffer_csocket(psockfd, c_loc(fdata(1)), 8*plen)
     205              : 
     206            0 :       CALL timestop(handle)
     207            0 :    END SUBROUTINE writebuffer_dv
     208              : 
     209              : ! **************************************************************************************************
     210              : !> \brief ...
     211              : !> \param psockfd ...
     212              : !> \param fdata ...
     213              : ! **************************************************************************************************
     214            0 :    SUBROUTINE readbuffer_d(psockfd, fdata)
     215              :       INTEGER, INTENT(IN)                                :: psockfd
     216              :       REAL(KIND=dp), INTENT(OUT)                         :: fdata
     217              : 
     218              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'readbuffer_d'
     219              : 
     220              :       INTEGER                                            :: handle
     221              :       REAL(KIND=C_DOUBLE), TARGET                        :: cdata
     222              : 
     223            0 :       CALL timeset(routineN, handle)
     224              : 
     225            0 :       CALL readbuffer_csocket(psockfd, c_loc(cdata), 8)
     226            0 :       fdata = cdata
     227              : 
     228            0 :       CALL timestop(handle)
     229            0 :    END SUBROUTINE readbuffer_d
     230              : 
     231              : ! **************************************************************************************************
     232              : !> \brief ...
     233              : !> \param psockfd ...
     234              : !> \param fdata ...
     235              : ! **************************************************************************************************
     236            0 :    SUBROUTINE readbuffer_i(psockfd, fdata)
     237              :       INTEGER, INTENT(IN)                                :: psockfd
     238              :       INTEGER, INTENT(OUT)                               :: fdata
     239              : 
     240              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'readbuffer_i'
     241              : 
     242              :       INTEGER                                            :: handle
     243              :       INTEGER(KIND=C_INT), TARGET                        :: cdata
     244              : 
     245            0 :       CALL timeset(routineN, handle)
     246              : 
     247            0 :       CALL readbuffer_csocket(psockfd, c_loc(cdata), 4)
     248            0 :       fdata = cdata
     249              : 
     250            0 :       CALL timestop(handle)
     251            0 :    END SUBROUTINE readbuffer_i
     252              : 
     253              : ! **************************************************************************************************
     254              : !> \brief ...
     255              : !> \param psockfd ...
     256              : !> \param fstring ...
     257              : !> \param plen ...
     258              : ! **************************************************************************************************
     259            0 :    SUBROUTINE readbuffer_s(psockfd, fstring, plen)
     260              :       INTEGER, INTENT(IN)                                :: psockfd
     261              :       CHARACTER(LEN=*), INTENT(OUT)                      :: fstring
     262              :       INTEGER, INTENT(IN)                                :: plen
     263              : 
     264              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'readbuffer_s'
     265              : 
     266              :       INTEGER                                            :: handle, i
     267            0 :       CHARACTER(LEN=1, KIND=C_CHAR), TARGET              :: cstring(plen)
     268              : 
     269            0 :       CALL timeset(routineN, handle)
     270              : 
     271            0 :       CALL readbuffer_csocket(psockfd, c_loc(cstring(1)), plen)
     272            0 :       fstring = ""
     273            0 :       DO i = 1, plen
     274            0 :          fstring(i:i) = cstring(i)
     275              :       END DO
     276              : 
     277            0 :       CALL timestop(handle)
     278              : 
     279            0 :    END SUBROUTINE readbuffer_s
     280              : 
     281              : ! **************************************************************************************************
     282              : !> \brief ...
     283              : !> \param psockfd ...
     284              : !> \param fdata ...
     285              : !> \param plen ...
     286              : ! **************************************************************************************************
     287            0 :    SUBROUTINE readbuffer_dv(psockfd, fdata, plen)
     288              :       INTEGER, INTENT(IN)                                :: psockfd, plen
     289              :       REAL(KIND=dp), INTENT(OUT), TARGET                 :: fdata(plen)
     290              : 
     291              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'readbuffer_dv'
     292              : 
     293              :       INTEGER                                            :: handle
     294              : 
     295            0 :       CALL timeset(routineN, handle)
     296              : 
     297            0 :       CALL readbuffer_csocket(psockfd, c_loc(fdata(1)), 8*plen)
     298              : 
     299            0 :       CALL timestop(handle)
     300              : 
     301            0 :    END SUBROUTINE readbuffer_dv
     302              : #endif
     303              : 
     304              : END MODULE sockets_interface
        

Generated by: LCOV version 2.0-1