58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
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
 |