timeout(9F)




NAME

     timeout - execute a function after  a  specified  length  of
     time


SYNOPSIS

     #include <sys/types.h>
     #include <sys/conf.h>

     timeout_id_t  timeout(void  (*  func)(void  *),  void  *arg,
     clock_t  ticks);


INTERFACE LEVEL

     Architecture independent level 1 (DDI/DKI).


PARAMETERS

     func  Kernel function to  invoke  when  the  time  increment
           expires.

     arg   Argument to the function.

     ticks Number of clock ticks to wait before the  function  is
           called.  Use  drv_usectohz(9F) to convert microseconds
           to clock ticks.


DESCRIPTION

     The timeout() function schedules the specified  function  to
     be  called  after  a specified time interval. The exact time
     interval over which  the  timeout  takes  effect  cannot  be
     guaranteed, but the value given is a close approximation.

     The function called by timeout() must  adhere  to  the  same
     restrictions as a driver soft interrupt handler.

     The function called by timeout() is run in interrupt context
     and must not sleep or call other functions that might sleep.

     The delay(9F) function calls timeout(). Because timeout() is
     subject  to priority inversion, drivers waiting on behalf of
     processes   with   real-time    constraints    should    use
     cv_timedwait(9F) rather than delay().


RETURN VALUES

     timeout() returns an opaque non-zero timeout identifier that
     can be passed to untimeout(9F) to cancel the request.


CONTEXT

     timeout() can be called from user or interrupt context.


EXAMPLES

     Example 1: Using timeout()

     In the following example, the device driver has issued an IO
     request  and  is  waiting  for the device to respond. If the
     device does not respond within 5 seconds, the device  driver
     will print out an error message to the console.

     static void
     xxtimeout_handler(void *arg)
     {
             struct xxstate *xsp = (struct xxstate *)arg;
             mutex_enter(&xsp->lock);
             cv_signal(&xsp->cv);
             xsp->flags |= TIMED_OUT;
             mutex_exit(&xsp->lock);
             xsp->timeout_id = 0;
     }
     static uint_t
     xxintr(caddr_t arg)
     {
             struct xxstate *xsp = (struct xxstate *)arg;
              .
              .
              .
             mutex_enter(&xsp->lock);
             /* Service interrupt */
             cv_signal(&xsp->cv);
             mutex_exit(&xsp->lock);
             if (xsp->timeout_id != 0) {
                     (void) untimeout(xsp->timeout_id);
                     xsp->timeout_id = 0;
             }
             return(DDI_INTR_CLAIMED);
     }
     static void
     xxcheckcond(struct xxstate *xsp)
     {
              .
              .
              .
             xsp->timeout_id = timeout(xxtimeout_handler,
                 xsp, (5 * drv_usectohz(1000000)));
             mutex_enter(&xsp->lock);
             while (/* Waiting for interrupt  or timeout*/)
                     cv_wait(&xsp->cv, &xsp->lock);
             if (xsp->flags & TIMED_OUT)
                     cmn_err(CE_WARN, "Device not responding");
              .
              .
              .
             mutex_exit(&xsp->lock);
              .
              .
              .

     }


SEE ALSO

     bufcall(9F), cv_timedwait(9F), ddi_in_panic(9F),  delay(9F),
     drv_usectohz(9F), untimeout(9F)

     Writing Device Drivers


Man(1) output converted with man2html