Previous: , Up: linux timerfd   [Index]


7.7.3 Usage examples of the timerfd API

The following program watches a timer as time goes by:

#!r6rs
(import (vicare)
  (vicare platform constants)
  (only (vicare language-extensions syntaxes)
        unwind-protect)
  (prefix (vicare posix) px.)
  (prefix (vicare linux) lx.))

(set-port-buffer-mode! (current-output-port)
                       (buffer-mode none))

(define (%print-remaining-time fd)
  (pretty-print (lx.struct-itimerspec-it_value
                 (lx.timerfd-gettime fd))))

(define (%sleep-one-second)
  (px.nanosleep 1 0))

(let ((fd (lx.timerfd-create CLOCK_REALTIME)))
  (unwind-protect
      (let ( ;; one event every 3 seconds
            (period (lx.make-struct-timespec 3 0))
            ;; the first event after 1 nanosecond
            (offset (lx.make-struct-timespec 0 1)))
        (lx.timerfd-settime fd 0
           (lx.make-struct-itimerspec period offset))
        (do ((i 0 (fx+ 1 i)))
            ((fx= i 6))
          (%print-remaining-time fd)
          (%sleep-one-second))
        #f)
    (px.close fd)))

the output is:

#["struct-timespec" tv_sec=2 tv_nsec=999911022]
#["struct-timespec" tv_sec=1 tv_nsec=999307638]
#["struct-timespec" tv_sec=0 tv_nsec=998303788]
#["struct-timespec" tv_sec=2 tv_nsec=997338092]
#["struct-timespec" tv_sec=1 tv_nsec=996393490]
#["struct-timespec" tv_sec=0 tv_nsec=995418649]

The following example prints the number of timer expirations:

#!r6rs
(import (vicare)
  (vicare platform constants)
  (only (vicare language-extensions syntaxes)
        unwind-protect)
  (prefix (vicare posix) px.)
  (prefix (vicare linux) lx.))

(set-port-buffer-mode! (current-output-port)
                       (buffer-mode none))
(define fd
  (lx.timerfd-create CLOCK_REALTIME TFD_NONBLOCK))
(unwind-protect
    (begin
      ;; 0.3 seconds = 300 ms = 300,000 us = 300,000,000 ns
      (define nsecs  300000000)
;;;                 9876543210
      (lx.timerfd-settime fd 0
        (lx.make-struct-itimerspec
         ;; one event every 0.3 seconds
         (lx.make-struct-timespec 0 nsecs)
         ;; the first event after 1 nanosecond
         (lx.make-struct-timespec 0 1)))
      (printf "right after starting timer: ~a\n"
        (lx.timerfd-read fd))
      (px.nanosleep 1 0)
      (printf "after 1 second: ~a\n"
        (lx.timerfd-read fd))
      (px.nanosleep 0 nsecs)
      (printf "after 0.3 seconds: ~a\n"
        (lx.timerfd-read fd)))
  (px.close fd))

the output is:

right after starting timer: 1
after 1 second: 3
after 0.3 seconds: 1

we notice that right after starting the timer: the number of expirations is 1 because the timer starts 1 nanosecond after the call to timerfd-settime, which is almost immediately.


Previous: , Up: linux timerfd   [Index]