File: timer_C_wrapper.f90

package info (click to toggle)
js8call 2.2.0%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 22,416 kB
  • sloc: cpp: 563,285; f90: 9,265; ansic: 937; python: 132; sh: 93; makefile: 6
file content (57 lines) | stat: -rw-r--r-- 1,723 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
module timer_c_wrapper
  use :: iso_c_binding, only: c_ptr
  use timer_module, only: timer, null_timer
  implicit none

  !
  ! C interoperable callback setup
  !
  abstract interface
     subroutine c_timer_callback (context, dname, k)
       use, intrinsic :: iso_c_binding, only: c_ptr, c_char
       implicit none
       type(c_ptr), value, intent(in) :: context
       character(c_char), intent(in) :: dname(*)
       integer, intent(in), value :: k
     end subroutine c_timer_callback
  end interface

  public :: init, fini

  private

  !
  ! the following are singleton items which assumes that any timer
  ! implementation should only assume one global instance, probably a
  ! struct or class object whose address is stored the context below
  !
  type(c_ptr), private :: the_context
  procedure(C_timer_callback), pointer, private :: the_callback

contains
  subroutine timer_callback_wrapper (dname, k)
    use, intrinsic :: iso_c_binding, only: c_null_char
    implicit none
    character(len=8), intent(in) :: dname
    integer, intent(in) :: k
    call the_callback (the_context, trim (dname) // c_null_char, k)
  end subroutine timer_callback_wrapper

  subroutine init (context, callback)
    use, intrinsic :: iso_c_binding, only: c_ptr, c_funptr, c_f_procpointer
    use iso_c_utilities, only: c_to_f_string
    use timer_module, only: timer
    implicit none
    type(c_ptr), value, intent(in) :: context
    type(c_funptr), value, intent(in) :: callback
    the_context=context
    call c_f_procpointer (callback, the_callback)
    timer => timer_callback_wrapper
  end subroutine init

  subroutine fini ()
    implicit none
    timer => null_timer
  end subroutine fini

end module timer_c_wrapper